【问题标题】:How to get server domain name如何获取服务器域名
【发布时间】:2010-12-08 17:45:34
【问题描述】:

谁能告诉我如何在asp.net 中获取服务器域名? (Environment.UserDomainName 返回“IIS APPPOOL”字符串)

感谢重播,但主要是关于服务器的 DNS 名称,我需要的是域名。例如,当我通过 Windows 身份验证登录时,我输入域\用户,我需要这个“域”

【问题讨论】:

  • 哪个登录的域?你的?你总是要登录吗? IIS 通常有自己独立的登录名,它在其下运行,正如您所发现的那样,它位于“IIS APPPOOL”域中。

标签: c# .net asp.net dns


【解决方案1】:

您需要从请求对象中提取它:

HttpContext.Current.Request.Url.Host

【讨论】:

  • +1:这是最干净的方式。它只是返回域名,过滤掉端口、http/https、路径、查询字符串等。
  • 嗯,它返回用于访问服务器的域名,这可能没问题,但它可以是用于访问服务器的许多不同名称之一。
【解决方案2】:

如果这里有人真的在搜索服务器的域名,这是我从 .Net 开始就一直在使用的 hack:

    [DllImport("netapi32.dll", CharSet = CharSet.Auto)]
    static extern int NetWkstaGetInfo(string server, int level, out IntPtr info);

    [DllImport("netapi32.dll")]
    static extern int NetApiBufferFree(IntPtr pBuf);

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    class WKSTA_INFO_100
    {
        public int wki100_platform_id;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string wki100_computername;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string wki100_langroup;
        public int wki100_ver_major;
        public int wki100_ver_minor;
    }

    public static string GetMachineNetBiosDomain()
    {
        IntPtr pBuffer = IntPtr.Zero;

        WKSTA_INFO_100 info;
        int retval = NetWkstaGetInfo(null, 100, out pBuffer);
        if (retval != 0)
            throw new Win32Exception(retval);

        info = (WKSTA_INFO_100)Marshal.PtrToStructure(pBuffer, typeof(WKSTA_INFO_100));
        string domainName = info.wki100_langroup;
        NetApiBufferFree(pBuffer);
        return domainName;
    }

您实际上可以从那里获取一些信息。更新:现在适用于 64 位。

Thanks Duncan for the 64bit version.

【讨论】:

    【解决方案3】:

    有点晚了..但是在遇到完全相同的问题后,我找到了缺失的最佳答案:

    private static string getComputerDomain()
            {
                try
                {
                    return Domain.GetComputerDomain().Name;
                }
                catch (ActiveDirectoryObjectNotFoundException)
                {
                    return "Local (No domain)";
                }
            }
    

    如 msdn site 所述:

    此返回值与域凭据无关 应用程序正在运行。此方法将检索计算机的 域,无论它运行的受信任帐户域凭据如何 下。

    在我的个人电脑(无 AD 域)和 IIS(匿名访问)下工作(使用 AD 域)测试。

    【讨论】:

      【解决方案4】:

      在我看来,您正在尝试查找用户的域名。由于您要求 Environment.UserDomainName。由于您的网站可能在“允许匿名访问”的情况下运行 - 用户没有将他们的域信息传递给服务器,而 IIS 向您提供了它所拥有的帐户信息,即应用程序池帐户。

      【讨论】:

        【解决方案5】:

        您的问题有具体问题,一个特定的IP地址可能有多个域名。

        正如 Tinister 所说,您可以使用

        HttpContext.Current.Request.Url.Host
        

        但这只会告诉你用户在浏览器的地址栏中写了什么。如果用户在您的站点的主机文件中添加了一个条目,然后使用该主机名,那么您将看到。 (我不知道他们为什么会这样做)。

        如果您的网站有多个域名,您可以使用它来确定用户请求了哪些域名。

        【讨论】:

        • 典型的共享和经销商托管公司为多个客户使用同一个盒子,因此将配置他们的 Web 服务器以根据主机名选择正确的站点。如果有人更改了他们的主机文件以尝试以这种方式欺骗代码,那么 Web 服务器很可能会因为未知的主机名而预先拒绝请求。虽然我承认我从未真正尝试过这样做......
        • 确实如此;我在一家公司工作,其中同一个 IIS 服务器以这种方式托管多个域名。我只是指出,通过检查“主机”属性,您可以获得用户输入的内容,并且不能保证这确实是一个正确的值。
        【解决方案6】:

        试试System.Net.Dns 类,它有很多有用的方法,例如GetHostEntry,即:

        var entry = System.Net.Dns.GetHostEntry("google.com"); // or vice-versa...
        var name = System.Net.Dns.GetHostEntry("127.0.0.1"); // localhost ;)
        

        【讨论】:

        • 那么我想下一个问题是如何获得服务器的 WAN IP?如果您使用共享主机并因此没有专用于您的域的 IP,那又会怎样呢?
        • 我一定误解了“服务器域名”,即服务器的复数形式,对我来说,您想以某种方式执行域名查询。
        【解决方案7】:

        根据术士的回答: How can I get the baseurl of site?

        优雅:)

        string baseUrl = Request.Url.GetLeftPart(UriPartial.Authority);

        【讨论】:

          【解决方案8】:

          您需要在 web.config 中添加这段代码

          <authentication mode="Windows"/>
              <authorization>
                <deny users="?"/>
              </authorization>
          
              <identity impersonate="true"/>
          

          【讨论】:

          • 欢迎来到 Stack Overflow!你能否请edit你的答案解释为什么这段代码回答了这个问题?纯代码答案是 discouraged,因为它们不教授解决方案。
          猜你喜欢
          • 2012-11-26
          • 2011-08-26
          • 2011-11-04
          • 1970-01-01
          • 2020-12-22
          • 1970-01-01
          • 2016-10-19
          • 1970-01-01
          • 2018-05-08
          相关资源
          最近更新 更多