2012-09-04 81 views
36

Deseo recuperar el nombre de FQDN del servidor de Windows mediante el script de powershell. He encontrado 2 solución hasta el momento:Powershell: Obtener nombre de host FQDN

$server = Invoke-Command -ScriptBlock {hostname} 

Por encima de la línea imprimirá sólo el nombre corto del servidor

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

Por encima de dos líneas me llevará el nombre completo, pero esto se ve código realmente desagradable para recuperar solo el nombre de host :(

por lo tanto, mi pregunta es, ¿hay una manera más fácil para obtener el FQDN en PowerShell. soy una fiesta/codificador perl y recientemente recogido PowerShell .. por lo que tienen dificultades.

Gracias.

+0

en lugar de utilizar invocar al mando, que puede hacer: $ servidor = (nombre de host) – x0n

Respuesta

48

¿Qué tal: "$env:computername.$env:userdnsdomain"

En realidad, esto sólo funciona si el usuario ha iniciado sesión en un dominio (es decir, no hay cuentas locales), registra en el mismo dominio que el servidor, y no funciona con espacio inconexo AD configuraciones de espacio.

utilizar esto como referencia en otra respuesta:

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

Write-Host $ myFQDN

+1

Fantástico. Esto es aún más corto. Gracias. Aceptaré las respuestas de ustedes dos pronto, ya que stackoverlow no me permite marcar la respuesta en este momento. – slayedbylucifer

+1

Esto no produce nada en mi sistema ... ya que no está dentro de ningún dominio ... – perilbrain

+0

Hmm ... ¿qué significa obtener el nombre de dominio completo de una computadora que no está EN UN dominio? ¿Cuál es la salida de tu respuesta? ¿Solo el nombre de la máquina? ¿Estás diciendo que mi respuesta ni siquiera muestra el nombre de tu máquina? – aquinas

49

Para obtener FQDN del equipo local:

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

o

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

Para obtener FQDN del equipo remoto:

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

o

Para el uso mejor valor con formato :

[System.Net.Dns]::GetHostByName("mytestpc1") | FL HostName | Out-String | %{ "{0}" -f $_.Split(':')[1].Trim() }; 
  • Para máquinas distancia Asegúrese de que el host es accesible.
+0

Gracias por la rápida respuesta. Esto funciona bien. Busqué en Google mucho antes de publicar esta pregunta, pero no encontré nada más cercano a lo que ha mencionado. podría indicarme documentos de Powershell ... si alguno. Gracias de nuevo. – slayedbylucifer

+3

Esta API está obsoleta. – Gilbert

+1

Esta es la forma correcta de obtener esta información cuando se ejecutan scripts de automatización. El $ env: userdnsdomain devuelve NULL a menos que el usuario haya iniciado sesión. – BFoust

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

$env:computerName vuelve NetBIOS nombre del host, por lo que los dos ejemplos anteriores vuelven netbioshostname.domainsuffix (no FQDN!) en lugar de dnshostname.domainsuffix (FQDN)

por ejemplo, host tiene FQDN aa-w2k12sv-storage.something.com y el nombre de NetBIOS aa-w2k12sv-stor (un caso fácil, por lo general cambiar el nombre de NetBIOS)

la utilidad hostname devuelve DNSHostName, es decir,, La primera parte del nombre de dominio completo y el código

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

devuelve el derecho FQDN

Comentario: nunca se usan los mismos nombres NetBIOS y DNS de los dominios de AD y anfitriones. Si su aplicación o la de un tercero escribe en el registro: "no se puede conectar con el nombre de host.domainsuffix", ¿qué nombre intenta resolver? Si ve en el registro "no se puede conectar a netbiosname.domainsuffix", sin dudas, un programador perezoso agregó un sufijo de dominio al nombre de NetBIOS y está seguro de que se trata de un error y puede abrir un ticket para obligarlos a solucionar el problema ...

20

local FQDN del ordenador a través de la clase dotNet

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

o

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

Referencia:

Dns Methods (System.Net)

nota: a GetHostByName método es obsoleto


equipo local FQDN a través de consulta WMI

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

Referencia:

Win32_ComputerSystem class

+0

Bien hecho. Los moldes '[string]' no son necesarios. Una variante del comando WMI (actualizado para CIM) que solo requiere una llamada: 'Get-CimInstance win32_computersystem | % {$ _. Nombre + '.' + $ _. Dominio} ' – mklement0

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

funcionará si separat ed a cabo como esto

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

Desafortunadamente, esto no es preciso, ya que no se garantiza que el dominio de inicio de sesión del usuario sea el mismo que el del servidor, especialmente en un entorno de producción, donde los usuarios pueden declararse en el dominio' example.net 'pero los servidores están en' siteA.example.net', 'siteB.example.net',' corp.example.net', etc. – Thomas

+0

el $ env: USERdnsdomain también puede estar vacío si ejecuta el script en un servidor local usuario (como NTAUTHOITY \ LOCAL_SERVICE) – CommonToast

1

Yo uso la siguiente sintaxis:

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

no importa si los $ VM está arriba o abajo ...

0

¿Qué tal esto

$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

Aquí hay una forma de determinar el FQDN de un servidor basado en "Nombre" y "Nombre distinguido". Que funciona para varios dominios:

$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

tengo el siguiente complemento .. Necesito separar el sufijo DNS desde el equipo .. y sólo yo "sabía" el nombre corto servidores alias ... y quiero saber qué el sufijo DNS es

#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

esto funciona tanto para alias dns como para nombres de dominio "profundos". por ejemplo server01.us.fred.com con C-Name MyAppServer .. puede establecer $ forname para "MyAppServer" y obtener el nombre corto y el nombre de dominio – CBB

+0

Considere eliminarlo mientras edita y cuando esté listo, recupere ... así estoy colocando el dv y el cuadro de diálogo de indicadores. –

Cuestiones relacionadas