Adam Automator

Czy potrzebujesz znaleźć nazwę lokalnego lub zdalnego komputera Windows w skrypcie PowerShell? Nie szukaj dalej. W tym poradniku dowiesz się, jak wykorzystać PowerShell do uzyskania nazwy komputera na kilka różnych i czasami nieoczekiwanych sposobów.

Spis treści

Warunki wstępne

Ten artykuł będzie praktycznym poradnikiem. Jeśli chciałbyś zastosować koncepcje poznane w tym poradniku, upewnij się, że posiadasz PowerShell. To wszystko! Artykuł będzie używał PowerShell 7 (najnowszy w momencie pisania tego artykułu), ale Windows PowerShell prawdopodobnie będzie działał równie dobrze.

Używanie komendy Hostname

Przed pojawieniem się PowerShell’a jedynym interpreterem komend Windows był dobry stary cmd .exe. Wtedy nie potrzebowaliśmy żadnego śmierdzącego PowerShella, aby uzyskać nazwę komputera; mieliśmy polecenie hostname!

Polecenie hostname nie może być prostsze. 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; odwołaj się do właściwości HostName, a PowerShell zwróci tylko nazwę hosta.

::GetHostByName('').HostName::GetHostByName($Null).HostName

Używanie zmiennych środowiskowych

Zmienne środowiskowe są zawsze świetnym miejscem do znalezienia informacji o komputerach Windows; używanie PowerShella do uzyskania nazwy komputera nie jest inne.

Zmienna środowiskowa ComputerName

Każdy komputer Windows przechowuje zmienną środowiskową o nazwie ComputerName. Podobnie jak do wszystkich innych zmiennych środowiskowych, można uzyskać dostęp do zmiennych środowiskowych użytkownika za pomocą konstrukcji $env PowerShell.

Aby odwołać się do zmiennej środowiskowej COMPUTERNAME, należy otworzyć PowerShell i poprzedzić nazwę zmiennej środowiskowej znakiem $env:. PowerShell zwróci wtedy nazwę lokalnego komputera jako pojedynczy ciąg znaków.

$env:COMPUTERNAME

Właściwość MachineName

Alternatywnie, jeśli z jakiegoś powodu zmienna środowiskowa oparta na użytkowniku COMPUTERNAME nie działa w twojej sytuacji, możesz również użyć właściwości MachineName , która jest częścią .NET Environment class.

Odniesienie do właściwości MachineName w klasie Environment .NET, jak pokazano poniżej.

::MachineName

Używanie WMI

W końcu zawsze masz możliwość przejścia do WMI lub CIM. Prawdopodobnie powinieneś zrobić z tego ostatnią deskę ratunku, ponieważ będzie to wymagało największego narzutu, aczkolwiek malutkiego. Użycie PowerShell do uzyskania nazwy komputera za pomocą WMI będzie najlepsze do zapytań o zdalne nazwy komputerów.

Jeśli chcesz użyć WMI do zapytania o lokalną nazwę komputera, użyj Get-CimInstance do zapytania klasy Win32_ComputerSystem, jak pokazano poniżej. Ponieważ Get-CimInstance nie zwraca nazwy komputera, ale obiekt reprezentujący instancję CIM, odwołaj się do właściwości Name, aby zwrócić tylko nazwę komputera.

Get-CimInstance -ClassName Win32_ComputerSystem(Get-CimInstance -ClassName Win32_ComputerSystem).Name
Win32_ComputerSystem Query
Win32_ComputerSystem Query

Znajdowanie nazw komputerów zdalnych

Prawdopodobnie zarządzasz wieloma komputerami i musisz znaleźć nazwę hosta na wszystkich z nich. Zazwyczaj nazwa hosta będzie reprezentowana w Active Directory (AD), jeśli jesteś w tego typu środowisku lub zbierana przez inne narzędzie do zarządzania zasobami. Jeśli jednak tak nie jest, zawsze możesz skorzystać z PowerShella.

Aby użyć PowerShella do uzyskania nazw komputerów zdalnych, masz dwie opcje. Możesz albo zawinąć metody, które poznałeś powyżej, w blok skryptowy PowerShell Remoting, albo użyć WMI.

Używanie PowerShell Remoting

Nie musisz opisywać każdej z metod ponownie w tej sekcji, po prostu wiedz, że. Możesz zawinąć dowolne lokalne polecenie w blok skryptowy PowerShell Remoting.

Jeśli, na przykład, masz włączony PowerShell Remoting na zdalnym komputerze, możesz umieścić dowolną z powyższych metod wewnątrz bloku skryptowego i wykonać ten blok skryptowy za pomocą polecenia Invoke-Command.

Zakładając, że masz tylko adres IP i potrzebujesz znaleźć nazwę hosta komputera z adresem IP 192.168.1.2 i nie jesteś w środowisku AD, wywołaj Invoke-Command jak poniżej.

## 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

Jeśli PowerShell Remoting był w stanie połączyć się ze zdalnym komputerem, PowerShell zwróci takie same dane wyjściowe, jakie zobaczyłbyś, gdybyś uruchamiał to polecenie lokalnie.

Używanie WMI

Alternatywnie, można również użyć WMI, aby użyć PowerShell do uzyskania nazwy komputera bez konieczności zawijania polecenia wewnątrz bloku skryptu. Proces znajdowania nazwy zdalnego komputera jest prawie taki sam jak lokalnie; wystarczy użyć parametru ComputerName.

Get-CimInstance -ClassName Win32_ComputerSystem -ComputerName 192.168.1.2(Get-CimInstance -ClassName Win32_ComputerSystem -ComputerName 192.168.1.2).Name

Get-CimInstance wymaga uwierzytelnienia. Jeśli jesteś w środowisku AD, nie będziesz musiał podawać żadnych danych uwierzytelniających, jak widać powyżej. Jeśli jednak nie jesteś w środowisku AD, będziesz musiał utworzyć nową sesję CIM za pomocą cmdletu New-CimSession, użyć Get-CimInstance, aby użyć tej sesji, a następnie usunąć sesję CIM samodzielnie. Poniżej znajduje się wycinek kodu jak to zrobić.

## 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

Jeśli przeczytałeś cały ten poradnik, powinieneś teraz znać prawie wszystkie najpopularniejsze sposoby użycia PowerShell do uzyskania nazwy komputera. Chociaż prawdopodobnie jest jeszcze wiele innych, które przeoczyliśmy, są to wszystkie sposoby na wykonanie tego zadania w wielu skryptach.

Gdy już wiesz jak wykonać to zadanie, spróbuj zbudować skrypt, który będzie pobierał nazwy komputerów masowo za pomocą pętli, być może poprzez CSV lub plik tekstowy!

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.