LogonUser

【勇芳软件工作室】汉化HomePreviousNext

LogonUser功能尝试执行用户登录操作。您指定具有用户名和域的用户,并使用明文密码对用户进行身份验证。如果函数成功,您将收到一个代表登录用户的令牌的句柄。然后,您可以使用此令牌句柄模拟指定的用户,或者在大多数情况下,创建在指定用户的上下文中运行的进程。

BOOL LogonUser(

LPTSTR 【lpszUsername】,//指定用户名的字符串
LPTSTR【lpszDo mainhu】,//指定域或服务器的字符串
LPTSTR【lpszPassword】,//指定密码的字符串
DWORD【dwLogonType】,//指定登录操作的类型
DWORD【dwLogonProvider】,//指定登录提供者
PHANDLE【phToken】//指向变量的指针,以接收令牌句柄
); 

参数

【lpszUsername】

指向指定用户名的空终止字符串的指针。这是要登录的用户帐户的名称。

【lpszDo mainhu】

指向指定要登录到的域或服务器的以空值终止的字符串的指针。如果此参数为“。”,LogonUser仅在本地帐户数据库中搜索【lpszUsername】中指定的帐户。如果此参数为NULL,则LogonUser搜索本地帐户数据库,然后搜索受信任的域帐户数据库,直到找到【lpszUsername】帐户或搜索没有找到帐户名称。

【lpszPassword】

指向由【lpszUsername】指定的用户帐户的明文密码的以空字符结尾的字符串。

【dwLogonType】

指定要执行的登录操作的类型。定义了以下登录类型:

含义
LOGON32_LOGON_BATCH此登录类型适用于批处理服务器,其中进程可能在没有直接干预的情况下代表用户执行;或用于一次处理许多明文身份验证尝试(如邮件或Web服务器)的更高性能的服务器。LogonUser不会缓存此登录类型的凭据。
LOGON32_LOGON_INTERACTIVE此登录类型适用于将以交互方式使用计算机的用户,例如终端服务器,远程shell或类似进程登录的用户。此登录类型具有用于断开连接操作的缓存登录信息的额外费用,因此不适用于某些客户端/服务器应用程序(如邮件服务器)。
LOGON32_LOGON_SERVICE表示服务类型登录。所提供的帐户必须启用服务权限。
LOGON32_LOGON_NETWORK此登录类型用于高性能服务器验证明文密码。LogonUser不会缓存此登录类型的凭据。这是最快的登录路径,但有两个限制。

首先,该函数返回一个模拟令牌,而不是主令牌。您不能直接在CreateProcessAsUser函数中使用此令牌。但是,您可以调用DuplicateTokenEx函数将令牌转换为主令牌,然后在CreateProcessAsUser中使用它。

其次,如果将令牌转换为主令牌并在CreateProcessAsUser中使用它来启动进程,则新进程将无法通过重定向器访问其他网络资源,例如远程服务器或打印机。


【dwLogonProvider】

指定登录提供者。定义了以下登录提供程序:

含义
LOGON32_PROVIDER_DEFAULT使用标准登录提供程序。这是【dwLogonProvider】的建议值。它给予应用程序与Windows NT的未来版本的最大向上兼容性。

【phToken】

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

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

在大多数情况下,返回的句柄是您可以在调用CreateProcessAsUser函数时使用的主令牌。但是,如果您指定了LOGON32_LOGON_NETWORK标志,LogonUser将返回您不能在CreateProcessAsUser中使用的模拟令牌,除非您调用DuplicateTokenEx将其转换为主令牌。

当您不再需要此句柄时,通过调用CloseHandle函数关闭它。

返回值

如果函数成功,返回值不为零。

如果函数失败,返回值为零。要获取扩展错误信息,请调用GetLastError.

备注

调用LogonUser的过程必须具有SE_TCB_NAME特权。该特权不需要启用。LogonUser功能根据需要启用该权限。如果呼叫进程没有SE_TCB_NAME特权,该函数将失败,GetLastError返回错误代码ERROR_PRIVILEGE_NOT_HELD。有关权限的更多信息,请参阅特权.

只要存在至少一个令牌,就会考虑登录用户。如果调用CreateProcessAsUser然后关闭令牌,系统会将用户视为仍然登录,直到进程(以及所有子进程)都已结束。

如果LogonUser呼叫成功,系统通过调用提供商的NPLogonNotify入口点通知网络提供商登录。

也可以看看

CreateProcessAsUser, ImpersonateLoggedOnUser