Добрый день всем.
Итак, у меня возникла проблема с использованием LOGONUSER для олицетворения введенного пользователя на моем экране входа в систему.Я хочу выдать себя за пользователя, чтобы получить доступ к базе данных на другом сервере в том же домене.Я могу пропинговать сервер БД, я также установил MSSQL на свой работающий сервер и могу без проблем выполнять аутентификацию на сервере БД.проблема возникает, когда я использую свой инструмент для выполнения вышеуказанного, мой инструмент просто олицетворяет пользователя и подключается к БД.
, но я получаю "сбой входа в систему. Вход в систему из ненадежного домена и не можетиспользовать с аутентификацией Windows. " ошибка.проблема в том, что это тот же домен.Когда я перетаскиваю инструмент непосредственно на сервер БД, я могу получить доступ к базе данных, но при запуске инструмента с другого сервера я получаю вышеуказанную ошибку.
Обратите внимание, что я использую строку подключения для проверки подлинности 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.