我想通过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 ..所以发现它很难。
感谢。
答案 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
参考:
注意:GetHostByName方法已过时
通过WMI查询的本地计算机FQDN
$myFQDN=(Get-WmiObject win32_computersystem).DNSHostName+"."+(Get-WmiObject win32_computersystem).Domain
Write-Host $myFQDN
参考:
答案 3 :(得分:7)
[System.Net.Dns]::GetHostByName((hostname)).HostName
$env:computerName
返回主机的NetBIOS名称,以便前两个示例都返回
netbioshostname.domainsuffix(不是FQDN!)
代替
dnshostname.domainsuffix(FQDN)
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)
[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()