Adam el Automatizador

¿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

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).

Running the hostname command
Running the hostname command

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.

Using the GetHostByName() method
Using the GetHostByName() method

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
Consulta del sistema informático Win32
Consulta del sistema informático Win32

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!

Deja una respuesta

Tu dirección de correo electrónico no será publicada.