¿Necesitas encontrar el nombre de un ordenador Windows local o remoto en un script de PowerShell? No busques más. En este tutorial, vas a aprender a utilizar PowerShell para obtener el nombre de un equipo de varias formas diferentes y a veces inesperadas.
Tabla de contenidos
- Requisitos previos
- Usando el comando Hostname
- Using the System.Net.DNS .NET Class
- The GetHostName() Method
- The GetHostByName() Method
- Utilización de variables de entorno
- La variable de entorno ComputerName
- La propiedad MachineName
- Usando WMI
- Encontrar nombres de ordenadores remotos
- Uso de PowerShell Remoting
- Usando WMI
Requisitos previos
Este artículo será un tutorial práctico. Si quieres aplicar los conceptos que aprendas en este tutorial, asegúrate de tener PowerShell. Eso es todo. El artículo utilizará PowerShell 7 (la última en el momento de escribir este artículo) pero Windows PowerShell probablemente funcionará igual de bien.
Usando el comando Hostname
Antes de los días de PowerShell el único intérprete de comandos de Windows que teníamos era el bueno de cmd .exe. Por aquel entonces, no necesitábamos ningún apestoso PowerShell para obtener el nombre de un ordenador; ¡teníamos el comando hostname
!
El comando hostname
no podía ser más sencillo. Open up a PowerShell (or even cmd .exe prompt) and type hostname
. Done. This command returns a single string (the computer name of the local computer).
Using the System.Net.DNS .NET Class
If you’d like to go the more PowerShell-centric approach, you can also reference a static method called GetHostByName()
located in the System.Net.DNS
.NET class or perhaps the GetHostName()
method.
The GetHostName() Method
Using the GetHostName()
method is probably the easiest way to use PowerShell to get a computer name. Simply call this static method with no arguments as shown below. This command will return a single string just like the hostname
command does.
::GetHostName()
The GetHostByName() Method
An alternative but similar System.Net.DNS
class method you can use to get a computer name is called GetHostByName()
. This method is actually a DNS resolver and can be used to look up other host names as well.
If, for example, you’d like to find the host name of the local computer, run ::GetHostByName($null)
or ::GetHostByName('')
.
::GetHostByName('')::GetHostByName($Null)
You’ll see that this method isn’t strictly meant for finding computer names; you can also lookup IP addresses as well via the AddressList
property as shown below.
If, however, you want to only find the local computer name; haga referencia a la propiedad HostName
, y PowerShell sólo devolverá el nombre del equipo.
::GetHostByName('').HostName::GetHostByName($Null).HostName
Utilización de variables de entorno
Las variables de entorno son siempre un buen lugar para encontrar información sobre los equipos de Windows; utilizar PowerShell para obtener el nombre de un equipo no es diferente.
La variable de entorno ComputerName
Todos los equipos de Windows almacenan una variable de entorno llamada ComputerName
. Al igual que todas las demás variables de entorno, puedes acceder a las variables de entorno del usuario a través de la construcción $env
de PowerShell.
Para hacer referencia a la variable de entorno COMPUTERNAME
, abre PowerShell y precede el nombre de la variable de entorno con $env:
. PowerShell devolverá entonces el nombre del equipo local como una única cadena.
$env:COMPUTERNAME
La propiedad MachineName
Alternativamente, si, por alguna razón, la variable de entorno basada en el usuario COMPUTERNAME
no funciona en tu situación, también puedes utilizar la propiedad MachineName
que forma parte de la plataforma .NET Environment
.
Referencia a la propiedad MachineName
en la clase Environment
.NET como se muestra a continuación.
::MachineName
Usando WMI
Por último, siempre tienes la opción de entrar en WMI o CIM. Probablemente debas hacer de esto tu último recurso ya que requerirá la mayor sobrecarga aunque sea mínima. El uso de PowerShell para obtener un nombre de equipo con WMI sería lo mejor para consultar nombres de equipos remotos.
Si desea utilizar WMI para consultar un nombre de equipo local, utilice Get-CimInstance
para consultar la clase Win32_ComputerSystem como se muestra a continuación. Dado que Get-CimInstance
no devuelve el nombre del ordenador sino un objeto que representa una instancia CIM, haga referencia a la propiedad Name
para devolver sólo el nombre del ordenador.
Get-CimInstance -ClassName Win32_ComputerSystem(Get-CimInstance -ClassName Win32_ComputerSystem).Name
Encontrar nombres de ordenadores remotos
Quizás gestiones muchos ordenadores y necesites encontrar el nombre del host en todos ellos. Normalmente, el nombre de host estará representado en Active Directory (AD) si estás en ese tipo de entorno o recogido por alguna otra herramienta de gestión de activos. Pero si no es así, siempre puedes recurrir a PowerShell.
Para utilizar PowerShell para obtener nombres de equipos remotos, tienes dos opciones. Puede envolver los métodos que aprendió anteriormente en un bloque de secuencia de comandos de PowerShell Remoting o utilizar WMI.
Uso de PowerShell Remoting
En lugar de cubrir cada método cubrir antes de nuevo en esta sección, sólo sé esto. Puede envolver cualquier comando local en un scriptblock de PowerShell Remoting.
Si, por ejemplo, tiene PowerShell Remoting habilitado en un equipo remoto, puede poner cualquiera de los métodos anteriores dentro de un scriptblock y ejecutar ese scriptblock con el comando Invoke-Command
.
Suponiendo que sólo tiene una dirección IP y necesita encontrar el nombre de host de un equipo con la dirección IP de 192.168.1.2 y no está en un entorno AD, llame a Invoke-Command
como a continuación.
## Create the pscredential object to pass to Invoke-Command$credential = Get-Credential## Run the command on the remote computerInvoke-Command -ComputerName 192.168.1.2 -ScriptBlock { ::GetHostName() } -Credential $credential
Si PowerShell Remoting fue capaz de conectarse al equipo remoto, PowerShell devolverá la misma salida que vería si estuviera ejecutando este comando localmente.
Usando WMI
Alternativamente, también puede utilizar WMI para usar PowerShell para obtener un nombre de equipo sin tener que envolver un comando dentro de un bloque de script. El proceso para encontrar un nombre de equipo remoto es casi el mismo que localmente; simplemente use el parámetro ComputerName
.
Get-CimInstance -ClassName Win32_ComputerSystem -ComputerName 192.168.1.2(Get-CimInstance -ClassName Win32_ComputerSystem -ComputerName 192.168.1.2).Name
El Get-CimInstance
requiere autenticación. Si estás en un entorno AD, no necesitarás suministrar ninguna credencial como se ha visto anteriormente. Sin embargo, si no está en un entorno AD, tendrá que establecer una nueva sesión CIM con el cmdlet New-CimSession
, utilizar Get-CimInstance
para usar esa sesión y luego eliminar la sesión CIM usted mismo. A continuación se muestra un fragmento de código sobre cómo hacerlo.
## Create the PSCredential object$credential = Get-Credential## Connect to the remote computer passing the creds and creating a remote session$cimSession = New-CimSession -ComputerName 192.168.1.5 -Credential $credential## Use the session to query WMI and reference the Name property(Get-CimInstance -Session $cimSession -ClassName Win32_ComputerSystem).Name
Si has leído todo este tutorial, ahora deberías tener casi todas las formas más populares de usar PowerShell para obtener un nombre de equipo. Aunque probablemente haya muchas más que se nos hayan pasado por alto, estas son todas las formas en las que encontrará esta tarea realizada en muchos scripts.
Ahora que sabe cómo realizar esta tarea, intente construir un script que obtenga los nombres de los equipos de forma masiva con un bucle quizás a través de un archivo CSV o de texto!