Powershell: 获取 FQDN 主机名

我想通过 Powershell 脚本检索窗口服务器的 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。.所以觉得很困难。

谢谢。

277169 次浏览

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

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

实际上,如果用户登录到一个域(即没有本地帐户) ,登录到与服务器相同的域,并且不使用脱节的名称空间 AD 配置,那么 只有就可以工作。

在另一个答案中使用:

$myFQDN=(Get-WmiObject win32_computersystem).DNSHostName+"."+(Get-WmiObject win32_computersystem).Domain ; Write-Host $myFQDN
[System.Net.Dns]::GetHostByName((hostname)).HostName

$env:computerName返回主机的 NetBIOS 名称,以便前面的两个示例都返回 Domainaffix (不是 FQDN!) 而不是 域后缀(FQDN)

举例来说,主办机构 FQDN Aa-w2k12sv-storage.something.com 和 NetBIOS 名称 Aa-w2k12sv-stor (一个简单的例子,我通常更改 NetBIOS 的名称)

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

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

返回正确的 FQDN

注释: 绝不使用相同的 NetBIOS 和 DNS 名称的广告域名和主机。如果您或第三方应用程序向日志中写入: “ can not connect to hostname.domainaffix”,它将尝试解析哪个名称?如果你在日志中看到“不能连接到 netbiosname.domainaffix”,毫无疑问,一个懒惰的程序员添加域后缀到 NetBIOS 名称,你肯定,这是一个错误,并可以打开票来强制他们修复这个问题..。

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

"$env:computername.$env:userdnsdomain"

如果像这样分开的话会有用的

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

我使用以下语法:

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

$VM 是上是下并不重要..。

这个怎么样

$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(".")

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

我有以下添加。.我需要从主机名中分离出 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

也可从登记册中检索:

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

为了获得与第一个 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

那不是我想要的。

远程清洁格式 FQDN

[System.Net.Dns]::GetHostByName('remotehost').HostName
(Get-ADComputer $(hostname)).DNSHostName

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

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

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

这可以在 Windows 上的 PS 和 PS 核心上工作(在版本5.1和7.2上测试)

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