P> Precisa de encontrar o nome de um computador local ou remoto com Windows num script PowerShell? Não procure mais. Neste tutorial, você vai aprender como usar o PowerShell para obter um nome de computador de algumas maneiras diferentes e às vezes inesperadas.
Table of Contents
- Pré-requisitos
- Usando o comando Hostname
- Using the System.Net.DNS .NET Class
- The GetHostName() Method
- The GetHostByName() Method
- Usando variáveis de ambiente
- A variável de ambiente ComputerName Environment Variable
- The MachineName Property
- Usando o WMI
- Finding Remote Computer Names
- Utilizar a Remoção de PowerShell
- Usando WMI
Pré-requisitos
Este artigo será um tutorial prático. Se você gostaria de aplicar os conceitos que você aprendeu neste tutorial, por favor tenha certeza de que você tem o PowerShell. É isso mesmo! O artigo irá usar o PowerShell 7 (o mais recente a partir desta escrita) mas o Windows PowerShell irá provavelmente funcionar tão bem quanto.
Usando o comando Hostname
Back antes dos dias do PowerShell o único interpretador de comandos do Windows que tínhamos era o bom ol’ cmd .exe. Nessa altura, não precisávamos de nenhum PowerShell fedorento para obter um nome de computador; tínhamos o comando hostname
p> O comando hostname
não podia ser mais simples. 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; referencie o HostName
propriedade, e PowerShell apenas devolverá o nome da máquina.
::GetHostByName('').HostName::GetHostByName($Null).HostName
Usando variáveis de ambiente
As variáveis de ambiente são sempre um ótimo lugar para encontrar informações sobre computadores Windows; usar o PowerShell para obter um nome de computador não é diferente.
A variável de ambiente ComputerName Environment Variable
Todos os computadores Windows armazenam uma variável de ambiente chamada ComputerName
. Como todas as outras variáveis de ambiente, pode aceder às variáveis de ambiente do utilizador através do $env
PowerShell build.
Para referenciar o COMPUTERNAME
variável de ambiente, abra o PowerShell e dê um prefácio ao nome da variável de ambiente com $env:
. PowerShell irá então retornar o nome do computador local como uma única string.
$env:COMPUTERNAME
The MachineName Property
Alternatively, se, por alguma razão, a variável de ambiente baseada no usuário COMPUTERNAME
não funcionar na sua situação, você também pode usar a propriedade MachineName
que faz parte da propriedade .NET Environment
class.
Referência a MachineName
property in the Environment
.NET como mostrado abaixo.
::MachineName
Usando o WMI
Finalmente, você sempre tem a opção de entrar no WMI ou CIM. Você provavelmente deveria fazer deste o seu último recurso, pois ele exigirá a maior parte das despesas gerais, embora minúsculas. Usando PowerShell para obter um nome de computador com WMI seria melhor consultar nomes de computadores remotos.
Se você gostaria de usar WMI para consultar um nome de computador local, use Get-CimInstance
para consultar a classe Win32_ComputerSystem como mostrado abaixo. Como Get-CimInstance
não retorna o nome do computador mas sim um objeto representando uma instância CIM, faça referência à propriedade Name
para retornar apenas o nome do computador.
Get-CimInstance -ClassName Win32_ComputerSystem(Get-CimInstance -ClassName Win32_ComputerSystem).Name
Finding Remote Computer Names
Talvez você gerencie muitos computadores e precise encontrar o nome da máquina em todos eles. Normalmente, o hostname será representado no Active Directory (AD) se você estiver nesse tipo de ambiente ou coletado por alguma outra ferramenta de gerenciamento de ativos. Mas se não estiver, pode sempre voltar ao PowerShell.
Para usar o PowerShell para obter nomes de computadores remotos, tem duas opções. Pode utilizar os métodos que aprendeu acima num bloco de script de Remoção de PowerShell ou utilizar WMI.
Utilizar a Remoção de PowerShell
Cobrir novamente cada método nesta secção, apenas saiba isto. Você pode colocar qualquer comando local em um PowerShell Remoting scriptblock.
Se, por exemplo, você tiver o PowerShell Remoting ativado em um computador remoto, você pode colocar qualquer um dos métodos acima dentro de um scriptblock e executar esse scriptblock com o comando Invoke-Command
.
Assumindo que você só tem um endereço IP e precisa encontrar o nome da máquina de um computador com o endereço IP de 192.168.1.2 e você não está num ambiente AD, ligue Invoke-Command
como abaixo.
## 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 o PowerShell Remoting for capaz de se ligar ao computador remoto, o PowerShell irá retornar a mesma saída que você veria se estivesse a executar este comando localmente.
Usando WMI
Alternativamente, você também pode usar o WMI para usar o PowerShell para obter o nome de um computador sem ter que embrulhar um comando dentro de um bloco de scripts. O processo para encontrar um nome de computador remoto é quase o mesmo que localmente; simplesmente use o ComputerName
parâmetro.
Get-CimInstance -ClassName Win32_ComputerSystem -ComputerName 192.168.1.2(Get-CimInstance -ClassName Win32_ComputerSystem -ComputerName 192.168.1.2).Name
O Get-CimInstance
requer autenticação. Se você estiver em um ambiente AD, você não precisará fornecer nenhuma credencial, como visto acima. No entanto, se você não estiver em um ambiente AD, você precisará estabelecer uma nova sessão CIM com o New-CimSession
cmdlet, use Get-CimInstance
para usar essa sessão, e então remova a sessão CIM você mesmo. Abaixo está um trecho de código sobre como fazer isso.
## 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 você leu todo este tutorial, agora você deve ter quase todas as formas mais populares de usar o PowerShell para obter um nome de computador. Embora provavelmente haja muitas mais que nos escaparam, estas são todas as maneiras que você encontrará esta tarefa realizada em muitos scripts.
Agora você saiba como realizar esta tarefa, tente construir um script que irá obter nomes de computador em massa com um loop, talvez através de um CSV ou arquivo de texto!