Müssen Sie den Namen eines lokalen oder entfernten Windows-Computers in einem PowerShell-Skript finden? Suchen Sie nicht weiter. In diesem Tutorial lernen Sie, wie Sie PowerShell verwenden, um einen Computernamen auf verschiedene und manchmal unerwartete Weise zu ermitteln.
Inhaltsverzeichnis
- Voraussetzungen
- Verwendung des Befehls „Hostname“
- Using the System.Net.DNS .NET Class
- The GetHostName() Method
- The GetHostByName() Method
- Verwenden von Umgebungsvariablen
- Die Umgebungsvariable ComputerName
- Die MachineName-Eigenschaft
- WMI verwenden
- Finden von entfernten Computernamen
- Verwenden von PowerShell Remoting
- Verwenden von WMI
Voraussetzungen
Dieser Artikel ist ein praktisches Tutorial. Wenn Sie die Konzepte, die Sie in diesem Tutorial lernen, anwenden möchten, stellen Sie bitte sicher, dass Sie über PowerShell verfügen. Das war’s! In diesem Artikel wird PowerShell 7 (die neueste Version zum Zeitpunkt der Erstellung dieses Artikels) verwendet, aber Windows PowerShell funktioniert wahrscheinlich genauso gut.
Verwendung des Befehls „Hostname“
Vor den Tagen der PowerShell war der einzige Windows-Befehlsinterpreter, den wir hatten, die gute alte cmd.exe. Damals brauchten wir keine stinkende PowerShell, um einen Computernamen zu erhalten; wir hatten den hostname
-Befehl!
Der hostname
-Befehl könnte nicht einfacher sein. 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; referenzieren Sie die HostName
-Eigenschaft, und PowerShell gibt nur den Hostnamen zurück.
::GetHostByName('').HostName::GetHostByName($Null).HostName
Verwenden von Umgebungsvariablen
Umgebungsvariablen sind immer ein guter Ort, um Informationen über Windows-Computer zu finden; die Verwendung von PowerShell zum Abrufen eines Computernamens ist nicht anders.
Die Umgebungsvariable ComputerName
Jeder Windows-Computer speichert eine Umgebungsvariable namens ComputerName
. Wie alle anderen Umgebungsvariablen können Sie über das $env
PowerShell-Konstrukt auf Benutzerumgebungsvariablen zugreifen.
Um auf die COMPUTERNAME
-Umgebungsvariable zu verweisen, öffnen Sie PowerShell und stellen dem Namen der Umgebungsvariablen $env:
voran. PowerShell gibt dann den lokalen Computernamen als einzelne Zeichenfolge zurück.
$env:COMPUTERNAME
Die MachineName-Eigenschaft
Alternativ können Sie, wenn die benutzerbasierte COMPUTERNAME
-Umgebungsvariable aus irgendeinem Grund in Ihrer Situation nicht funktioniert, auch die MachineName
-Eigenschaft verwenden, die Teil des .NET Environment
Klasse ist.
Beziehen Sie sich auf die MachineName
Eigenschaft in der Environment
.NET-Klasse wie unten gezeigt.
::MachineName
WMI verwenden
Schließlich haben Sie immer die Möglichkeit, WMI oder CIM zu verwenden. Dies ist wahrscheinlich die letzte Möglichkeit, da sie den größten, wenn auch geringen, Aufwand erfordert. Die Verwendung von PowerShell zum Abrufen eines Computernamens mit WMI eignet sich am besten zum Abfragen von Remote-Computernamen.
Wenn Sie WMI zum Abfragen eines lokalen Computernamens verwenden möchten, verwenden Sie Get-CimInstance
zum Abfragen der Klasse Win32_ComputerSystem wie unten gezeigt. Da Get-CimInstance
nicht den Computernamen zurückgibt, sondern ein Objekt, das eine CIM-Instanz darstellt, verweisen Sie auf die Eigenschaft Name
, um nur den Computernamen zurückzugeben.
Get-CimInstance -ClassName Win32_ComputerSystem(Get-CimInstance -ClassName Win32_ComputerSystem).Name
Finden von entfernten Computernamen
Vielleicht verwalten Sie viele Computer und müssen den Hostnamen für alle diese Computer finden. Normalerweise ist der Hostname in Active Directory (AD) enthalten, wenn Sie in einer solchen Umgebung arbeiten, oder er wird von einem anderen Asset-Management-Tool erfasst. Wenn dies nicht der Fall ist, können Sie jederzeit auf PowerShell zurückgreifen.
Um PowerShell zum Abrufen von Remote-Computernamen zu verwenden, haben Sie zwei Möglichkeiten. Sie können entweder die Methoden, die Sie oben gelernt haben, in einen PowerShell Remoting-Skriptblock verpacken oder WMI verwenden.
Verwenden von PowerShell Remoting
Anstatt in diesem Abschnitt jede Methode noch einmal zu behandeln, sollten Sie nur Folgendes wissen. Sie können jeden lokalen Befehl in einen PowerShell Remoting-Skriptblock verpacken.
Wenn Sie beispielsweise PowerShell Remoting auf einem Remotecomputer aktiviert haben, können Sie jede der oben genannten Methoden in einen Skriptblock einfügen und diesen Skriptblock mit dem Invoke-Command
-Befehl ausführen.
Angenommen, Sie haben nur eine IP-Adresse und müssen den Hostnamen eines Computers mit der IP-Adresse 192.168.1.2 und Sie befinden sich nicht in einer AD-Umgebung, rufen Sie Invoke-Command
wie unten auf.
## 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
Wenn PowerShell Remoting eine Verbindung mit dem Remotecomputer herstellen konnte, gibt PowerShell die gleiche Ausgabe zurück, die Sie sehen würden, wenn Sie diesen Befehl lokal ausführen würden.
Verwenden von WMI
Alternativ können Sie auch WMI verwenden, um mit PowerShell einen Computernamen abzurufen, ohne einen Befehl in einen Skriptblock einschließen zu müssen. Das Verfahren zum Ermitteln eines Remote-Computernamens ist fast dasselbe wie lokal; verwenden Sie einfach den ComputerName
-Parameter.
Get-CimInstance -ClassName Win32_ComputerSystem -ComputerName 192.168.1.2(Get-CimInstance -ClassName Win32_ComputerSystem -ComputerName 192.168.1.2).Name
Der Get-CimInstance
erfordert eine Authentifizierung. Wenn Sie sich in einer AD-Umgebung befinden, müssen Sie keine Anmeldedaten angeben. Wenn Sie sich jedoch nicht in einer AD-Umgebung befinden, müssen Sie mit dem Cmdlet New-CimSession
eine neue CIM-Sitzung einrichten, Get-CimInstance
verwenden, um diese Sitzung zu verwenden, und dann die CIM-Sitzung selbst entfernen. Nachfolgend finden Sie einen Codeausschnitt, der zeigt, wie das geht.
## 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
Wenn Sie diesen gesamten Lehrgang durchgelesen haben, sollten Sie nun fast alle gängigen Methoden kennen, um mit PowerShell einen Computernamen zu ermitteln. Obwohl es wahrscheinlich noch viele weitere gibt, die wir übersehen haben, sind dies alle Möglichkeiten, die Sie in vielen Skripten finden werden.
Nachdem Sie nun wissen, wie Sie diese Aufgabe bewältigen können, versuchen Sie, ein Skript zu erstellen, das Computernamen in großen Mengen mit einer Schleife abruft, vielleicht über eine CSV- oder Textdatei!