LogonUser, использующий LOGON32_LOGON_NEW_CREDENTIALS, не работает с машиной удаленного домена в том же домене - PullRequest
0 голосов
/ 26 февраля 2019

Добрый день всем.

Итак, у меня возникла проблема с использованием 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.

...