获取域名

Osv*_*ier 38 .net c# dns sharepoint-2007 .net-2.0

我的计算机位于域(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;
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)

它完全按照我的意愿工作,并返回我想要的域名(当我以管理员身份登录时).如果用户不是域管理员,我有一个Access denied例外.

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

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

即我的域名是:something.domain.comUserDomainName唯一的回报something.

Pie*_*kel 95

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

System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName;
Run Code Online (Sandbox Code Playgroud)

  • 从计算机中删除计算机时出现问题 - http://connect.microsoft.com/VisualStudio/feedback/details/549924/ipglobalproperties-domainname-return-domain-name-after-computer-was-excluded-from-domain (3认同)
  • 发现与@Rich相同的问题,如果将计算机从域中删除,则旧值仍然保留。无法跟随他的链接。 (2认同)

Dav*_*dom 23

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

计算机的"域"究竟意味着什么?

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

  • 一个用户或计算机安全主体可能属于一个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的答案是指的值HTTP_HOST,这在确定用户如何解析您的HTTP服务器时特别有用为了发送您当前正在处理的请求.如果您尝试使用Active Directory执行任何操作,这几乎肯定不是您想要的.

我怎么得到它们?

当前用户安全主体的域

这个很好很简单,这就是蒂姆给你的答案.

System.Environment.UserDomainName
Run Code Online (Sandbox Code Playgroud)

当前计算机安全主体的域

可能是OP想要的,对于这个我们将不得不向Active Directory询问它.

System.DirectoryServices.ActiveDirectory.Domain.GetComputerDomain()
Run Code Online (Sandbox Code Playgroud)

ActiveDirectoryObjectNotFoundException如果本地计算机不是域的一部分,或者无法联系域控制器,则会抛出一个.

网络堆栈的主DNS后缀

就是Pieter van Ginkel给出的答案.它可能不完全是你想要的,但它很有可能对你来说足够好 - 如果不是,你可能已经知道为什么了.

System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName
Run Code Online (Sandbox Code Playgroud)

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

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

  • “ GetComputerDomain”具有一个伴侣,“ GetCurrentDomain”看起来像是以用户为中心的。使用_computer_而不是_user_有什么区别/好处? (2认同)

Tim*_*Tim 14

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

System.Environment.UserDomainName
Run Code Online (Sandbox Code Playgroud)

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

然后问题的描述是完全限定的域名(FQDN).

  • 如果您有本地用户登录,则会出现此问题,因为它将提供计算机的名称而不是域名.(是的,我们今天打了这个,这让我们感到非常悲痛).如果您尝试获取MACHINE的域,您可能不希望您的答案依赖于USER的域. (11认同)