3

使用 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);
    }

这些中的任何一个都合适吗?为什么或为什么不合适?

4

3 回答 3

2

经过大量研究......有两种方法:

适用于 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);
}
于 2014-09-02T15:02:49.293 回答
0

您可以使用http://msdn.microsoft.com/en-us/library/y9w58cz1(v=vs.110).aspxDomainControllerCollection为您的站点获取可用的信息。

那就是DomainController对象的集合。

最后将他们的ips 与您的本地ip 集进行比较。

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到您的项目。

于 2014-08-28T18:42:33.857 回答
-1

试试这个 Win32 API: NetServerEnum(),它“列出了在域中可见的所有指定类型的服务器。

您的其他选择是使用 LDAP/Active Directory 查询来枚举域控制器:我假设您可能会发现 P/Invoke 更容易和更可口。

如果您想尝试 LDAP 路由,我建议您参考 Joe Kaplan 和 Ryand Dunn编写的 The .NET Developer's Guide to Directory Services Programming

封面:.Net 开发人员目录服务编程指南

于 2014-08-28T18:28:08.653 回答