【问题标题】:Get domain name获取域名
【发布时间】:2023-03-07 19:15:01
【问题描述】:

我的计算机位于域 (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 异常。

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

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

即我的域名是:something.domain.comUserDomainName 只返回something

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 如果计算机从域中删除会出现问题 - connect.microsoft.com/VisualStudio/feedback/details/549924/…
    • 嘿,我是从我的本地系统获取的,但是当我将它托管在服务器中时,我能够获取我托管的 PC 名称,但我想获取其中的 PC 名称用户访问了我的应用程序。有没有可能
    • 发现与@Rich 相同的问题,如果计算机从域中删除,旧值仍然存在。无法点击他的链接。
    【解决方案2】:

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

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

    当我们谈论计算机的“域”时,我们可能指的是几件事。以下内容并不详尽,但涵盖了最常见的情况:

    • 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 名称

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

    【讨论】:

    • GetComputerDomain 有一个伙伴 GetCurrentDomain,它看起来是以用户为中心的。使用 computer 而不是 user 有什么区别/好处?
    • @DonBoitnott 一个进程正在以用户身份运行,该用户可以位于与计算机不同的域中。如果这些域之间存在“信任关系”,则这是可能的。
    【解决方案3】:

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

    System.Environment.UserDomainName
    

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

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

    【讨论】:

    • 你应该把它改成:System.Environment.UserDomainName
    • 如果您有本地用户登录,这是一个问题,因为它会给出机器的名称而不是域。 (是的,我们今天遇到了这个问题,这给我们带来了极大的悲痛)。如果您尝试获取 MACHINE 的域,您可能不希望您的答案依赖于 USER 的域。
    • @John 从来没有想过,但这听起来很合理。那么这个怎么样; “System.DirectoryServices.ActiveDirectory.Domain”,我自己还没试过。
    • 是的,我也从来没有想过,直到昨天有人这样做...幸运的是在我们的测试实验室而不是在客户现场。最好的解决方案似乎是此处标记为已接受的解决方案 - 它不需要任何新的引用,据我了解,某些 AD 调用可能需要提升权限。
    • 这为我返回了不正确的结果。 IPGlobalProperties.GetIPGlobalProperties().DomainName 这对我来说很好
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      我知道这是旧的。我只是想在这里为任何正在寻找获得域名答案的人转储这个。这与彼得的回答是一致的。 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";
              }
          }
      

      【讨论】:

        【解决方案6】:
         protected void Page_Init(object sender, EventArgs e)
         {
           String hostdet = Request.ServerVariables["HTTP_HOST"].ToString();
         }
        

        【讨论】:

        • 我使用此代码Request.ServerVariables["HTTP_HOST"] 并且可以工作,但只能在请求上下文中使用(如果您使用的是 MVC,则为控制器)
        猜你喜欢
        • 1970-01-01
        • 2014-07-07
        • 2012-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多