获取域名

时间:2010-11-12 02:58:18

标签: c# .net sharepoint-2007 .net-2.0 dns

我的计算机位于域(Active Directory)中,我需要动态获取域名。我在互联网上找到了以下代码:

SelectQuery query = new SelectQuery("Win32_ComputerSystem");
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query))
{
    foreach (ManagementObject mo in searcher.Get())
    {
        if ((bool)mo["partofdomain"])
        {
            this.Domain = mo["domain"].ToString();
            break;
        }
    }
 }

它完全按照我的意愿工作,并按照我想要的方式返回域名(当我以管理员身份登录时)。如果用户不是域管理员,则会出现Access denied例外情况。

是否有人知道如何使用非域管理员用户获取域名?

注意:我在互联网System.Environment.UserDomainName;上找到了这个解决方案,但它只给了我一部分域名。

即。我的域名是:something.domain.com 并且UserDomainName仅返回something

6 个答案:

答案 0 :(得分:90)

您为什么使用WMI?你不能使用标准的.NET功能吗?

System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName;

答案 1 :(得分:18)

我将添加一个答案,试图在这里澄清一些事情,因为似乎有些混乱。主要问题是人们提出错误的问题,或者至少不够具体。

计算机的“域”实际上是什么意思

当我们谈论计算机的“域”时,我们可能会提到几件事。以下内容并非详尽无遗,但它涵盖了最常见的情况:

  • user or computer security principal可能属于Active Directory域。
  • 网络堆栈的主DNS搜索后缀可以称为计算机的“域”。
  • 解析为计算机IP地址的DNS名称可称为计算机的“域”。

我想要哪一个?

这在很大程度上取决于您要做的事情。这个问题的原始海报是寻找计算机的“Active Directory域”,这可能意味着他们正在寻找计算机的安全主体或用户的安全主体所属的域。通常,当您尝试以某种方式与Active Directory通信时,您需要这些。请注意,当前用户主体和当前计算机主体不一定在同一个域中。

Pieter van Ginkel的答案实际上是给你本地网络堆栈的主DNS后缀(与ipconfig /all输出的顶部显示的相同)。在99%的情况下,这可能与计算机的安全主体和当前经过身份验证的用户的主体所属的域相同 - 但不一定。通常,当您尝试与LAN上的设备通信时,无论设备是否与Active Directory有关,这都是您想要的。对于许多应用程序来说,这仍然是与Active Directory交谈的“足够好”的答案。

最后一个选项,DNS名称,比其他两个更模糊,更模糊。零和无限DNS记录之间的任何地方都可以解析为给定的IP地址 - 并且您不一定清楚您感兴趣的是哪个IP地址。user2031519's answer指的是HTTP_HOST的值,这在以下情况下特别有用:确定用户如何解析您的HTTP服务器以发送您当前正在处理的请求。如果您尝试使用Active Directory执行任何操作,这几乎肯定不是您想要的。

我如何获得它们?

当前用户安全主体的域

This一个很好,很简单,这是Tim's answer给你的。

System.Environment.UserDomainName

当前计算机安全主体的域

This可能是OP想要的,因为我们不得不向Active Directory询问它。

System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain()

如果本地计算机不属于域,或者无法联系域控制器,则会抛出ActiveDirectoryObjectNotFoundException

网络堆栈的主DNS后缀

ThisPieter van Ginkel's answer给你的。它可能不是你想要的,但它很有可能对你有好处 - 如果不是,你可能已经知道了为什么。

System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName

解析为计算机IP地址的DNS名称

这个很棘手,没有单一的答案。如果这就是你所追求的,请在下面发表评论,我将很乐意讨论你的用例,并帮助你找出最佳解决方案(并在此过程中扩展这个答案)。

答案 2 :(得分:12)

我在标题中找到了这个问题。如果其他人正在寻找如何获取域名的答案,请使用以下环境变量。

System.Environment.UserDomainName

我知道这个问题的作者提到了这一点,但我乍一看就错过了,并认为其他人可能会这样做。

然后问题的描述是fully qualified domain name (FQDN)

答案 3 :(得分:1)

如果您希望特定用户可以访问全部或部分WMI对象空间,则需要按照here所示对他们进行权限。请注意,您必须以管理员身份运行才能执行此设置。

答案 4 :(得分:1)

我知道这是旧的。我只是想把这个转发给那些正在寻找获得域名答案的人。这与彼得的答案相协调。那里"是" Rich说的一个错误。但是,您可以随时为此做一个简单的解决方法。我可以判断他们是否仍然在域上的方式是通过ping域名。如果它响应,继续我需要的域名。如果它失败了,我就辍学并进入离线"模式。简单的字符串方法。

 string GetDomainName()
    {
        string _domain = IPGlobalProperties.GetIPGlobalProperties().DomainName;

        Ping ping = new Ping();

        try
        {
            PingReply reply = ping.Send(_domain);

            if (reply.Status == IPStatus.Success)
            {
                return _domain;
            }
            else
            {
                return reply.Status.ToString();
            }
        }
        catch (PingException pExp)
        {
            if (pExp.InnerException.ToString() == "No such host is known")
            {
                return "Network not detected!";
            }

            return "Ping Exception";
        }
    }

答案 5 :(得分:0)

 protected void Page_Init(object sender, EventArgs e)
 {
   String hostdet = Request.ServerVariables["HTTP_HOST"].ToString();
 }