2009-08-07 13 views
0

VB.NET 2008 WinFormsアプリケーションでユーザーを「偽装する」必要があるため、アプリケーションは誰に関係なく、PC上の任意のユーザーのActive Directoryログインを受け入れることができます。 Windowsに実際にログインしています。私はアプリケーションのMy.Userを、アプリケーションにログインした人のADアカウントにします。私は、次のコードで、このことに成功しました:"偽装された"ユーザーがSQL Server 2000に伝播しない

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 

Const LOGON32_LOGON_INTERACTIVE As Long = 2 
Const LOGON32_LOGON_NETWORK As Long = 3 

Const LOGON32_PROVIDER_DEFAULT As Long = 0 
Const LOGON32_PROVIDER_WINNT35 As Long = 1 
Const LOGON32_PROVIDER_WINNT40 As Long = 2 
Const LOGON32_PROVIDER_WINNT50 As Long = 3 


' Influenced from the example at http://aspalliance.com/39 
Public Shared Function Login(ByVal uid As String, ByVal pwd As String) As Boolean 

    ' Get the user's domain name. 
    Dim domainName As String = My.User.Name.Substring(0, My.User.Name.IndexOf("\")) 

    ' This token is returned by the LogonUser API call (variable is passed ByRef). 
    Dim token As IntPtr 

    If LogonUser(uid, domainName, pwd, LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, token) Then 

     ' Added this line per response to this question: 
     WindowsIdentity.Impersonate(token) 

     ' If the login succeeds, then impersonate that user by changing CurrentPrincipal. 
     Dim wi As New Principal.WindowsIdentity(token) 
     Dim wp As New Principal.WindowsPrincipal(wi) 

     My.User.CurrentPrincipal = wp 
     Return True 

    Else 
     Return False 
    End If 

End Function 

をただし、アプリケーションがSQL Server 2000に接続しているデータアクセス層で.DLLを使用していますそれは、「統合セキュリティ= SSPI」を使用して、SQL Serverのように見えます接続文字列内で、WinFormsのアプリケーションコードと.DLLのアプリケーションコードの両方でコードをステップ実行するときに、My.User.CurrentPrincipal.Identityを返すアカウントではなく、Windowsにログインしているアカウントのログインを受信して​​います。

WinFormsアプリケーションと.DLLコードは、Windowsではなく、アプリケーションにログインしているアカウントとしてMy.User.CurrentPrincipal.Identityを正しく認識します。それはSQL Serverに伝播していないだけです。これは、SUSER_SNAME()をT-SQLのテーブルの列に書き込むストアドプロシージャによって示されます。

誰かが間違っているのを見ることができますか?

EDIT:述べたように、私はラインWindowsIdentity.Impersonate(token)を追加しましたが、私の.DLLは、SQL Serverの接続を作成しようとすると、今では、このエラーがスローされます。

Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.

+0

解決済みですか? – eych

答えて

1

あなたはWindowsIdentity.Impersonate();を呼び出す必要があります:

If LogonUser(...) Then    
    WindowsIdentity.Impersonate(token) 
+0

私は上記の行を追加しましたが、上記の編集した質問に記載されているように、例外がスローされています。 – HardCode

+0

これは、あなたが真に偽装していることを意味します。偽装されたユーザーがデータベースによって認証されなかった理由を調べる必要があります。ほとんどの場合、データベースで信頼されていないドメイン(おそらくローカルユーザー)のユーザーを偽装している可能性があります。 –

関連する問題