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
- Použití příkazu Hostname
- Using the System.Net.DNS .NET Class
- The GetHostName() Method
- The GetHostByName() Method
- Použití proměnných prostředí
- Proměnná prostředí ComputerName
- Vlastnost MachineName
- Použití rozhraní WMI
- Zjištění názvů vzdálených počítačů
- Použití PowerShell Remoting
- Použití rozhraní WMI
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).
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; 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
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!