Manchmal sind es die Kleinigkeiten, die einen unnötig viel Zeit kosten, wie das ermitteln einer IP-Adresse in der Powershell.
Wer kennt das nicht? Man ist gerade am Ausarbeiten eines Skripts, hat einen Computernamen, übergeben als Parameter oder aus einer Datei ausgelesen, und benötigt für eine bestimmte Funktion die IP-Adresse der Maschine.
Dazu existieren in der PowerShell vielfältige Möglichkeiten:
Alle Drei liefern das gewünschte Ergebnis und es gibt noch eine ganze Reihe weiterer. Doch für die weitere Verarbeitung im Skript muss man sich überlegen wie man die Daten „abgreift“. Genau diese Überlegung stellte unser Kollege Matthias Braun an und weist uns vorher freundlich darauf hin, sich so wie er eine eigene Sammlung an Snippets anzulegen. Denn es begegnen uns immer wieder dieselben Aufgabenstellungen und wer will das Rad schon permanent neu erfinden?
Function Get-ComputerIPAddress() { <# .SYNOPSIS Get the IPAddress from the Computer name .PARAMETER [String] Computer name .OUTPUTS [String] IPAddress .EXAMPLE $ComputerName | Get-ComputerIPAddress Get-ComputerIPAddress("name12345") #> [CmdletBinding()] [OutputType([String])] Param ( [Parameter(Mandatory=$true, ValueFromPipeline=$true, Position=0)] [String] $ComputerName ) Begin { $tmp_validate = $null $var_IPAddress = $null } Process{ try{ # Preferd command is Resolve-DnsName but only available from PS version 4. # So I check if is available $tmp_validate = Get-Command Resolve-DnsName -ErrorAction SilentlyContinue # $tmp_Validaition is $null when the command Resolve-DnsName is not available If($tmp_validate -ne $null){ # I'm happy :) $var_IPAddress = Resolve-DnsName -Name $ComputerName -Type A -ErrorAction SilentlyContinue | Select IPAddress return $var_IPAddress.IPAddress } else{ # I'm sad... but we have a alternate solutioTest-Connectionn $var_IPAddress = [System.Net.DNS]::GetHostAddresses($ComputerName) | Where-Object { $_.AddressFamily -eq 'InterNetwork' } |Select-Object -Expand IPAddressToString } return $var_IPAddress } catch { return $var_IPAddress } } End{ # CleanUp Clear-variable $tmp_validate Clear-variable $var_IPAddress } }
$ComputerName | Get-ComputerIPAddress
Get-ComputerIPAddress(„name12345“)
In der Funktion nutzen wir zwei Varianten zum Ermitteln der Adresse. Bevorzugt wird Resolve-DNSName, welches allerdings erst mit PowerShell 4 zum Einsatz kam. Darum prüft das Skript zuerst die PowerShell-Version und sollte es sich um eine frühere handeln, greift es quasi zum Backup und benutzt [System.Net.DNS]::GetHostAddresses()
Die .NET-Klasse zeichnet sich durch die schnelle Abfrage aus und weil sie, anders als die Test-Connection, kein Ping-Resultat ausgibt.
[System.Net.DNS]::GetHostAddresses(<ComputerName>)
Mit beiden Varianten ist es auch möglich IPv6-Adressen abzufragen, was aber in den meisten Umgebungen noch nicht nötig ist.
Bei der Weitergabe des Master-Skripts nicht vergessen, dass eine externe Funktion mit eingebunden wurde.