web-dev-qa-db-ja.com

Powershell:FQDNホスト名の取得

PowerShellスクリプトを使用してWindowsサーバーのFQDN名を取得したい。私はこれまでに2つの解決策を見つけました:

$server =  Invoke-Command -ScriptBlock {hostname}

上記の行はサーバーの短い名前のみを出力します

$sysinfo = Get-WmiObject -Class Win32_ComputerSystem
$server = “{0}.{1}” -f $sysinfo.Name, $sysinfo.Domain

上記の2行でFQDNが取得されますが、これはホスト名だけを取得するのは本当に厄介なコードに見えます:(

だから、私の質問は、powershellでFQDNを取得する簡単な方法がありますか?私はbash/Perlコーダーで、最近powershellを取得しました。

ありがとう。

49
slayedbylucifer

方法:"$env:computername.$env:userdnsdomain"

これは実際にはonlyは、ユーザーがドメインにログインしている場合(つまりローカルアカウントがない場合)、サーバーと同じドメインにログインしている場合に機能します。

別の回答で参照されているようにこれを使用してください:

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

書き込みホスト$ myFQDN

67
aquinas

ローカルコンピューターの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
  • リモートマシンの場合は、ホストが到達可能であることを確認してください。
67
perilbrain

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クラス

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

$env:computerNameはホストのNetBIOS名を返すので、前の例は両方ともdnshostname.domainsuffix(FQDN)ではなくnetbioshostname.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名を使用しないでください。あなたのまたはサードパーティのアプリケーションがログに書き込む場合:「hostname.domainsuffixに接続できません」、どの名前を解決しようとしますか?ログに「netbiosname.domainsuffixに接続できません」というメッセージが表示されている場合は、怠programmerなプログラマーがNetBIOS名にドメインサフィックスを追加していることは間違いありません。 ...

7

また、レジストリから取得することもできます。

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

私は次の構文を使用します:

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

$ VMが起動しているかどうかは関係ありません...

1
SnakeNET

「名前」と「識別名」に基づいてサーバーの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
0
StevenMMK

次の追加があります。ホスト名から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
0
CBB

これはどう

$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(".")
0
"$env:computername.$env:userdnsdomain" 

このように分離すれば動作します

"$env:computername"+"$env:userdnsdomain"
0
julian

最初の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

それは私が望んでいたものではありません。

0
Oliver Gaida