C# 具有可选UPN后缀的独立用户帐户

C# 具有可选UPN后缀的独立用户帐户,c#,.net,impersonation,winlogon,upn,C#,.net,Impersonation,Winlogon,Upn,我们有一个域名boo.com,还有人定义了一个可选的UPN后缀bc。有一个帐户被创建为foo@bc。我需要模拟该帐户才能连接到SQL Server 我就是这么做的: [DllImport("advapi32.dll", SetLastError = true)] public static extern bool LogonUser(String lpszUsername, String lpszDomain,

我们有一个域名boo.com,还有人定义了一个可选的UPN后缀bc。有一个帐户被创建为foo@bc。我需要模拟该帐户才能连接到SQL Server

我就是这么做的:

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

LogonUser( 
    "foo",//foo@bc
    "boo.com",//"@bc"
     "Password",
     (int)LogonType.LOGON32_LOGON_INTERACTIVE,//(int)LogonType.LOGON32_LOGON_SERVICE,//(int)LogonType.LOGON32_LOGON_NEW_CREDENTIALS,//(int)LogonType.LOGON32_LOGON_NETWORK,//
     (int)LogonProvider.LOGON32_PROVIDER_DEFAULT,//(int)LogonProvider.LOGON32_PROVIDER_WINNT50,//
     ref m_Token);
...
模拟似乎有效-LogonUser(…)成功,但我的脚本没有正确的访问权限。根据参数的组合,我得到

System.IO.FileLoadException:文件名:'System.Data

在Sysinternals进程监视器中,我可以看到“错误模拟”错误

或者,如果我玩LogonType和LogonProvider

System.Data.SqlClient.SqlException:'登录失败。登录名来自不受信任的域,不能与Windows身份验证一起使用。”

有没有办法模拟使用可选UPN后缀定义的广告帐户

哦,如果我在“foo”帐户下运行,一切正常,这意味着foo拥有它所需要的所有访问权限。很遗憾,我需要从另一个服务帐户运行


谢谢你

通过反复试验,这对我来说是有效的:

LogonUser( 
"foo@bc",//username with suffix
 NULL,   //domain
 "Password",
 (int)LogonType.LOGON32_LOGON_NEW_CREDENTIALS, //logon type
 (int)LogonProvider.LOGON32_PROVIDER_DEFAULT,
 ref m_Token);

Console.WriteLine("Current user: " + WindowsIdentity.GetCurrent().Name);
//John Doe - person running the app

WindowsIdentity identity = new WindowsIdentity(m_Token);
identity.Impersonate();

Console.WriteLine("Current user: " + WindowsIdentity.GetCurrent().Name);
//still John Doe!! NOT foo@bc

//database access successful (Integrated Security)
出人意料地

WindowsIdentity.GetCurrent().Name

返回模拟前后运行应用程序的帐户名。但无论如何,对数据库的访问是被授予的