DsGetDcName 以及如何"attempt to use the domain controller"



在我的程序中,我调用DsGetDcName来获取域控制器。

微软的DsGetDcName文档是这样写的:

默认情况下,此函数不会确保返回的域控制器当前可用。相反,调用者应该尝试以使用返回的域控制器。

我无法将域控制器ping到"使用域控制器">因为防火墙可能打开

所以,我的问题是…我该如何"尝试使用返回的域控制器">

#include <Windows.h>
#include <DsGetDC.h>
#include <wchar.h>
#pragma comment(lib, "NetApi32.lib")
int main()
{
PDOMAIN_CONTROLLER_INFOW pdci{};
ULONG flags = DS_DIRECTORY_SERVICE_REQUIRED;
DWORD dwRet = DsGetDcNameW(NULL, NULL, NULL, NULL, flags, &pdci);
wprintf(L"%sn", pdci->DomainControllerName);
}

我认为你之所以得到域控制器的名称,是因为你想用它做点什么。所以,只要做你要做的事情就行了。你不需要做任何特别的事情。

这句话只是一个警告,当你的代码第一次做一些会联系DC的事情时,你应该处理DC不活动的情况。在这种情况下,您可以按照文档中的说明进行操作:

如果域控制器不可用,调用方应再次调用DsGetDcName函数,指定DS_FORCE_REDISCOVERY标志。

然后您可以使用该新DC重试。

现实地说,这将是一个非常罕见的情况。DS_FORCE_REDISCOVERY标志的文档说明了原因:

如果未指定DS_FORCE_REDISCOVERY标志,DsGetDcName可能会返回缓存的域控制器数据。

因此,如果计算机已经使用特定DC,则DsGetDcName将返回该DC,而不检查它是否仍然可用。这意味着,实际上,DsGetDcName返回无法联系的DC的唯一时间是,如果DC突然无法联系,这可能是网络问题,甚至DC正在退役。

相关内容

最新更新