使用备用 UPN 后缀强制用户帐户



我们有一个域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);
...

模拟似乎有效 - 登录用户(...(成功,但我的脚本没有适当的访问权限。根据参数的组合,我得到

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

在系统内部进程监视器中,我可以看到"不良模拟">错误。

或者,如果我玩 LogonType 和 LogonProvider

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

有没有办法模拟使用备用 UPN 后缀定义的 AD 帐户?

哦,如果我从"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((.名字

返回在模拟之前和之后运行应用的帐户名。但无论如何都会授予对数据库的访问权限。

最新更新