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を取得しました。
ありがとう。
方法:"$env:computername.$env:userdnsdomain"
これは実際にはonlyは、ユーザーがドメインにログインしている場合(つまりローカルアカウントがない場合)、サーバーと同じドメインにログインしている場合に機能します。
別の回答で参照されているようにこれを使用してください:
$myFQDN=(Get-WmiObject win32_computersystem).DNSHostName+"."+(Get-WmiObject win32_computersystem).Domain
書き込みホスト$ myFQDN
ローカルコンピューターの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
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
参照:
[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名にドメインサフィックスを追加していることは間違いありません。 ...
また、レジストリから取得することもできます。
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が起動しているかどうかは関係ありません...
「名前」と「識別名」に基づいてサーバーの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
これはどう
$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(".")
"$env:computername.$env:userdnsdomain"
このように分離すれば動作します
"$env:computername"+"$env:userdnsdomain"
最初の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
それは私が望んでいたものではありません。