2011-10-10 12 views
9
WindowsIdentity identity = new WindowsIdentity(accessToken); 
WindowsImpersonationContext context = identity.Impersonate(); 

... 
context.Undo(); 

ここで、私はadministraotr UserNameとPassowrdを宣言しますか?ユーザー名とパスワードの偽装ですか?

accessToken paramはあまりにも私を助けていません...

は、私はそれのためにDLL'Sをインポートする必要がありますか?

答えて

22

あなたはユーザーのトークンを取得する必要があります。

[DllImport("advapi32.dll", SetLastError = true)] 
    public static extern bool LogonUser(
      string lpszUsername, 
      string lpszDomain, 
      string lpszPassword, 
      int dwLogonType, 
      int dwLogonProvider, 
      out IntPtr phToken); 

例:

IntPtr userToken = IntPtr.Zero; 

bool success = External.LogonUser(
    "john.doe", 
    "domain.com", 
    "MyPassword", 
    (int) AdvApi32Utility.LogonType.LOGON32_LOGON_INTERACTIVE, //2 
    (int) AdvApi32Utility.LogonProvider.LOGON32_PROVIDER_DEFAULT, //0 
    out userToken); 

if (!success) 
{ 
    throw new SecurityException("Logon user failed"); 
} 

using (WindowsIdentity.Impersonate(userToken)) 
{ 
    // do the stuff with john.doe's credentials 
} 
+0

がパスワードなしでそうする方法はあるのAdvapi32.dllからLogonUserを呼び出す/ Pを使用しますか?私は偽装の直前に作成しているので、私はそれにアクセスできます。 – Doug

+2

私は 'CloseHandle'(' LogonUser'のための[docs](https://msdn.microsoft.com/en-us/library/windows/desktop/aa378184(v = vs.85)に記載) .aspx))を使用ブロックの後の 'userToken'に置き換えます。または、これはWindowsIdentityによって何らかの形で呼び出されていますか? – CodeFox

+0

こんにちは、これはASP.NETアプリケーションの場合は、どのような範囲ですか? すべてのページでこの関数を呼び出す必要がありますか? –

2

LogonUser() APIをP /呼び出しする必要があります。それはユーザー名、ドメイン、パスワードを受け取り、トークンを返します。

5

あなたが使用しなければならない正確なアクセス権。それを得るには、LogonUserメソッドを呼び出す必要があります:

私はちょうどここにVB.netコードを持っていることに気づいていません。 C#で、それを想像し、ここc#

外部メソッド宣言で) :

Private Declare Auto Function LogonUser Lib "advapi32.dll" (ByVal lpszUsername As [String], _ 
ByVal lpszDomain As [String], ByVal lpszPassword As [String], _ 
ByVal dwLogonType As Integer, ByVal dwLogonProvider As Integer, _ 
ByRef phToken As IntPtr) As Boolean 

と実行:

_Token = New IntPtr(0) 

Const LOGON32_PROVIDER_DEFAULT As Integer = 0 
'This parameter causes LogonUser to create a primary token. 
Const LOGON32_LOGON_INTERACTIVE As Integer = 2 
Const LOGON32_LOGON_NEWCREDENTIALS As Integer = 9 

_Token = IntPtr.Zero 

' Call LogonUser to obtain a handle to an access token. 
Dim returnValue As Boolean = LogonUser(_User, _Domain, _Password, LOGON32_LOGON_NEWCREDENTIALS, LOGON32_PROVIDER_DEFAULT, _Token) 

If False = returnValue Then 
    Dim ret As Integer = Marshal.GetLastWin32Error() 
    Console.WriteLine("LogonUser failed with error code : {0}", ret) 
    Throw New System.ComponentModel.Win32Exception(ret) 
End If 

_Identity = New WindowsIdentity(_Token) 
_Context = _Identity.Impersonate()