5

我试图弄清楚 Active Directory 域服务是否安装了 Windows 服务器。

我知道它们出现在服务器管理器中,但是如果使用 C# 代码将角色安装在服务器上,我可以通过编程方式获取吗

4

2 回答 2

3

如果您知道要测试的服务器的名称并且可以使用域管理员权限远程运行程序,则可以使用 WMI:

internal static bool IsDomainController(string ServerName)
{
    StringBuilder Results = new StringBuilder();

    try
    {
        ManagementObjectSearcher searcher =
            new ManagementObjectSearcher("\\\\" + ServerName + "\\root\\CIMV2",
            "SELECT * FROM Win32_ServerFeature WHERE ID = 10");

        foreach (ManagementObject queryObj in searcher.Get())
        {
            Results.AppendLine(queryObj.GetPropertyValue("ID").ToString());
        }
    }
    catch (ManagementException)
    {
        //handle exception
    }

    if (Results.Length > 0)
        return true;
    else
        return false;
}

如果您在服务器上本地运行它,WMI 路径将更改为:

        ManagementObjectSearcher searcher =
            new ManagementObjectSearcher("root\\CIMV2",
            "SELECT * FROM Win32_ServerFeature WHERE ID = 10");

有关角色及其 ID 号的完整列表,请参阅Win32_ServerFeature 上的 MSDN 参考。

于 2014-08-29T22:02:43.080 回答
2

如果您的问题是查看服务器是否是域控制器,您可以枚举域中的域控制器并检查您所在服务器的主机名,看看它是否与其中任何一个匹配。获取域控制器列表:

        var domainControllers = new List<string>();
        var domain = Domain.GetCurrentDomain();
        foreach (var dc in domain.DomainControllers)
        {
            domainControllers.Add(dc.Name);
        }
        string whoami = Dns.GetHostname();

确保添加必要的错误处理(例如,如果您在工作组计算机上运行它,它会死掉)。

编辑:检测 DCPROMO 的替代方法(因为可以在没有 DCPROMO 的情况下安装域服务,这是一件坏事):

1) 解析(并检查是否存在)在 DCPROMO 执行其操作时创建的调试日志。应位于 c:\windows\debug\dcpromo.log

2) 此 DSQUERY 命令速度很快,将为您提供运行 DCPROMO 的所有服务器:

 dsquery * "cn=Sites,cn=Configuration,dc=MyDomain,dc=com" -Filter "(cn=NTDS Settings)" -attr distinguishedName whenCreated

如果您使用 Process 启动它,问题是从命令行输出中获取它。正在研究一种方法来做到这一点,一旦我测试过它就会更新,因为我已经有一段时间没有在查询中进行 AD 过滤了。

于 2014-08-29T21:19:33.353 回答