如何确定服务器上是否已安装“Active Directory域服务”角色

时间:2014-08-29 17:17:56

标签: c# roles servermanager

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

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

2 个答案:

答案 0 :(得分: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");

请参阅MSDN reference on Win32_ServerFeature以获取完整的角色列表及其ID号。

答案 1 :(得分: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命令是FAST,它将为您提供运行DCPROMO的所有服务器:

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

如果使用Process启动它,问题就是从命令行输出中获取。正在努力实现这一目标,并且一旦我对其进行测试就会更新,因为我暂时没有在查询中进行AD过滤。