使用C#,找出机器我的代码是否在域控制器上运行的方法是什么。
我不想"出去"并收集有关域上任何其他域控制器的信息...我只对我的代码是否在域控制器上运行的机器机器感兴趣。另外,我不需要知道它是否是主域控制器......就好像它是域控制器一样。
这是我试过的
试用1
private bool IsDomainController()
{
Domain domain = Domain.GetCurrentDomain();
string domainName = domain.ToString();
bool bIsDC = false;
DirectoryContext ctx = new DirectoryContext(DirectoryContextType.Domain, domainName);
try
{
using (DomainController dc = DomainController.FindOne(ctx, LocatorOptions.ForceRediscovery))
{
bIsDC = true;
}
}
catch (Exception)
{
bIsDC = false;
}
return bIsDC;
}
和
试用2
public bool IsThisMachineIsADomainController()
{
Domain domain = Domain.GetCurrentDomain();
string thisMachine = String.Format("{0}.{1}", Environment.MachineName, domain.ToString());
thisMachine = thisMachine.ToLower();
//Enumerate Domain Controllers
List<string> allDcs = new List<string>();
string name = "";
foreach (DomainController dc in domain.DomainControllers)
{
name = dc.Name.ToLower();
allDcs.Add(name);
}
return allDcs.Contains(thisMachine);
}
其中任何一种都适合吗?为什么或为什么不适合?
答案 0 :(得分:1)
经过大量研究......有两种方法:
适用于Windows 2008服务器:
public bool isActiveDirectoryDomainServicesInstalled()
{
bool bRetval = false;
try
{
uint uID = 110;
string search = string.Format("SELECT * FROM Win32_ServerFeature WHERE ID = {0}", uID);
ManagementObjectSearcher oSearcher = new ManagementObjectSearcher("root\\CIMV2", search);
foreach (var oReturn in oSearcher.Get())
{
if ((uint)(oReturn["ID"]) == uID)
{
bRetval = true;
break;
}
}
}
catch (Exception)
{
bRetval = false;
}
return bRetval;
}
。 和
适用于Windows 2008和Windows 2012服务器
public bool IsThisMachineIsADomainController()
{
Domain domain = Domain.GetCurrentDomain();
string thisMachine = String.Format("{0}.{1}", Environment.MachineName, domain.ToString());
thisMachine = thisMachine.ToLower();
//Enumerate Domain Controllers
List<string> allDcs = new List<string>();
string name = "";
foreach (DomainController dc in domain.DomainControllers)
{
name = dc.Name.ToLower();
allDcs.Add(name);
}
return allDcs.Contains(thisMachine);
}
答案 1 :(得分:0)
试试这个Win32 API:NetServerEnum()
,其中“列出了域中可见的指定类型的所有服务器。”
您的其他选择是使用LDAP / Active Directory查询来枚举域控制器:我认为您可能会发现P / Invoke更容易,更可口。
如果您想尝试LDAP路线,我建议Joe Kaplan和Ryand Dunn The .NET Developer's Guide to Directory Services Programming。
答案 2 :(得分:0)
您可以使用http://msdn.microsoft.com/en-us/library/y9w58cz1(v=vs.110).aspx为您的网站提供DomainControllerCollection
。
那是DomainController
对象的集合。
最后用你的本地 ip设置他们的 ips。
Domain d = Domain.GetCurrentDomain();
DomainControllerCollection dcc = d.FindAllDiscoverableDomainControllers("domain.local");
IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
Boolean scanDone = false;
foreach (DomainController dc in dcc)
{
foreach (IPAddress localip in localIPs)
{
if (dc.IPAddress.ToString().Equals(localip.ToString()))
{
MessageBox.Show("Woop Woop! I'm a DC!");
scanDone = true;
break;
}
}
if (scanDone) break;
}
您需要将System.DirectoryServices
的参考添加到您的项目中。