繁体   English   中英

"DsGetDcName 以及如何“尝试使用域控制器”"

[英]DsGetDcName and how to "attempt to use the domain controller"

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

Microsoft 的 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"%s\n", pdci->DomainControllerName);
}

我假设您获得域控制器的名称是因为您想用它做一些事情。 所以只要做你想做的事。 你不需要做任何特别的事情。

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

如果域控制器不可用,调用者应再次调用DsGetDcName<\/strong>函数,并指定DS_FORCE_REDISCOVERY<\/strong>标志。

然后你可以用那个新的 DC 再试一次。

实际上,这将是非常<\/em>罕见的情况。 DS_FORCE_REDISCOVERY<\/code>标志的文档<\/a>解释了原因:

当未指定DS_FORCE_REDISCOVERY<\/strong>标志时, DsGetDcName<\/strong>可能会返回缓存的域控制器数据。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM