如何确定我使用的机器是否是域控制器

时间:2014-08-28 18:21:40

标签: c# domaincontroller

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

其中任何一种都适合吗?为什么或为什么不适合?

3 个答案:

答案 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

Cover: 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的参考添加到您的项目中。