ADsGetObject函数需要很长时间才能返回

在用户身份验证过程中,我正在进行ADsGetObject函数调用,该函数至少需要15秒才能返回。我的机器中有近20个组。调用堆栈如下。延迟的原因是什么?

00fcc230 77215ccc 7548179c 000005f9 00000000 ntdll!KiFastSystemCallRet
00fcc234 7548179c 000005f9 00000000 00000000 ntdll!NtWaitForSingleObject+0xc
00fcc2a0 7706efa3 000005f9 ffffffff 00000000 KERNELBASE!WaitForSingleObjectEx+0x98
00fcc2b8 7682c1bf 000005f9 ffffffff 00000000 kernel32!WaitForSingleObjectExImplementation+0x75
00fcc2d0 7682c179 00000000 ffffffff 000003e5 RPCRT4!UTIL_WaitForSyncIO+0x1c
00fcc2ec 7682d488 00000000 00fcc30c 00000000 RPCRT4!UTIL_GetOverlappedResultEx+0x62
00fcc314 7682c0f1 001978c0 0000005c 00238348 RPCRT4!NMP_SyncSendRecv+0xb6
00fcc340 7682ce5d 00238228 0000005c 00fcc464 RPCRT4!OSF_CCONNECTION::TransSendReceive+0xc5
00fcc3c4 7682cdc9 00197790 001a9478 0024e9a8 RPCRT4!OSF_CCONNECTION::SendFragment+0x295
00fcc420 7682cb39 00000018 00000000 ffffffff RPCRT4!OSF_CCALL::SendNextFragment+0x302
00fcc474 7682ca56 0024e9a8 00fcc50c 00fcc4b4 RPCRT4!OSF_CCALL::FastSendReceive+0x239
00fcc494 7682c9df 00fcc4b4 00fcc50c 00fcc538 RPCRT4!OSF_CCALL::SendReceiveHelper+0x55
00fcc4bc 7683c1fc 00238360 00fcc538 00fcc538 RPCRT4!OSF_CCALL::SendReceive+0x43
00fcc4d0 7683c6cf 00fcc50c 74ab1c60 00000001 RPCRT4!I_RpcSendReceive+0x29
00fcc4e4 7683c69d 00fcc538 002383a4 00fcc538 RPCRT4!NdrSendReceive+0x31
00fcc4f4 76895744 7d52523d 00000000 00000000 RPCRT4!NdrpSendReceive+0xc
00fcc90c 74ab5096 74ab1c60 74ab45de 00fcc92c RPCRT4!NdrClientCall2+0x1a6
00fcc924 74ab4d7d 00000000 00000000 00000000 LOGONCLI!DsrGetDcNameEx2+0x19
00fcc998 74ab4cc8 00000000 00000000 00000000 LOGONCLI!DsGetDcNameWithAccountW+0x17e
00fcc9c0 69b49029 00000000 0024f560 00000000 LOGONCLI!DsGetDcNameW+0x20
00fcc9fc 69b48f85 0024f560 00fcca30 00000000 adsnt!DsGetDcNameNTWrapper+0x5c
00fcca3c 69b49207 0024f560 00000001 00fccf04 adsnt!WinNTGetCachedObject+0x26e
00fcced0 69b4557e 0024f560 00fccf00 00fccf04 adsnt!WinNTGetCachedName+0x11a
00fcd988 69b41ddd 00fcd9a0 00fcda48 00fcda38 adsnt!HeuristicGetObject+0x110
00fcda14 69b41cc6 0022d67c 00fcda48 00fcda38 adsnt!GetObjectW+0x1a4
00fcda64 69b41c77 001bb080 0022d67c 00fcdafc adsnt!CWinNTProvider::ResolvePathName+0x3e
00fcda80 76e2cba7 00232a30 001bb080 0022d67c adsnt!CWinNTProvider::ParseDisplayName+0x26
00fcdacc 76e2cad6 001bb080 0022d67c 00fcdafc ole32!FindClassMoniker+0x8b
00fcdb04 6f1535c9 001bb080 0022d67c 00fcdb28 ole32!MkParseDisplayName+0xbb
00fcdb3c 6f1534db 0022d67c 00aa2d68 00fcdb84 ACTIVEDS!GetObjectW+0x117
00fcdb54 007d5ec7 0022d67c 00aa2d68 00fcdb84 ACTIVEDS!ADsGetObject+0x15
0
额外
意见: 1
最后它的工作与否?你能给出更多的背景吗?
额外 作者 JPBlanc,
请你提供更多背景信息?代码行,客户端计算机的情况。
额外 作者 JPBlanc,
它正在工作,但需要很长时间才能返回。
额外 作者 sarat,

1 答案

Use Process Monitor to find out what's taking so long. Probably a timeout of some sort. You will see it in the event log. Maybe you get an interesting case like Mark with his slow logons ;)

0
额外
谢谢你的回答。我发现这个调用栈阻止了操作。我想我也会从Process Monitor得到同样的东西。但这种阻碍的原因是问题。
额外 作者 sarat,
我找到了原因,在许多情况下,域/用户名不存在。在发现域中不存在此类用户时,返回错误需要时间!
额外 作者 sarat,
您不仅可以获得调用堆栈,还可以获取磁盘,注册表和设备活动,函数调用参数和函数结果。当然,这是在黑暗中拍摄的,但也许你在那里找到了一些东西。
额外 作者 Heinrich Ulbricht,
很酷:)或不。取决于解决的难易程度。
额外 作者 Heinrich Ulbricht,