Adam the Automator

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

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).

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; 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
Win32_ComputerSystem Query
Win32_ComputerSystem Query

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!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.