Adam the Automator

Potřebujete ve skriptu prostředí PowerShell zjistit název místního nebo vzdáleného počítače systému Windows? Už nemusíte hledat dál. V tomto návodu se dozvíte, jak pomocí prostředí PowerShell získat název počítače několika různými a někdy nečekanými způsoby.

Obsah

Předpoklady

Tento článek bude praktickým návodem. Pokud chcete použít koncepty, které se v tomto tutoriálu naučíte, ujistěte se, že máte k dispozici prostředí PowerShell. To je vše! V článku bude použito prostředí PowerShell 7 (nejnovější verze v době psaní tohoto článku), ale prostředí Windows PowerShell bude pravděpodobně fungovat stejně dobře.

Použití příkazu Hostname

Před dobou prostředí PowerShell byl jediným příkazovým interpretem systému Windows starý dobrý cmd .exe. Tehdy jsme k získání názvu počítače nepotřebovali žádný smradlavý PowerShell; měli jsme příkaz hostname!

Příkaz hostname nemůže být jednodušší. 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; odkažte se na vlastnost HostName a prostředí PowerShell vrátí pouze název hostitele.

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

Použití proměnných prostředí

Proměnné prostředí jsou vždy skvělým místem pro zjištění informací o počítačích se systémem Windows; použití prostředí PowerShell pro zjištění názvu počítače není jiné.

Proměnná prostředí ComputerName

Každý počítač se systémem Windows uchovává proměnnou prostředí s názvem ComputerName. Stejně jako ke všem ostatním proměnným prostředí můžete k uživatelským proměnným prostředí přistupovat prostřednictvím konstrukce $env prostředí PowerShell.

Chcete-li se odkázat na proměnnou prostředí COMPUTERNAME, otevřete prostředí PowerShell a před název proměnné prostředí vložte $env:. Prostředí PowerShell pak vrátí název místního počítače jako jediný řetězec.

$env:COMPUTERNAME

Vlastnost MachineName

Pokud z nějakého důvodu nefunguje ve vaší situaci uživatelská COMPUTERNAME proměnná prostředí, můžete také použít vlastnost MachineName, která je součástí .NET Environment třídy.

Vlastnost MachineName ve třídě Environment .NET, jak je uvedeno níže.

::MachineName

Použití rozhraní WMI

Nakonec máte vždy možnost přejít do rozhraní WMI nebo CIM. Pravděpodobně byste měli tuto možnost zvolit jako poslední, protože bude vyžadovat největší režii, i když nepatrnou. Použití prostředí PowerShell k získání názvu počítače pomocí rozhraní WMI by bylo nejlepší pro dotazování na vzdálené názvy počítačů.

Pokud chcete použít rozhraní WMI k dotazování na místní název počítače, použijte Get-CimInstance k dotazování třídy Win32_ComputerSystem, jak je uvedeno níže. Protože Get-CimInstance nevrací název počítače, ale objekt představující instanci CIM, odkažte se na vlastnost Name, abyste vrátili pouze název počítače.

Get-CimInstance -ClassName Win32_ComputerSystem(Get-CimInstance -ClassName Win32_ComputerSystem).Name
Dotaz na Win32_ComputerSystem
Dotaz na Win32_ComputerSystem

Zjištění názvů vzdálených počítačů

Možná spravujete mnoho počítačů a potřebujete zjistit název hostitele na všech z nich. Obvykle bude název hostitele zastoupen v adresáři Active Directory (AD), pokud jste v takovém prostředí, nebo bude shromážděn nějakým jiným nástrojem pro správu prostředků. Pokud tomu tak ale není, můžete se vždy vrátit k prostředí PowerShell.

Chcete-li použít prostředí PowerShell k získání názvů vzdálených počítačů, máte dvě možnosti. Buď můžete metody, které jste se naučili výše, zabalit do bloku skriptů PowerShell Remoting, nebo použít rozhraní WMI.

Použití PowerShell Remoting

Než abychom se v této části znovu zabývali jednotlivými dříve popsanými metodami, stačí vědět toto. Do bloku skriptů PowerShell Remoting můžete zabalit libovolný místní příkaz.

Pokud máte například povolenou funkci PowerShell Remoting na vzdáleném počítači, můžete do bloku skriptů vložit libovolnou z výše uvedených metod a spustit tento blok skriptů pomocí příkazu Invoke-Command.

Předpokládejme, že máte k dispozici pouze adresu IP a potřebujete zjistit název hostitele počítače s adresou IP 192.168.1.

Předpokládejme, že máte k dispozici pouze adresu IP.2 a nenacházíte se v prostředí AD, zavolejte Invoke-Command jako níže.

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

Pokud se prostředí PowerShell Remoting podařilo připojit ke vzdálenému počítači, vrátí prostředí PowerShell stejný výstup, jako kdybyste tento příkaz spouštěli lokálně.

Použití rozhraní WMI

Případně můžete také použít rozhraní WMI a pomocí prostředí PowerShell získat název počítače, aniž byste museli příkaz zabalit do bloku skriptů. Postup pro zjištění názvu vzdáleného počítače je téměř stejný jako místní; stačí použít parametr ComputerName.

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

Příkaz Get-CimInstance vyžaduje ověření. Pokud jste v prostředí AD, nemusíte zadávat žádná pověření, jak je vidět výše. Pokud však nejste v prostředí AD, budete muset vytvořit novou relaci CIM pomocí rutiny New-CimSession, použít Get-CimInstance pro použití této relace a poté relaci CIM sami odebrat. Níže je uveden úryvek kódu, jak to provést.

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

Pokud jste přečetli celý tento návod, měli byste nyní znát téměř všechny nejoblíbenější způsoby, jak pomocí prostředí PowerShell získat název počítače. Ačkoli pravděpodobně existuje mnoho dalších, které jsme vynechali, toto jsou všechny způsoby, jak tuto úlohu provést v mnoha skriptech.

Teď, když víte, jak tuto úlohu provést, zkuste vytvořit skript, který bude hromadně získávat názvy počítačů pomocí smyčky třeba prostřednictvím souboru CSV nebo textového souboru!

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.