LogonUser, использующий LOGON32_LOGON_NEW_CREDENTIALS, работает на удаленном домене с ненадежным доменом - PullRequest
3 голосов
/ 27 мая 2010

Таким образом, между двумя машинами нет доверия - они находятся в разных доменах.

Я успешно подключился к удаленной машине, используя LogonUser API, используя тип входа, LOGON32_LOGON_NEW_CREDENTIALS . Я могу получить содержимое каталога, используя общий ресурс UNC, и создать поток файлов для его загрузки. Пока все хорошо.

Единственная проблема заключается в том, что, по-видимому, LogonUser дает сбой, если нет уже открытого сеанса. Позвольте мне уточнить это.

Я обнаружил, что страница ASP.NET MVC не работала сегодня утром, в частности страница, которая получает список файлов с этого удаленного компьютера с помощью LogonUser. Я просматриваю журнал и вижу в стеке трассировки System.IO .__ Error.WinIOError выше Directory.GetFiles вызов. Затем я переместился на веб-сервер и попытался открыть удаленную папку в проводнике, используя тот же логин / пароль, который использовался веб-сайтом. Это прошло, и я мог видеть файлы. Я открыл командную строку, набрал net use и увидел, что существует открытое соединение с удаленным компьютером. Затем я вернулся на страницу, и вдруг страница снова работает.

Итак, на данный момент, я не совсем уверен, работает ли LogonUser должным образом или нет. Если вызов требует, чтобы сетевое соединение было сначала открыто другими способами, то это, безусловно, не является удовлетворительным.

Кто-нибудь знает, что может происходить или предлагает обходной путь?

Ответы [ 2 ]

1 голос
/ 27 мая 2010

Я не уверен, что понимаю, почему вы используете LogonUser. Эта функция поможет вам, если вы хотите выполнить какую-либо работу на локальной машине с другими учетными данными пользователя, но она не позволяет установить удаленное соединение с другим компьютером.

Если вы хотите получить некоторую информацию с удаленного компьютера независимо от существующего доверия к компьютеру, вам следует использовать функции WNet или Net (Network Management), чтобы установить новое соединение с удаленным компьютером. Поэтому вы должны использовать WNetAddConnection2 (см. http://msdn.microsoft.com/en-us/library/aa385413%28VS.85%29.aspx) или NetUseAdd (http://msdn.microsoft.com/en-us/library/aa370645%28VS.85%29.aspx) функции. Эта функция сделает удаленный вход в систему на конечном компьютере и установит новый сеанс ( что делать net use \\computer\share /u:domain\user password). Вы не можете сопоставить новое соединение с локальным диском. Для этого необходимо заполнить lpLocalName NULL в структуре NETRESOURCE. Как lpUsername и lpPassword вы должны указать любые значения, которые понимают конечный компьютер. Вы также можете использовать ipc$ в качестве имени общего ресурса назначения, затем просто установить сеанс связи с компьютером и ничего более. После этого вы можете использовать любые другие функции для доступа к удаленному поделиться, каталог или файлы. Чтобы закрыть сеанс, вы должны использовать WNetCancelConnection2 или NetUseDel.

0 голосов
/ 11 февраля 2016

Это как вы LogonUser на удаленном компьютере. Убедитесь, что вы используете LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50. Затем выдать себя за маркер. Вы должны быть в состоянии сделать много удаленных вещей таким образом без WNetAddConnection2. WNetAddConnection2 не очень хорош, потому что соединение может быть разрушено многими вещами. LogonUser также установит соответствующее соединение при необходимости несколькими вызовами API.

PXERR impersonate_user(LPCWSTR lpszUserName, LPCWSTR lpszDomain, LPCWSTR lpszPassword)
{
    HANDLE token;

    if(!LogonUserW(lpszUserName, lpszDomain, lpszPassword, LOGON32_LOGON_NEW_CREDENTIALS, LOGON32_PROVIDER_WINNT50, &token))
    {
        return PXERR_IMPERSONATION_FAILURE;
    }

    if(!ImpersonateLoggedOnUser(token))
    {
        CloseHandle(token);
        RevertToSelf();
        return PXERR_IMPERSONATION_FAILURE;
    }

    CloseHandle(token);

    return PXERR_SUCCESS;
}
...