2015-01-08 12 views
6

私は自分のActive Directoryクライアントを学習しています。アカウントのロック解除やパスワードのリセットなどのコマンドを実行するには、自分の管理者アカウントとパスワードを入力し、WindowsIdentity.Impersonateを管理者アカウントとして実行する必要があります。私は私のプログラム全体で何度も使用されなければならないので、私は自分のパスワードを確保するための選択肢について疑問を抱いています。LogonUserでSecureStringを使用

私が理解するところでは、SecureStringを使用してパスワードを保存できます。しかし、私はWindowsIdentity.Impersonateを使用して、私は定期的にstringなくSecureString必要ですLogonUserからトークンを取得する必要があることを使用する必要があり、私の管理者アカウントとしてコードを実行します。

だから私はしなければならない。そして、後でとき、私入力

SecureString

  • クリアへの入力に変換

  • を起動時に

    1. ログイン仰角が必要な機能を実行したい:

      1. 以前SecureString

        stringから
      2. 作成した変換は、変換文字列をクリア

      3. LogonUsernull

      4. に変換された文字列を渡し、コマンドに

      5. Cを実行しますLogonUserオブジェクト

      これは正しいアプローチですか?それを使用するにはSecureStringstringに変換する必要があることは変だと思われます...私はそれを変換している間に目的を破り、パスワードをより脆弱にしているようです。

      EDIT:あなたがパスワードの代わりにIntPtrstringを使用するLogonUserを宣言する方法を変更、あなたのUserImpersonationクラスでのLogonUser

  • +1

    文字列に変換すると目的が無効になることは間違いありません。 UserImpersonationとは何ですか?それはWin32 APIに突き当たりますか?文字列ではなくIntPtrで渡す関数を変更する必要があります。 –

    +0

    申し訳ありませんが、私の質問を解決します。ええ、 'UserImpersonation'は私が以前に長い時間書いたクラスです...それは基本的に[LogonUser]のラッパーです(http://msdn.microsoft.com/en-us/library/windows/desktop/aa378184%28v= vs.85%29.aspx)は、パスワードの文字列も要求します。それは 'IntPtr'に変更できますか?その場合、代わりに 'SecureString'をパスワードパラメータに渡すことができますか?(今は試してみたいが、私はもはや仕事をしていない...) – duckwizzle

    +1

    いいえ、あなたは 'SecureString'を直接使うことはできませんが、安全にパスワードを渡すのは難しくありません。私は下に答えます... –

    答えて

    5

    の名前を修正しました。

    Marshal.SecureStringToGlobalAllocUnicodeのコードサンプルには、必要なものが正確に含まれています。関連するスニペットは次のとおりです。

    [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)] 
    internal static extern bool LogonUser(String username, String domain, 
                 IntPtr password, int logonType, 
                 int logonProvider, ref IntPtr token); 
    
    ... 
    
    IntPtr tokenHandle = IntPtr.Zero; 
    
    IntPtr passwordPtr = IntPtr.Zero; 
    
    try 
    { 
        // Marshal the SecureString to unmanaged memory. 
        passwordPtr = Marshal.SecureStringToGlobalAllocUnicode(password); 
    
        returnValue = LogonUser(userName, domainName, passwordPtr, 
              LOGON32_LOGON_INTERACTIVE, 
              LOGON32_PROVIDER_DEFAULT, ref tokenHandle); 
    
    } 
    finally 
    { 
        // Zero-out and free the unmanaged string reference. 
        Marshal.ZeroFreeGlobalAllocUnicode(passwordPtr); 
    
        // Close the token handle. 
        CloseHandle(tokenHandle); 
    } 
    
    +0

    パーフェクト!ありがとうございました! :) – duckwizzle

    +0

    @duckwizzleいいえ心配 –

    関連する問題