使用LOGON32_LOGON_NEW_CREDENTIALS的LogonUser不适用于同一域上的远程域计算机

时间:2019-02-26 06:54:34

标签: c# winforms authentication dns windows-authentication

大家好。

因此,使用LOGONUSER在我的登录屏幕上模拟输入的用户时遇到了问题。我想模拟一个用户,以便我可以访问同一域中另一台服务器上的数据库。我可以ping数据库服务器,也可以在运行的服务器上安装MSSQL,并且可以通过身份验证远程访问数据库服务器,而不会出现问题。当我使用我的工具执行上述操作时,问题就来了,我的工具只是模拟用户并连接到数据库。

但是我得到“登录失败。登录来自不受信任的域,无法与Windows身份验证一起使用。” 错误。问题是它是同一个域。当我直接将工具放到DB服务器中时,我可以访问数据库,但是从其他服务器运行该工具时,会出现上述错误。

请注意,我使用Windows身份验证连接字符串。

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

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    private extern static bool CloseHandle(IntPtr handle);

    private static IntPtr tokenHandle = new IntPtr(0);
    private static WindowsImpersonationContext impersonatedUser;


    [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
    public bool Impersonate(string user, string password)
    {
        if (user.Contains('\\'))
        {
            string data = user;
            // Split string on spaces (this will separate all the words).
            string[] userdetails = data.Split('\\');
            string domainName = "LDAP\\:" + userdetails[0];
            string userName = userdetails[1];

            try
            {



                // Use the unmanaged LogonUser function to get the user token for
                // the specified user, domain, and password.
                const int LOGON32_PROVIDER_DEFAULT = 0;

                // Passing this parameter causes LogonUser to create a primary token.
                const int LOGON32_LOGON_INTERACTIVE = 2;
                const int LOGON32_LOGON_NEW_CREDENTIALS = 9;
                const int LOGON32_LOGON_NETWORK = 8;
                tokenHandle = IntPtr.Zero;

                // Step -1 Call LogonUser to obtain a handle to an access token.
                bool returnValue = LogonUser(
                    userName,
                    domainName,
                    password,
                    LOGON32_LOGON_NEW_CREDENTIALS,
                    LOGON32_PROVIDER_DEFAULT,
                    ref tokenHandle);         // tokenHandle - new security token

                if (false == returnValue)
                {
                    int ret = Marshal.GetLastWin32Error();
                    MessageBox.Show("LogonUser call failed with error code : " +
                        ret);
                    throw new System.ComponentModel.Win32Exception(ret);

                }

                WindowsIdentity newId = new WindowsIdentity(tokenHandle);

                impersonatedUser = newId.Impersonate();
                return true;

            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception occurred. " + ex.Message);
                return false;
            }
        }
        else
        {
            MessageBox.Show(@"Please specify domain\machine name");
            return false;
        }

    }


    /// <summary>
    /// Stops impersonation
    /// </summary>
    public void Undo()
    {
        impersonatedUser.Undo();
        // Free the tokens.
        if (tokenHandle != IntPtr.Zero)
            CloseHandle(tokenHandle);
    }
}

有人知道这可能是什么问题吗?。
另请注意,这不是针对网站,而是针对WINFORMS。

0 个答案:

没有答案