大家好。
因此,使用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。