web-dev-qa-db-ja.com

Windowsでログインしているユーザーのユーザー名/パスワードを取得する

Windowsで現在ログインしているユーザーの名前とパスワードを取得するためのAPIはありますか?

前もって感謝します。

10
dennisV

パスワード:いいえ、これはセキュリティ上の理由から保持されません。使用されてから破棄されます。このユーザーの暗号化されたパスワードをレジストリから取得し、十分な権限を与えてから、 レインボーテーブル のようなものを使用して復号化できますが、現在の方法では非常にリソースを消費し、時間がかかります。ユーザーにプロンプ​​トを表示する方がはるかに優れています。

または、Novellのように何らかの「シングルサインオン」システムを実装する場合は、GINA(pre-Vista)または資格情報プロバイダー(Vista)のいずれかを介して実装する必要があります。これにより、コードにユーザー名が付与されます。ログイン時のパスワード。パスワードが利用できるのはこのときだけです。

ユーザー名の場合、currentユーザー名(コードを実行しているユーザー)を取得するのは簡単です。AdvApi32.dllのGetUserName関数がまさにこれを行います。

サービスとして実行している場合は、「ログインしたユーザー」がいないことを覚えておく必要があります。LocalSystem、NetworkService、SYSTEM、その他のアカウントなど、実際のユーザーに加えて、いつでも複数のユーザーがいます。 この記事はいくつかのサンプルコードとドキュメントを提供します それを行うために。

29

現在ログインしているユーザーのパスワードを明かすことはできないと考える多くのコメント投稿者については、 ログインしているユーザーのクリアテキストパスワードをダンプする の使用方法を示しています mimikatz それを行うには:

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
4
Miles Wolbe

それが可能であれば、それは大きなセキュリティ上の欠陥だと思います!

4
Chii

暗号化されているため、ユーザーのパスワードを取得することはできません(パスワードをプレーンテキストで保存しないのが標準的な方法であることは言うまでもありません)。

ユーザー名を取得するには、 GetUserName または NPGetUser を使用できます。

4
MrValdez

それがどのように行われるかに注意してください、しかし http://www.nirsoft.net/utils/network_password_recovery.html の「ネットワークパスワード回復」ツールはいくつかのキャッシュからパスワードを取得しているようです。

4
reva

GetUserNameは名前を取得しますが、パスワードは取得できません。これは、Windowsが保存するものではなく、AFAIKです。パスワードのハッシュのみです。

達成しようとしていることによっては(もう少し教えてください..)、ログオンしているユーザーになりすまして、そのユーザーに代わって作業を行うことができます。

2
Assaf Lavie

Windows APIでの認証の詳細については、MSDNを参照してください。 http://msdn.Microsoft.com/en-us/library/aa374735(VS.85).aspx

2
Ged Byrne

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パッケージTeamFoundationExtendedClientを使用して、2015年と比較してこれを「コンソール」アプリとしてコンパイルしました。

1
John Henckel

再「ネットワークパスワード回復」ツール
Windows(XPまで)は、古いスタイルのlanmanagerネットワーク共有に接続するために、より簡単に解読しやすい暗号化を使用してpasswdのコピーを保存します。ツールは通常、これに対して可能なすべてのパスワードを試します。Rainbowテーブル(辞書の単語の事前に計算された暗号化バージョン)を使用すると、これが高速化されます。

XPsp2/3 Vistaでは、この機能は削除されています。新しい暗号化は解読がはるかに難しく、考えられるすべての値を試すのに何時間もかかります。多数のマシンで暗号化を実行して、価格の迅速な回答を提供するオンラインサービスがあります。

元のポスターに答えるには、通常、パスワードを保存してユーザーが入力したものと比較することはありません。入力したパスワードを暗号化(実際にはハッシュ)して保存します。パスワードを確認するには、ユーザーが入力したものすべてに対して同じ暗号化を実行し、それを比較します。通常、暗号化されたフォームから実際のパスワードに戻すことはできません。

[〜#〜] edit [〜#〜]ここで間違った質問をしているのではないかと思います-なぜパスワードが必要なのか、何をいつ確認しようとしているのですか?

0
Martin Beckett

GetUserName()を使用してユーザー名を取得することはできますが、パスワードを取得することはできません。これはダミー101のセキュリティに違反します。

0
Mike Thompson