簡體   English   中英

Powershell:獲取 FQDN 主機名

[英]Powershell: Get FQDN Hostname

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

謝謝。

獲取本地計算機的 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

通過 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 類

[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 名稱中添加了域后綴,您可以確定這是一個錯誤,並且可以開票強制他們修復該問題...

這適用於 Windows 上的 PS 和 PS Core(在版本 5.1 和 7.2 上測試)

[System.Net.Dns]::Resolve($null).HostName
(Get-ADComputer $(hostname)).DNSHostName

這是我一直使用的方法:

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

它也可以從注冊表中檢索:

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

我使用以下語法:

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

$VM 是向上還是向下都沒有關系...

要獲取與第一個 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

如果您有多個網絡適配器並且多個適配器處於活動狀態(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()

這個怎么樣

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

這是一種根據“名稱”和“可分辨名稱”確定服務器 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
"$env:computername.$env:userdnsdomain" 

如果像這樣分開就可以了

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM