Функция LogonUserW (winbase.h)
Функция LogonUser пытается войти пользователя на локальный компьютер. Локальный компьютер — это компьютер, с которого был вызван LogonUser. Вы не можете использовать LogonUser для входа на удаленный компьютер. Укажите пользователя с именем пользователя и доменом и пройти проверку подлинности пользователя с помощью пароля открытого текста. Если функция выполнена успешно, вы получите дескриптор маркера, представляющего пользователя, вошедшего в систему. Затем этот дескриптор маркера можно использовать для олицетворения указанного пользователя или, в большинстве случаев, для создания процесса, который выполняется в контексте указанного пользователя.
Синтаксис
BOOL LogonUserW(
[in] LPCWSTR lpszUsername,
[in, optional] LPCWSTR lpszDomain,
[in, optional] LPCWSTR lpszPassword,
[in] DWORD dwLogonType,
[in] DWORD dwLogonProvider,
[out] PHANDLE phToken
);
Параметры
[in] lpszUsername
Указатель на строку, завершающуюся значением NULL, которая указывает имя пользователя. Это имя учетной записи пользователя для входа. Если используется формат имени субъекта-пользователя (UPN), user@DNSDomainName, параметр lpszDomain должен быть NULL.
[in, optional] lpszDomain
Указатель на строку, завершающую значение NULL, которая указывает имя домена или сервера, база данных учетной записи которой содержит lpszUsername учетной записи. Если этот параметр NULL, имя пользователя должно быть указано в формате имени участника-пользователя. Если этот параметр имеет значение ".", функция проверяет учетную запись с помощью только локальной базы данных учетной записи.
[in, optional] lpszPassword
Указатель на строку, завершающуюся значением NULL, которая указывает пароль обычного текста для учетной записи пользователя, указанной lpszUsername. По завершении использования пароля снимите пароль из памяти, вызвав функцию SecureZeroMemory. Дополнительные сведения о защите паролей см. в обработке паролей.
[in] dwLogonType
Тип выполняемой операции входа. Этот параметр может быть одним из следующих значений, определенных в Winbase.h.
Ценность | Значение |
---|---|
|
Этот тип входа предназначен для пакетных серверов, где процессы могут выполняться от имени пользователя без прямого вмешательства. Этот тип также предназначен для серверов с более высокой производительностью, которые обрабатывают много попыток проверки подлинности с открытым текстом за раз, таких как почта или веб-серверы. |
|
Этот тип входа предназначен для пользователей, которые будут интерактивно использовать компьютер, например пользователь, вошедший в систему с помощью сервера терминала , удаленной оболочки или аналогичного процесса. Этот тип входа имеет дополнительные расходы на кэширование сведений о входе в систему для отключенных операций; таким образом, оно не подходит для некоторых клиентских и серверных приложений, таких как почтовый сервер. |
|
Этот тип входа предназначен для высокопроизводительных серверов для проверки подлинности паролей с открытым текстом. Функция LogonUser не кэширует учетные данные для этого типа входа. |
|
Этот тип входа сохраняет имя и пароль в пакете проверки подлинности , что позволяет серверу подключаться к другим сетевым серверам при олицетворении клиента. Сервер может принимать учетные данные обычного текста от клиента, вызывать LogonUser, проверять, что пользователь может получить доступ к системе через сеть и по-прежнему взаимодействовать с другими серверами. |
|
Этот тип входа позволяет вызывающему объекту клонировать текущий маркер и указывать новые учетные данные для исходящих подключений. Новый сеанс входа имеет тот же локальный идентификатор, но использует разные учетные данные для других сетевых подключений.
Этот тип входа поддерживается только поставщиком входа в систему LOGON32_PROVIDER_WINNT50. Примечание. По состоянию на январь 2023 года невозможно использовать тип входа LOGON32_LOGON_NEW_CREDENTIALS с учетной записью управляемой службы группы (gMSA). |
|
Указывает вход типа службы. У учетной записи, предоставленной, должна быть включена привилегия службы. |
|
GINA больше не поддерживаются.
Windows Server 2003 и Windows XP: этот тип входа предназначен для библиотек DLL GINA, которые будут выполнять вход пользователей, которые будут интерактивно использовать компьютер. Этот тип входа может создать уникальную запись аудита, показывающую, когда рабочая станция была разблокирована. |
[in] dwLogonProvider
Указывает поставщика входа. Этот параметр может быть одним из следующих значений.
[out] phToken
Указатель на переменную дескриптора, которая получает дескриптор маркера, представляющего указанного пользователя.
Возвращаемый дескриптор можно использовать в вызовах функции ImpersonateLoggedOnUser.
В большинстве случаев возвращенный дескриптор является основным маркером, который можно использовать в вызовах функции CreateProcessAsUser. Однако если указать флаг LOGON32_LOGON_NETWORK,
Если этот дескриптор больше не нужен, закройте его, вызвав функцию CloseHandle.
Возвращаемое значение
Если функция выполнена успешно, функция возвращает ненулевое значение.
Если функция завершается ошибкой, она возвращает ноль. Чтобы получить расширенные сведения об ошибке, вызовите GetLastError.
Замечания
Тип входа LOGON32_LOGON_NETWORK самый быстрый, но он имеет следующие ограничения:
- Функция возвращает маркер олицетворения , а не основной маркер. Этот маркер нельзя использовать непосредственно в функции CreateProcessAsUser. Однако можно вызвать функцию DuplicateTokenEx для преобразования маркера в первичный маркер, а затем использовать его в CreateProcessAsUser.
- Если вы преобразуете маркер в первичный маркер и используете его в CreateProcessAsUser для запуска процесса, новый процесс не может получить доступ к другим сетевым ресурсам, таким как удаленные серверы или принтеры, через перенаправитель. Исключением является то, что если сетевой ресурс не контролируется доступом, новый процесс сможет получить к нему доступ.
Для этой функции не требуется SE_TCB_NAME привилегии, если вы не войдете в учетную запись Passport.
Учетная запись, указанная lpszUsername, должна иметь необходимые права учетной записи. Например, чтобы войти в систему с помощью флага LOGON32_LOGON_INTERACTIVE, пользователь (или группа, к которой принадлежит пользователь), должен иметь право на SE_INTERACTIVE_LOGON_NAME учетную запись. Список прав учетной записи, влияющих на различные операции входа, см. в разделе константы прав учетной записи.
Пользователь считается вошедшего в систему, если существует хотя бы один маркер. Если вы вызываете CreateProcessAsUser, а затем закройте маркер, система считает, что пользователь по-прежнему вошел в систему до завершения процесса (и всех дочерних процессов).
Если вызов LogonUser выполнен успешно, система уведомляет поставщиков сети о том, что вход произошел путем вызова NPLogonNotify функции точки входа поставщика.
Примеры
Маркер LocalService можно создать с помощью следующего кода.
LogonUser(L"LocalService", L"NT AUTHORITY", NULL, LOGON32_LOGON_SERVICE, LOGON32_PROVIDER_DEFAULT, &hToken)
Заметка
Заголовок winbase.h определяет LogonUser как псевдоним, который автоматически выбирает версию ANSI или Юникод этой функции на основе определения константы препроцессора ЮНИКОДа. Сочетание использования псевдонима, нейтрального для кодирования, с кодом, не зависящим от кодирования, может привести к несоответствиям, которые приводят к ошибкам компиляции или среды выполнения. Дополнительные сведения см. в соглашениях о прототипах функций.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Windows XP [только классические приложения] |
минимальный поддерживаемый сервер | Windows Server 2003 [только классические приложения] |
целевая платформа | Виндоус |
заголовка | winbase.h (включая Windows.h) |
библиотеки |
Advapi32.lib |
DLL | Advapi32.dll |
См. также
управления доступом
функции управления доступом клиента или сервера