【问题标题】:Impesonate user account with alternative UPN suffix使用替代 UPN 后缀模拟用户帐户
【发布时间】:2020-02-05 23:57:34
【问题描述】:

我们有一个域 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(...) 成功,但我的脚本没有适当的访问权限。根据参数的组合,我得到 ​​p>

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

在 Sysinternals Process Monitor 中,我可以看到 “BAD IMPERSONATION” 错误。

或者,如果我使用 LogonType 和 LogonProvider

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

是否有任何方法可以模拟使用替代 UPN 后缀定义的 AD 帐户?

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

谢谢!!!

【问题讨论】:

    标签: c# .net impersonation winlogon upn


    【解决方案1】:

    通过反复试验,这对我有用:

    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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      • 2020-06-18
      • 2015-02-26
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      相关资源
      最近更新 更多