模拟登录有时需要很长时间.为什么?



我有一个应用程序在我的公司内部被几百个用户使用。它使用模拟用户从网络驱动器安全地访问文件存储库。

下面是我的WINAPI声明:
Private Declare Auto Function LogonUser Lib "advapi32.dll" (ByVal un As String, ByVal domain As String, ByVal pw As String, ByVal LogonType As Integer, ByVal LogonProvider As Integer, ByRef Token As IntPtr) As Boolean
Private Const LOGON32_LOGON_INTERACTIVE As Integer = 2
Private Const LOGON32_LOGON_NETWORK As Integer = 3
Private Const LOGON32_LOGON_BATCH As Integer = 4
Private Const LOGON32_LOGON_SERVICE As Integer = 5
Private Const LOGON32_LOGON_UNLOCK As Integer = 7
Private Const LOGON32_LOGON_NETWORK_CLEARTEXT As Integer = 8
Private Const LOGON32_LOGON_NEW_CREDENTIALS As Integer = 9
Private Const LOGON32_PROVIDER_DEFAULT As Integer = 0
Private Const LOGON32_PROVIDER_WINNT35 As Integer = 1
Private Const LOGON32_PROVIDER_WINNT40 As Integer = 2
Private Const LOGON32 _PROVIDER_WINNT50 As Integer = 3

这是我如何使用它…

pAccess = LogonUser(sSpecialUser, sDomain, sPW, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, pTokenHandle)

对于绝大多数用户,调用LogonUser需要<1秒。但对一些用户来说,通话需要6秒、20秒或120秒。这似乎取决于用户计算机所连接的本地网络段。

IT坚持"这是正常的"。执行登录有时需要很长时间。我认为这是"胡扯"。为什么?

因为如果我这样做:

pAccess = LogonUser(sCatalogUser, sDomain, sCatalogPW, LOGON32_LOGON_NETWORK_CLEARTEXT , LOGON32_PROVIDER_DEFAULT, pTokenHandle)

它立即返回成功,从任何计算机,在任何网段。

现在,使用LOGON32_LOGON_NETWORK_CLEARTEXT并没有给我访问网络文件系统的权限,所以它不好,但是,它确实表明这不是计算机WRT到AD服务器的网络拓扑问题,导致这个问题。

在执行模拟用户登录时,哪些因素会导致这种延迟?

谢谢你的建议。

更多信息:

部署应用程序的网络/计算机未连接到internet。

这种情况最近开始在一些以前没有发生过的计算机上发生。也许巧合的是,在缓慢登录开始发生之前的那个周末,这些机器上应用了一些windows更新。

答案是:使用LOGON32_LOGON_NEW_CREDENTIALS代替LOGON32_LOGON_INTERACTIVE。

文档:女士

此登录类型允许调用方克隆其当前令牌和为出站连接指定新凭证。新登录会话具有相同的本地标识符,但使用不同的凭据用于其他网络连接。

我做了一个实验性的应用程序来检查LogonUser的不同参数,当它得到一个有效的令牌时,检查是否能够使用模拟的身份将文件复制到一个受限制的文件夹中。LOGON32_LOGON_NEW_CREDENTIALS可以工作并且速度很快。

最新更新