Hai bisogno di trovare il nome di un computer Windows locale o remoto in uno script PowerShell? Non cercate oltre. In questo tutorial, imparerai come usare PowerShell per ottenere il nome di un computer in alcuni modi diversi e talvolta inaspettati.
Tabella dei contenuti
- Prerequisiti
- Usare il comando Hostname
- Using the System.Net.DNS .NET Class
- The GetHostName() Method
- The GetHostByName() Method
- Usare le variabili d’ambiente
- La variabile d’ambiente ComputerName
- La proprietà MachineName
- Usando WMI
- Trovare i nomi dei computer remoti
- Usare PowerShell Remoting
- Usando WMI
Prerequisiti
Questo articolo sarà un tutorial pratico. Se vuoi applicare i concetti che impari in questo tutorial, assicurati di avere PowerShell. Questo è tutto! L’articolo userà PowerShell 7 (l’ultimo al momento della scrittura) ma Windows PowerShell probabilmente funzionerà altrettanto bene.
Usare il comando Hostname
Prima dei giorni di PowerShell l’unico interprete di comandi di Windows che avevamo era il buon vecchio cmd .exe. A quel tempo, non avevamo bisogno di nessun fetido PowerShell per ottenere il nome di un computer; avevamo il comando hostname
!
Il comando hostname
non potrebbe essere più semplice. 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; fate riferimento alla proprietà HostName
, e PowerShell restituirà solo l’hostname.
::GetHostByName('').HostName::GetHostByName($Null).HostName
Usare le variabili d’ambiente
Le variabili d’ambiente sono sempre un ottimo posto per trovare informazioni sui computer Windows; usare PowerShell per ottenere il nome del computer non è diverso.
La variabile d’ambiente ComputerName
Ogni computer Windows conserva una variabile d’ambiente chiamata ComputerName
. Come tutte le altre variabili d’ambiente, è possibile accedere alle variabili d’ambiente dell’utente tramite il costrutto $env
PowerShell.
Per fare riferimento alla variabile d’ambiente COMPUTERNAME
, aprire PowerShell e precedere il nome della variabile d’ambiente con $env:
. PowerShell restituirà il nome del computer locale come una singola stringa.
$env:COMPUTERNAME
La proprietà MachineName
In alternativa, se, per qualche motivo, la variabile d’ambiente COMPUTERNAME
basata sull’utente non funziona nella vostra situazione, potete anche usare la proprietà MachineName
che fa parte del file .NET Environment
class.
Riferimento alla proprietà MachineName
nella classe Environment
.NET come mostrato qui sotto.
::MachineName
Usando WMI
Finalmente, avete sempre l’opzione di andare in WMI o CIM. Probabilmente dovreste fare questa la vostra ultima risorsa, dato che richiederà la maggior parte dell’overhead, anche se minuscola. Usare PowerShell per ottenere il nome di un computer con WMI sarebbe meglio per interrogare i nomi di computer remoti.
Se volete usare WMI per interrogare il nome di un computer locale, usate Get-CimInstance
per interrogare la classe Win32_ComputerSystem come mostrato sotto. Poiché Get-CimInstance
non restituisce il nome del computer ma un oggetto che rappresenta un’istanza CIM, fate riferimento alla proprietà Name
per restituire solo il nome del computer.
Get-CimInstance -ClassName Win32_ComputerSystem(Get-CimInstance -ClassName Win32_ComputerSystem).Name
Trovare i nomi dei computer remoti
Forse gestite molti computer e avete bisogno di trovare l’hostname di tutti loro. Tipicamente, l’hostname sarà rappresentato in Active Directory (AD) se si è in quel tipo di ambiente o raccolto da qualche altro strumento di gestione delle risorse. Ma se non lo è, potete sempre ripiegare su PowerShell.
Per usare PowerShell per ottenere i nomi dei computer remoti, avete due opzioni. Puoi avvolgere i metodi che hai imparato sopra in un blocco di script PowerShell Remoting o usare WMI.
Usare PowerShell Remoting
Piuttosto che coprire ogni metodo coperto in precedenza in questa sezione, sappi solo questo. Puoi avvolgere qualsiasi comando locale in uno scriptblock di PowerShell Remoting.
Se, per esempio, hai abilitato PowerShell Remoting su un computer remoto, puoi mettere uno qualsiasi dei metodi di cui sopra all’interno di uno scriptblock ed eseguire tale scriptblock con il comando Invoke-Command
.
Assumendo che tu abbia solo un indirizzo IP e abbia bisogno di trovare l’hostname di un computer con indirizzo IP di 192.168.1.2 e non siete in un ambiente AD, chiamate Invoke-Command
come qui sotto.
## 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
Se PowerShell Remoting è stato in grado di connettersi al computer remoto, PowerShell restituirà lo stesso output che avreste visto se aveste eseguito questo comando localmente.
Usando WMI
In alternativa, puoi anche usare WMI per usare PowerShell per ottenere il nome di un computer senza dover avvolgere un comando in un blocco di script. Il processo per trovare il nome di un computer remoto è quasi lo stesso di quello locale; basta usare il parametro ComputerName
.
Get-CimInstance -ClassName Win32_ComputerSystem -ComputerName 192.168.1.2(Get-CimInstance -ClassName Win32_ComputerSystem -ComputerName 192.168.1.2).Name
Il Get-CimInstance
richiede autenticazione. Se siete in un ambiente AD, non avrete bisogno di fornire alcuna credenziale come visto sopra. Tuttavia, se non siete in un ambiente AD, dovrete stabilire una nuova sessione CIM con la cmdlet New-CimSession
, usare Get-CimInstance
per usare quella sessione, e poi rimuovere la sessione CIM da soli. Sotto c’è uno snippet di codice su come farlo.
## 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
Se avete letto tutto questo tutorial, ora dovreste avere quasi tutti i modi più popolari per usare PowerShell per ottenere il nome di un computer. Anche se probabilmente ce ne sono molti altri che abbiamo tralasciato, questi sono tutti i modi in cui troverai questo compito realizzato in molti script.
Ora che sai come realizzare questo compito, prova a costruire uno script che otterrà i nomi dei computer in massa con un ciclo, magari tramite un CSV o un file di testo!