Windowsでログインしているユーザーのユーザー名/パスワードを取得する
-
02-07-2019 - |
質問
Windowsで現在ログインしているユーザーの名前とパスワードを取得するAPIはありますか?
よろしくお願いします。
解決
パスワード:いいえ、これはセキュリティ上の理由から保持されません。使用された後、破棄されます。十分な権限があれば、このユーザーの暗号化されたパスワードをレジストリから取得し、次のようなものを使用して復号化できます。 レインボーテーブル, しかし、現在の方法を使用すると、非常にリソースと時間がかかります。ユーザーにプロンプトを表示するほうがはるかに良いでしょう。
あるいは、Novell のように何らかの「シングル サインオン」システムを実装したい場合は、GINA (Vista 以前) または資格情報プロバイダー (Vista) を介して実装する必要があり、その結果、コードにユーザー名が与えられます。およびログイン時のパスワード。パスワードが使用できるのはこのときだけです。
ユーザー名については、 現在 ユーザー名 (コードを実行しているユーザー) は簡単です。AdvApi32.dll の GetUserName 関数は、まさにこれを実行します。
サービスとして実行している場合は、「ログイン ユーザー」が存在しないことに注意する必要があります。実際のユーザーに加えて、LocalSystem、NetworkService、SYSTEM、その他のアカウントなど、常に複数のアカウントが存在します。 この記事では、サンプル コードとドキュメントをいくつか紹介します。 それをするために。
他のヒント
もしそれが可能であれば、それは重大なセキュリティ上の欠陥だと思います。
ユーザーのパスワードは暗号化されているため、取得することはできません (パスワードを平文で保存しないのが標準的な方法であることは言うまでもありません)。
ユーザー名を取得するには、次を使用できます ユーザー名を取得する または NPGetUser
その方法を確認してください。ただし、「Network Password Recovery」ツールは次のとおりです。 http://www.nirsoft.net/utils/network_password_recovery.html どうやらキャッシュからパスワードを取得しているようです。
現在ログインしているユーザーのパスワードを明らかにすることは不可能だと考えている多くのコメント投稿者については、以下を参照してください。 ログインしているユーザーの平文パスワードをダンプします 使い方を示しています ミミカッツ まさにそれを行うには:
mimikatz # privilege::debug
Demande d'ACTIVATION du privilège : SeDebugPrivilege : OK
mimikatz # sekurlsa::logonPasswords full
...
Utilisateur principal : user
Domaine d'authentification : domain
kerberos :
* Utilisateur : user
* Domaine : domain
* Mot de passe : pass
GetUserName は名前を取得しますが、パスワードは取得できません。私の知る限り、これは Windows に保存されるものでもありません。パスワードのハッシュにすぎません。
達成しようとしている内容に応じて (もう少し詳しく教えてください。)、ログオンしているユーザーになりすまして、そのユーザーに代わって何かを実行することが可能です。
Windows API での認証の詳細については、MSDN を参照してください。http://msdn.microsoft.com/en-us/library/aa374735(VS.85).aspx
Windowsのログインパスワードが分かりません...ただし、資格情報マネージャーからプレーンテキストのパスワードを取得することは間違いなく可能です。たとえば、TFS のパスワードを取得するプログラムを次に示します。ほとんどの場合、これは Windows ログインと同じです。
namespace ShowPassword
{
using Microsoft.TeamFoundation.Client;
using System;
using System.Net;
class Program
{
static void Main(string[] args)
{
var tpc = new TfsTeamProjectCollection(new Uri("http://mycompany.com/tfs"));
var nc = tpc.Credentials as NetworkCredential;
Console.WriteLine("the password is " + nc.Password);
}
}
}
これを、Nuget パッケージ TeamFoundation ExtendedClient を使用して、vs 2015 の下で「コンソール」アプリとしてコンパイルしました。
GetUserName() を使用してユーザー名を取得できますが、パスワードは取得できません。これはダミー 101 のセキュリティに違反することになります。
「ネットワークパスワード回復ツール」について
Windows (XP まで) は、古いスタイルの lanmanager ネットワーク共有に接続するために、より単純で解読しやすい暗号化を使用してパスワードのコピーを保存します。ツールは通常、これに対して考えられるすべてのパスワードを試し、レインボー テーブル (辞書の単語の事前計算された暗号化バージョン) を使用することでこれを高速化します。
XPsp2/3 Vista では、この機能は削除されています。新しい暗号化は解読がはるかに難しく、考えられるすべての値を試すには何時間もかかりますが、多数のマシンで暗号化を実行して、価格を抑えてすぐに答えを提供してくれるオンライン サービスがあります。
元の投稿者に回答する場合、通常はパスワードを保存せず、ユーザーが入力した内容と比較します。入力したパスワードを暗号化(実際にはハッシュ)して保存します。パスワードを確認するには、ユーザーが入力したものに対して同じ暗号化を実行し、それを比較します。通常、暗号化されたフォームから実際のパスワードに戻すことは不可能です。
編集 ここであなたは間違った質問をしているのではないかと思います。なぜパスワードが必要なのか、何をいつ確認しようとしているのですか?