PowerShell: 获取FQDN主机名

81

我想通过PowerShell脚本检索Windows服务器的FQDN名称。到目前为止,我已经发现了两种解决方案:

$server =  Invoke-Command -ScriptBlock {hostname}

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

$sysinfo = Get-WmiObject -Class Win32_ComputerSystem
$server = “{0}.{1}” -f $sysinfo.Name, $sysinfo.Domain
上面两行代码可以获取完整域名,但这看起来很难看,只是为了检索主机名而编写如此冗长的代码 :(
所以,我的问题是,是否有更简单的方法在PowerShell中获取完整域名。我是一名bash/perl程序员,最近开始学习PowerShell,所以感到有些困难。
谢谢。

1
不必使用 Invoke-Command,你可以这样做:$server = (hostname) - x0n
17个回答

118

获取本地计算机的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
  • 对于远程机器,确保主机是可达的。

1
这是运行自动化脚本时获取此信息的正确方法。除非用户已登录,否则$env:userdnsdomain将返回NULL。 - BFoust
5
翻译:获取本机计算机名的主机名。 - Paul Dolphin
1
看起来 GetHostByName已被弃用,建议使用GetHostEntry代替,即[System.Net.Dns]::GetHostEntry($Env:ComputerName).HostName。 - deadlydog
1
无论如何这都不起作用。如果您有一个指向机器的备用域名,而不是AD FQDN,它将愉快地返回该域名。 - Pxtl

88

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

实际上,这只有在用户登录到域(即没有本地帐户),登录到与服务器相同的域,并且不适用于不连续命名空间 AD 配置时才能正常工作。

可以参考另一个答案中提到的内容使用:

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

嗯...那么在没有域的情况下获取计算机的完全限定域名是什么意思呢?你的答案输出什么?只有机器名称吗?你是说我的答案甚至没有显示你的机器名称? - aquinas
2
我们有两个域,所以这个方法行不通。该方法假定运行PS脚本的域,但实际情况可能并非如此。 - barrypicker
对我来说在PowerShell中无法工作,最好采用perilbrain发布的答案。 - Ranvir
3
如果登录的用户和计算机不在同一个域中,这个方法就会失败。它获取的是用户的域信息,而不是计算机的域信息。 - Daniel
同样的较短版本为 $myFQDN = Get-WmiObject win32_computersystem | %{ $_.DNSHostName + "." + $_.Domain} - Charlieface

34

使用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 类


1
干得好。[string] 强制转换是不必要的。一种更新为 CIM 的 WMI 命令变体,只需要 一个 调用:Get-CimInstance win32_computersystem | % { $_.Name + '.' + $_.Domain } - mklement0

10

这在Windows上的PS和PS Core中可用(已在版本5.1和7.2上进行了测试)

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

1
最好的答案。 - Carsten

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

hostname 实用程序返回 dnshostname,即 FQDN 的第一部分和代码。
[System.Net.Dns]::GetHostByName((hostname)).HostName

返回正确的FQDN

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


3

以下是我一直使用的方法:

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

3
(Get-ADComputer $(hostname)).DNSHostName

1
提供的答案因为质量低被标记为需要审核。以下是如何撰写好的回答的一些指南。这个答案可能是正确的,但它可以从解释中受益。仅有代码的答案不被认为是“好”的答案。来自审核 - Trenton McKinney
我从来不明白解释一个简单的命令有什么意义。这太挑剔了。我猜这是机械化的回应吧? - Carsten

3

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

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

2

要获取与第一个IpAddress对应的fqdn,需要运行以下命令:

Original Answer翻译成:"最初的回答"

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上采用获胜的解决方案,我只会得到:

注:本文涉及IT技术,如有专业术语不当之处请谅解。

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

最初的回答不是我想要的。

这并不是我期望的答案。


2
一个更清晰的远程FQDN格式
[System.Net.Dns]::GetHostByName('remotehost').HostName

将remotehost(保留引号)替换为所查找的主机名,即可获得FQDN: [System.Net.Dns] :: GetHostByName('lookedforserver').HostName - Patrick Burwell
- Patrick Burwell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接