72

我想通过 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 .. 所以很难。

谢谢。

4

16 回答 16

100

获取本地计算机的 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
  • 对于远程机器,请确保主机可访问。
于 2012-09-04T17:57:13.450 回答
81

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

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

使用另一个答案中引用的这个:

$myFQDN=(Get-WmiObject win32_computersystem).DNSHostName+"."+(Get-WmiObject win32_computersystem).Domain ; Write-Host $myFQDN
于 2012-09-04T18:02:54.400 回答
32

通过 dotNet 类的本地计算机 FQDN

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

或者

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

参考:

Dns 方法 (System.Net)

注意:GetHostByName 方法已过时


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

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

参考:

Win32_ComputerSystem 类

于 2014-05-13T13:40:10.527 回答
9
[System.Net.Dns]::GetHostByName((hostname)).HostName

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

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

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

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

返回正确的 FQDN

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

于 2013-08-07T12:32:09.483 回答
3
(Get-ADComputer $(hostname)).DNSHostName
于 2019-09-16T16:31:26.297 回答
3

这是我一直使用的方法:

$fqdn= $(ping localhost -n 1)[1].split(" ")[1]
于 2019-12-01T18:31:56.367 回答
2

它也可以从注册表中检索:

Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters' |
   % { $_.'NV HostName', $_.'NV Domain' -join '.' }
于 2018-11-09T22:22:56.477 回答
2

更清晰的远程 FQDN 格式

[System.Net.Dns]::GetHostByName('remotehost').HostName
于 2019-09-12T14:17:17.590 回答
2

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

[System.Net.Dns]::Resolve($null).HostName
于 2021-03-09T21:15:24.927 回答
1

我使用以下语法:

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

$VM 是向上还是向下都没有关系...

于 2015-05-05T15:14:52.737 回答
1

要获取与第一个 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

那不是我想要的。

于 2019-05-11T19:26:11.997 回答
0
"$env:computername.$env:userdnsdomain" 

如果像这样分开就可以了

"$env:computername"+"$env:userdnsdomain"
于 2015-04-29T14:08:25.350 回答
0

这个怎么样

$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(".")
于 2016-05-05T06:05:59.590 回答
0

这是一种根据“名称”和“可分辨名称”确定服务器 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
于 2017-09-15T12:36:36.297 回答
0

我有以下添加..我需要从主机名中分离出 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
于 2018-03-01T15:49:20.793 回答
0

如果您有多个网络适配器并且多个适配器处于活动状态(fe 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()
于 2020-10-06T09:25:31.643 回答