Powershell:获取FQDN主机名

时间:2012-09-04 17:54:19

标签: windows powershell

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

感谢。

16 个答案:

答案 0 :(得分:63)

如何:"$env:computername.$env:userdnsdomain"

如果用户登录到域(即没有本地帐户),登录到与服务器相同的域,并且不能使用脱节的名称空间AD配置,则实际有效。

在另一个答案中引用它:

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

Write-Host $ myFQDN

答案 1 :(得分:62)

获取本地计算机的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
  • 对于远程计算机,请确保可以访问主机。

答案 2 :(得分:27)

通过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

答案 3 :(得分:7)

[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名称)

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

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

返回正确的FQDN

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

答案 4 :(得分:1)

我使用以下语法:

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

$ VM是上升还是下降无关紧要......

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

这是我一直使用的方法:

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

答案 7 :(得分:1)

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

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

答案 8 :(得分:0)

"$env:computername.$env:userdnsdomain" 
如果像这样分开,

将起作用

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

答案 9 :(得分: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(".")

答案 10 :(得分:0)

这是一种基于“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

答案 11 :(得分:0)

我有以下添加..我需要从主机名中分离出dns后缀..而我只是"知道"服务器别名shortname ...并想知道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

答案 12 :(得分:0)

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

那不是我想要的。

答案 13 :(得分:0)

更干净的远程FQDN格式

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

答案 14 :(得分:0)

(Get-ADComputer $(hostname)).DNSHostName

答案 15 :(得分:0)

如果您有多个网络适配器,并且有多个适配器处于活动状态(例如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()