【问题标题】:Powershell: Get FQDN HostnamePowershell:获取 FQDN 主机名
【发布时间】:2012-09-04 17:54:18
【问题描述】:

我想通过 powershell 脚本检索 windows 服务器的 FQDN 名称。到目前为止,我已经找到了 2 个解决方案:

$server =  Invoke-Command -ScriptBlock {hostname}

上面一行将只打印服务器的短名称

$sysinfo = Get-WmiObject -Class Win32_ComputerSystem
$server = “{0}.{1}” -f $sysinfo.Name, $sysinfo.Domain

上面两行会给我 FQDN,但这看起来真的很讨厌的代码来检索主机名:(

所以,我的问题是,有没有一种更简单的方法可以在 powershell 中获取 FQDN。我是一个 bash/perl 编码器,最近拿起了 powershell.. 所以觉得很难。

谢谢。

【问题讨论】:

  • 不使用invoke-command,你可以这样做:$server = (hostname)

标签: windows powershell


【解决方案1】:

获取本地计算机的 FQDN:

[System.Net.Dns]::GetHostByName($env:computerName)

[System.Net.Dns]::GetHostByName($env:computerName).HostName

获取远程计算机的 FQDN:

[System.Net.Dns]::GetHostByName('mytestpc1')

为了更好地格式化值使用:

[System.Net.Dns]::GetHostByName('mytestpc1').HostName
  • 对于远程计算机,请确保主机可访问。

【讨论】:

  • 感谢您的快速回复。这很好用。我在发布这个问题之前用谷歌搜索了很多,但没有找到更接近你提到的内容。你能给我指点powershell文件吗..如果有的话。再次感谢。
  • 这是在运行自动化脚本时获取此信息的正确方法。除非用户登录,否则 $env:userdnsdomain 返回 NULL。
  • [System.Net.Dns]::GetHostByName(($env:computerName)).HostName
  • 看起来像GetHostByName is deprecated,建议的方法是改用GetHostEntry。即 [System.Net.Dns]::GetHostEntry($Env:ComputerName).HostName
【解决方案2】:

怎么样:"$env:computername.$env:userdnsdomain"

这实际上在用户登录到域(即没有本地帐户)、登录到与服务器相同的域并且不适用于脱节的名称空间 AD 配置的情况下才有效。

在另一个答案中引用它:

$myFQDN=(Get-WmiObject win32_computersystem).DNSHostName+"."+(Get-WmiObject win32_computersystem).Domain ; Write-Host $myFQDN

【讨论】:

  • 太棒了。这甚至更短。谢谢。我会尽快接受你们两个的答案,因为 stackoverlow 不允许我现在标记答案。
  • 嗯...那么获取不在域中的计算机的完全限定域名是什么意思?你的答案输出什么?只是机器名称?你是说我的回答甚至没有显示你的机器名称?
  • 我们有两个域,所以这不起作用。此方法假定 PS 脚本正在运行的域,但情况可能并非如此。
  • 我不能在 powershell 中工作,最好使用 perilbrain 发布的答案
  • 如果登录的用户与计算机位于不同的域中,则会失败。它提取用户的域信息,而不是机器的
【解决方案3】:

通过 dotNet 类的本地计算机 FQDN

[System.Net.Dns]::GetHostEntry([string]$env:computername).HostName

[System.Net.Dns]::GetHostEntry([string]"localhost").HostName

参考:

Dns Methods (System.Net)

注意:GetHostByName 方法已过时


通过 WMI 查询的本地计算机 FQDN

$myFQDN=(Get-WmiObject win32_computersystem).DNSHostName+"."+(Get-WmiObject win32_computersystem).Domain
Write-Host $myFQDN

参考:

Win32_ComputerSystem class

【讨论】:

  • 做得很好。 [string] 强制转换不是必需的。 WMI 命令的变体(针对 CIM 进行了更新),只需要 一个 调用:Get-CimInstance win32_computersystem | % { $_.Name + '.' + $_.Domain }
【解决方案4】:
[System.Net.Dns]::GetHostByName((hostname)).HostName

$env:computerName 返回主机的 NetBIOS 名称,因此前面的两个示例都返回 netbioshostname.domainsuffix(不是 FQDN!) 代替 dnshostname.domainsuffix (FQDN)

例如,主机有 全域名 aa-w2k12sv-storage.something.com 和 NetBIOS 名称 aa-w2k12sv-stor(一个简单的例子,我通常更改 NetBIOS 名称)

主机名实用程序返回 dnshostname,即 FQDN 和代码的第一部分

[System.Net.Dns]::GetHostByName((hostname)).HostName

返回正确的 FQDN

评论:切勿使用相同的 NetBIOS 和 AD 域和主机的 DNS 名称。如果您或第 3 方应用程序写入日志:“无法连接到 hostname.domainsuffix”,它会尝试解析什么名称?如果您在日志中看到“无法连接到 netbiosname.domainsuffix”,那么毫无疑问,是一个懒惰的程序员在 NetBIOS 名称中添加了域后缀,您确定这是一个错误,可以开票强制他们修复问题...

【讨论】:

    【解决方案5】:

    这适用于 Windows 上的 PS 和 PS Core(在 5.1 和 7.2 版上测试)

    [System.Net.Dns]::Resolve($null).HostName
    

    【讨论】:

    • 对于 POWERSHELL,这是正确的答案
    【解决方案6】:
    (Get-ADComputer $(hostname)).DNSHostName
    

    【讨论】:

    • 所提供的答案被标记为低质量帖子以供审核。以下是How do I write a good answer? 的一些指南。提供的这个答案可能是正确的,但它可以从解释中受益。仅代码答案不被视为“好”答案。来自review
    【解决方案7】:

    这是我一直使用的方法:

    $fqdn= $(ping localhost -n 1)[1].split(" ")[1]
    

    【讨论】:

      【解决方案8】:

      也可以从注册表中检索:

      Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters' |
         % { $_.'NV HostName', $_.'NV Domain' -join '.' }
      

      【讨论】:

        【解决方案9】:

        一种更简洁的远程 FQDN 格式

        [System.Net.Dns]::GetHostByName('remotehost').HostName
        

        【讨论】:

          【解决方案10】:

          我使用以下语法:

          $Domain=[System.Net.Dns]::GetHostByName($VM).Hostname.split('.')
          $Domain=$Domain[1]+'.'+$Domain[2]
          

          $VM 是启动还是关闭都没有关系...

          【讨论】:

            【解决方案11】:

            为了得到第一个IpAddress对应的fqdn,它使用了这个命令:

            PS C:\Windows\system32> [System.Net.Dns]::GetHostByAddress([System.Net.Dns]::GetHostByName($env:computerName).AddressList[0]).HostName
            WIN-1234567890.fritz.box
            

            其中[System.Net.Dns]::GetHostByName($env:computerName).AddressList[0] 代表第一个 IpAddress-Object,[System.Net.Dns]::GetHostByAddress 从中获取 dns-object。

            如果我在独立的 Windows 上采用了成功的解决方案,我只得到:

            PS C:\Windows\system32> (Get-WmiObject win32_computersystem).DNSHostName+"."+(Get-WmiObject win32_computersystem).Domain
            WIN-1234567890.WORKGROUP
            

            这不是我想要的。

            【讨论】:

              【解决方案12】:

              如果您有多个网络适配器并且多个适配器处于活动状态(例如 WLAN + VPN),则需要进行更复杂的检查。您可以使用此单线:

              [System.Net.DNS]::GetHostByAddress(([System.Net.DNS]::GetHostAddresses([System.Environment]::MachineName) | Where-Object { $_.AddressFamily -eq "InterNetwork" } | Select-Object IPAddressToString)[0].IPAddressToString).HostName.ToLower()
              

              【讨论】:

              • 被低估的救星。谢谢!
              【解决方案13】:
              "$env:computername.$env:userdnsdomain" 
              

              如果像这样分开就可以了

              "$env:computername"+"$env:userdnsdomain"
              

              【讨论】:

              • 不幸的是,这并不准确,因为不保证用户登录域与服务器域相同,尤其是在生产环境中,用户可以在域example.net 中声明,但是服务器位于siteA.example.netsiteB.example.netcorp.example.net 等。
              • 如果您在本地用户(如 NTAUTHOITY\LOCAL_SERVICE)下运行脚本,$env:USERdnsdomain 也可能为空
              【解决方案14】:

              这个怎么样

              $FQDN=[System.Net.Dns]::GetHostByName($VM).Hostname.Split('.')
              [int]$i = 1
              [int]$x = 0
              [string]$Domain = $null
              do {
                  $x = $i-$FQDN.Count
                  $Domain = $Domain+$FQDN[$x]+"."
                  $i = $i + 1
              } until ( $i -eq $FQDN.Count )
              $Domain = $Domain.TrimEnd(".")
              

              【讨论】:

                【解决方案15】:

                这是一种根据“Name”和“DistinguishedName”确定服务器 FQDN 的方法。适用于多个域:

                $server = Get-ADComputer serverName -Server domainName -Properties * | select Name, DistinguishedName
                $domain = $server.DistinguishedName -split ","
                $domain = $domain | ? {$_ -like 'DC=*'}
                $domain = $domain -join "."
                $domain = $domain -replace "DC="
                $FQDN = $server.Name + "." + $domain
                

                【讨论】:

                  【解决方案16】:

                  我有以下添加..我需要将 dns 后缀从主机名中分离出来..我只“知道”服务器别名短名称...并且想知道 dns 后缀是什么

                  #example:
                  #serveralias:     MyAppServer.us.fred.com
                  #actualhostname:  server01.us.fred.com 
                  #I "know":        "MyAppServer" .. I pass this on as an env var called myjumpbox .. this could also be $env:computername
                  
                  
                  $forname                 = $env:myjumpbox
                  $fqdn                    = [System.Net.Dns]::GetHostByName($forname).Hostname
                  $shortname               = $fqdn.split('.')[0]
                  $domainname              = $fqdn -split $fqdn.split('.')[0]+"."
                  $dnssuf                  = $domainname[1]  
                  " name parts are- alias: " + $forname + " actual hostname: " + $shortname + " suffix: " + $dnssuf
                  
                  #returns
                  
                  name parts are- alias: MyAppServer actual hostname: server01 suffix: us.fred.com
                  

                  【讨论】:

                  • 这适用于 dns 别名以及“深层”域名。例如带有 C-Name MyAppServer 的 server01.us.fred.com .. 您可以将 $forname 设置为“MyAppServer”并获取短名称还有域名
                  • 考虑在编辑时将其删除,并在准备好后取消删除...就像这样,我将鼠标悬停在 dv 和标志对话框中。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-09-14
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-08-21
                  • 2010-09-14
                  • 2011-08-11
                  相关资源
                  最近更新 更多