【问题标题】:How to programmatically find the domain controller/primary domain controller?如何以编程方式查找域控制器/主域控制器?
【发布时间】:2014-04-18 04:59:31
【问题描述】:

我想知道如何使用 Win32 API 在正在运行的应用程序中确定运行该应用程序的 Windows 工作站或服务器的域控制器/主域控制器。

特别是,给定一台机器的主机名,我想找到将该主机名解析到特定机器的权威来源的名称。 (我认为那是域控制器;我对这方面的了解非常薄弱,所以我可能会以错误的方式提出问题。)。

我见过C# code fragment 据称这样做,但不知道是否与 Win32 API 有任何关系。有很多“如何获取 DC”的网页,但它们都是调用命令脚本,而不是 API。

很高兴有代码,但如果有人指出我正确的方向,愿意做提取步骤的功课。

Linux 中有类似物吗? (例如,查找名称服务器的本地调用?我没有假设带有 Windows 域控制器的 Linux 上下文)。

(啊哈......刚刚发现了这个问题:Get the domain name of a computer from Windows API。会深入研究它。编辑:也许我想要的功能是NetDCName?我从哪里得到它想要的参数?)。

编辑 4 月 19 日:我使用 Eric 的提示对 NetDCName 进行了编码/测试。是的,当有域控制器名称时,它会生成域控制器名称, 并且在没有时发出错误信号,这是正确的功能行为。

然而,函数调用似乎需要几秒钟!为什么会这样? 这会给我正在尝试执行的检查带来不可接受的、用户可见的延迟。

【问题讨论】:

    标签: winapi nameservers domaincontroller


    【解决方案1】:

    NetGetDCName 是一种选择;如果您需要更多功能,DsGetDcName 也是一种选择。

    MSDN 文档明确指出,NULL 是用来表示默认的,所以

    nStatus = NetGetDCName(NULL, NULL, (LPBYTE *) &lpDcName);
    

    将返回本地计算机上默认域的域控制器。

    【讨论】:

    • 感谢您确认答案。但是,函数调用似乎需要几秒钟!为什么会这样?
    • @IraBaxter 我怀疑涉及到 RPC 超时。在 msdn.com 上搜索(不幸的是,它似乎在我输入时已关闭),您可能会发现一些有用的东西。
    • 嗯,是的,有一个相当冗长的解释support.microsoft.com/kb/247811,包括有一堆基于 RPC 的查找的事实。我没有看到对 RPC 超时的明确引用,但我可以看到,如果尝试了所有这些查找并且并非所有收件人都处于活动状态,那么某些事情会超时。但这是人们在正常情况下所期望的行为吗?文章不清楚。它确实说某些东西显然会缓存答案,以避免下一次所有这些工作。我已经在我们的内部网络上多次尝试过查找;所有延迟。
    猜你喜欢
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 2016-05-05
    相关资源
    最近更新 更多