LogonUserExExW 函数

LogonUserExExW 函数尝试将用户登录到本地计算机。 本地计算机是从中调用 LogonUserExExW 的计算机。 不能使用 LogonUserExExW 登录到远程计算机。 使用用户名和域指定用户,并使用纯文本密码 对用户进行身份验证 。 如果函数成功,它将接收表示已登录用户的令牌的句柄。 然后,可以使用此令牌句柄模拟指定用户,或者在大多数情况下,创建在指定用户的上下文中运行 的进程

此函数类似于 LogonUserEx 函数,只不过它采用附加参数 pTokenGroups,pTokenGroups 是一组一个或多个 安全标识符 (SID) ,这些标识符在登录成功时添加到令牌中返回给调用方。

此函数未在公共标头中声明,并且没有关联的导入库。 必须使用 LoadLibraryGetProcAddress 函数动态链接到Advapi32.dll。

语法

BOOL WINAPI LogonUserExExW(
  _In_      LPTSTR        lpszUsername,
  _In_opt_  LPTSTR        lpszDomain,
  _In_opt_  LPTSTR        lpszPassword,
  _In_      DWORD         dwLogonType,
  _In_      DWORD         dwLogonProvider,
  _In_opt_  PTOKEN_GROUPS pTokenGroups,
  _Out_opt_ PHANDLE       phToken,
  _Out_opt_ PSID          *ppLogonSid,
  _Out_opt_ PVOID         *ppProfileBuffer,
  _Out_opt_ LPDWORD       pdwProfileLength,
  _Out_opt_ PQUOTA_LIMITS pQuotaLimits
);

parameters

lpszUsername [in]

指向以 null 结尾的字符串的指针,该字符串指定用户的名称。 这是要登录的用户帐户的名称。 如果使用 用户主体名称 (UPN) 格式, 则 lpszDomain 参数必须为 NULL

lpszDomain [in, 可选]

指向以 null 结尾的字符串的指针,该字符串指定其帐户数据库包含 lpszUsername 帐户的域或服务器的名称。 如果此参数为 NULL,则必须以 UPN 格式指定用户名。 如果此参数为“.”,则函数仅使用本地帐户数据库来验证帐户。

lpszPassword [in, optional]

指向以 null 结尾的字符串的指针,该字符串指定 由 lpszUsername 指定的用户帐户的纯文本密码。 使用完密码后,通过调用 SecureZeroMemory 函数从内存中清除密码。 有关保护密码的详细信息,请参阅 处理密码

dwLogonType [in]

要执行的登录操作的类型。 此参数的取值可为下列值之一:

含义
LOGON32_LOGON_INTERACTIVE
2
此登录类型适用于将以交互方式使用计算机的用户,例如,由 终端 服务器、远程 shell 或类似进程登录的用户。 对于断开连接的操作,此登录类型具有缓存登录信息的额外费用;因此,它不适合某些客户端/服务器应用程序,例如邮件服务器。
LOGON32_LOGON_NETWORK
3
此登录类型适用于对纯文本密码进行身份验证的高性能服务器。 LogonUserExExW 函数不缓存此登录类型的凭据。
LOGON32_LOGON_BATCH
4
此登录类型适用于批处理服务器,其中进程可能代表用户执行,而无需其直接干预。 此类型还适用于一次处理许多纯文本身份验证尝试的更高性能服务器,例如邮件或 Web 服务器。 LogonUserExExW 函数不缓存此登录类型的凭据。
LOGON32_LOGON_SERVICE
5
指示服务类型登录。 提供的帐户必须启用服务特权。
LOGON32_LOGON_UNLOCK
7
此登录类型适用于以交互方式使用计算机的登录用户的 GINA DLL。 此登录类型可以生成显示工作站解锁时间的唯一审核记录。
LOGON32_LOGON_NETWORK_CLEARTEXT
8
此登录类型保留 身份验证包中的名称和密码,使服务器能够在模拟客户端时连接到其他网络服务器。 服务器可以接受来自客户端的纯文本凭据,调用 LogonUserExExW,验证用户是否可以通过网络访问系统,并仍然与其他服务器通信。
LOGON32_LOGON_NEW_CREDENTIALS
9
此登录类型允许调用方克隆其当前令牌,并为出站连接指定新凭据。 新的登录会话具有相同的本地标识符,但对其他网络连接使用不同的凭据。
此登录类型仅受 LOGON32_PROVIDER_WINNT50 登录提供程序支持。

 

dwLogonProvider [in]

登录提供程序。 此参数的取值可为下列值之一:

含义
LOGON32_PROVIDER_DEFAULT
为系统使用标准登录提供程序。 默认 安全提供程序 为 NTLM。
LOGON32_PROVIDER_WINNT50
使用协商登录提供程序。
LOGON32_PROVIDER_WINNT40
使用 NTLM 登录提供程序。

 

pTokenGroups [in, optional]

指向 TOKEN_GROUPS 结构的指针,该结构指定添加到此函数成功登录后接收的令牌的组 SID 列表。 添加到令牌的任何 SID 也会影响组扩展。 例如,如果添加的 SID 是本地组的成员,则这些组也会添加到收到的访问令牌中。

如果此参数不为 NULL,则此函数的调用方必须授予并启用 SE_TCB_PRIVILEGE 特权。

phToken [out, 可选]

指向句柄变量的指针,该变量接收表示指定用户的令牌的句柄。

可以在调用 ImpersonateLoggedOnUser 函数时使用返回的句柄。

在大多数情况下,返回的句柄是可在调用 CreateProcessAsUser 函数时使用的主标记。 但是,如果指定LOGON32_LOGON_NETWORK标志,LogonUserExExExW 将返回无法在 CreateProcessAsUser 中使用的模拟令牌,除非调用 DuplicateTokenEx 将模拟令牌转换为主令牌。

如果不再需要此句柄,请通过调用 CloseHandle 函数将其关闭。

ppLogonSid [out, 可选]

指向接收已登录用户的 SID 的 SID 的指针的指针。

使用完 SID 后,通过调用 LocalFree 函数来释放它。

ppProfileBuffer [out, optional]

一个指针,指向一个指针,该指针接收包含登录用户的配置文件的缓冲区的地址。

pdwProfileLength [out, optional]

指向接收配置文件缓冲区长度的 DWORD 的指针。

pQuotaLimits [out, 可选]

指向 QUOTA_LIMITS 结构的指针,该结构接收有关已登录用户的配额信息。

返回值

如果函数成功,该函数将返回非零值。

如果函数失败,则返回零。 要获得更多的错误信息,请调用 GetLastError

备注

LOGON32_LOGON_NETWORK登录类型速度最快,但它具有以下限制:

  • 函数返回 模拟令牌,而不是主令牌。 不能直接在 CreateProcessAsUser 函数中使用此令牌。 但是,可以调用 DuplicateTokenEx 函数将令牌转换为主令牌,然后在 CreateProcessAsUser 中使用它。
  • 如果将令牌转换为主令牌并在 CreateProcessAsUser 中使用它来启动进程,则新进程无法通过重定向程序访问其他网络资源,如远程服务器或打印机。 例外情况是,如果网络资源不受访问控制,则新进程将能够访问它。

lpszUsername 指定的帐户必须具有必要的帐户权限。 例如,若要使用 LOGON32_LOGON_INTERACTIVE 标志登录用户,用户 (或用户所属) 组必须具有 SE_INTERACTIVE_LOGON_NAME 帐户权限。 有关影响各种登录操作的帐户权限的列表,请参阅 帐户对象访问权限

如果至少存在一个令牌,则认为用户已登录。 如果调用 CreateProcessAsUser 然后关闭令牌,则用户仍会登录,直到进程 (并且所有子进程) 结束。

如果提供了可选的 pTokenGroups 参数,则 LSA 不会自动添加本地 SID 或登录 SID。

要求

要求
最低受支持的客户端
Windows Vista [仅限桌面应用]
最低受支持的服务器
Windows Server 2008 [仅限桌面应用]
版本
LogonUserExExW 也可用于 Windows Server 2003 或 Windows XPth 常规分发版。
标头
Winbasep.h
DLL
Advapi32.dll

另请参阅

客户端/服务器访问控制

客户端/服务器访问控制函数

CloseHandle

CreateProcessAsUser

DuplicateTokenEx

ImpersonateLoggedOnUser

LogonUserEx

QUOTA_LIMITS