我试图弄清楚Active Directory域服务是否安装了Windows服务器。
我知道它们出现在服务器管理器中,但是我可以通过编程方式获取是否在使用C#代码的服务器上安装了该角色
答案 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过滤。