2012-09-04 105 views
36

我想通过powershell脚本检索Windows服务器的FQDN名称。我发现2解决方案迄今:Powershell:获取FQDN主机名

$server = Invoke-Command -ScriptBlock {hostname} 

上面一行将打印服务器的只是短名称

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

以上两线将得到我的FQDN,但是这看起来真是可恶代码只获得主机名:(

所以,我的问题是,是否有更简单的方法来获取FQDN在PowerShell中,我是一个bash/perl的编码器和最近拿起PowerShell的..所以觉得很难。

谢谢。

+0

而不是使用调用命令,你可以这样做:$服务器=(主机名) – x0n

回答

48

如何:"$env:computername.$env:userdnsdomain"

这实际上只有作品如果用户登录到域(即没有本地户口),登录到同一域作为服务器,并且不与工作脱节的名字空间AD配置。

使用此作为另一个答案引用:

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

写主机$ myFQDN

+1

太棒了。这甚至更短。谢谢。我很快就会接受你们的答案,因为stackoverlow现在不允许我标记答案。 – slayedbylucifer

+1

这不会在我的系统上输出.....因为它不在任何域内.. – perilbrain

+0

嗯......那么获取非域名计算机的完全限定域名是什么意思?你的答案输出了什么?只是机器名称?你说我的答案甚至没有显示你的机器名称? – aquinas

49

以获取本地计算机的FQDN:

[System.Net.Dns]::GetHostByName(($env:computerName)) 

[System.Net.Dns]::GetHostByName(($env:computerName)) | FL HostName | Out-String | %{ "{0}" -f $_.Split(':')[1].Trim() }; 

要获得远程计算机的FQDN:

[System.Net.Dns]::GetHostByName("mytestpc1") 

为了更好的格式化值使用:

[System.Net.Dns]::GetHostByName("mytestpc1") | FL HostName | Out-String | %{ "{0}" -f $_.Split(':')[1].Trim() }; 
  • 远程机器确保主机可达。
+0

谢谢你的快速反应。这很好。在发布这个问题之前我搜索了很多东西,但没有发现更接近你提到的东西。你能指出我的PowerShell文件..如果有的话。再次感谢。 – slayedbylucifer

+3

此API已过时。 – Gilbert

+1

这是在运行自动化脚本时获取此信息的正确方法。除非用户登录,否则$ env:userdnsdomain将返回NULL。 – BFoust

5
[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名称。如果您的第三方应用程序写入日志:“无法连接到hostname.domainsuffix”,它尝试解决什么名称?如果您在日志中看到“无法连接到netbiosname.domainsuffix”,毫无疑问,一个懒惰的程序员将域名后缀添加到NetBIOS名称,并且您确定这是一个错误,并且可以打开一张票以强制他们解决问题...

20

局部孔DOTNET类计算机FQDN

[System.Net.Dns]::GetHostEntry([string]$env:computername).HostName 

[System.Net.Dns]::GetHostEntry([string]"localhost").HostName 

参考:

Dns Methods (System.Net)

注:的gethostbyname方法已过时


通过WMI查询

本地计算机FQDN

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

参考:

Win32_ComputerSystem class

+0

很好地完成。 '[string]'强制转换不是必需的。 WMI命令(针对CIM更新)的变体只需要_one_调用:'Get-CimInstance win32_computersystem | %{$ _。Name +'。' + $ _。Domain}' – mklement0

0
"$env:computername.$env:userdnsdomain" 

会工作,如果分隔符编出这样的

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

不幸的是,这并不准确,因为用户登录域不能保证与服务器域相同,特别是在生产环境中,用户可以在域example.net中声明'但服务器在'siteA.example.net','siteB.example.net','corp.example.net'等。 – Thomas

+0

$ env:USERdnsdomain也可能是空的,如果你在本地运行脚本用户(如NTAUTHOITY \ LOCAL_SERVICE) – CommonToast

1

我使用的语法如下:

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

如果$ VM是涨还是跌都无所谓......

0

这个怎么样

$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

以下是根据“名称”和“专有名称”确定服务器的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

我有以下几点补充。我需要从主机中分离出来的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

这适用于dns别名以及“深层”域名.. 例如server01.us.fred.com与C名称MyAppServer ..您可以将$ forname设置为“MyAppServer”并且得到短名称以及域名 – CBB

+0

考虑在编辑时删除它,当准备好时取消删除...就像这样我悬停了dv和标志对话框。 –