IP-Adresse per PowerShell Skript auslesen (Nur aktiven Netzwerkadapter anzeigen)?

Das Ergebnis basiert auf 3 Abstimmungen

Ja 67%
Sind Batch Skripte komplizierter als PowerShell Skripte? 33%
Nein 0%

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet
Ja

Dejavue... https://www.gutefrage.net/frage/ip-adresse-per-batch-datei-auslesen-virtuelle-adapter-ausschliessen

Die Abläufe sind die Gleichen...

Wir müssen den/die Physischen aussieben.

Dazu schauen wir ersmal einfach in der Powershellconsole welche CIMInstanzen und zum Thema Network zur Verfügung stehen:

Get-CimClass |Where {$_.CimClassName -like '*NetWork*'}

Für uns ist wieder relvant: Win32_NetworkAdapter und Win32_NetworkAdapterConfiguration

Wie auch in Batch sollte man sich die Struktur einer Kommandoausgabe anschauen:

Get-CimInstance -Class Win32_NetworkAdapter|Format-List *

Da ist auch wieder unser PhysicalAdapter, welcher den Unterschied macht:

Get-CimInstance -Class Win32_NetworkAdapter -Filter Get-CimInstance -Class Win32_NetworkAdapter -Filter "PhysicalAdapter=$true and NetEnabled=$true"|fl *

Wir nehmen uns wieder AdapterType, MACAddress, Name, Speed:

Get-CimInstance -Class Win32_NetworkAdapter -Filter "PhysicalAdapter=$true and NetEnabled=$true"|select -property AdapterType, MACAddress, Name, Speed

Jetzt kombinieren wir die ermittelten aktiven physischen Adapter mit der Anfrage auf die Win32_NetworkAdapterConfiguration. (kurze Version😏)

Get-CimInstance -Class Win32_NetworkAdapter -Filter "PhysicalAdapter=$true and NetEnabled=$true"|select -property AdapterType, MACAddress, Name, NetConnectionID, Speed|%{
 $_
 $MACFilterString = 'MACAddress="{0}"' -f $_.MACAddress #Filterstring basteln
 Get-CimInstance -Class Win32_NetworkAdapterConfiguration -Filter $MACFilterString |select -property DefaultIPGateway,DHCPEnabled,DHCPServer,DNSServerSearchOrder,IPAddress
}
pause 

Die Ausgabe ist einfach ein Sammelsurium an Werten🤢🤮

Viel leichte lässt es sich arbeiten, wenn man alles schön zusammenführt.

$Netzwerkadapters = Get-CimInstance -Class Win32_NetworkAdapter -Filter "PhysicalAdapter=$true and NetEnabled=$true"|select -property AdapterType, MACAddress, Name, NetConnectionID, Speed
   #für jeden gefundenen aktiven physischen Adapter
   #für alle potenziellen Pysischen Adapter in dem Objectarray "$NetworkAdapterConfiguration" machen und in einer ObjectArray-Variable speichern 
  $MyPhysicalNetWorks = $Netzwerkadapters|Foreach-Object{
    $MACFilterString = 'MACAddress="{0}"' -f $_.MACAddress #Filterstring basteln
     #...und die ausgewählten Konfigwerte für den Adapter  mit dem Filterstring abrufen und  in Variable  ablegen
    $NetworkAdapterConfiguration = Get-CimInstance -Class Win32_NetworkAdapterConfiguration -Filter  $MACFilterString |select -property DefaultIPGateway,DHCPEnabled,DHCPServer,DNSServerSearchOrder,IPAddress
    $NetworkAdapterConfiguration|Foreach-Object{
     #DefaultIPGateway, IPAddress, DNSServerSearchOrder sind  ArrayOfStrings , welche wir erstmal zerlegen und  einzelnen Objectvariablen zuweisen müssen
     #am besten  ein Neues Object  bauen
    $MyConfigObj = [PSCustomObject]@{
      GatewayIPv4 = ($_.DefaultIPGateway[0])
      GatewayIPv6 = $_.DefaultIPGateway[1]
      IPv4 = $_.IPAddress[0]
      VLIPv6 = $_.IPAddress[1]
      tempIPv6 = $_.IPAddress[2]
      IPv6 = $_.IPAddress[3]
      DNSServer1 = $_.DNSServerSearchOrder[0]
      DNSServer2 = $_.DNSServerSearchOrder[1]
      DHCPServer = $_.DHCPServer
      DHCPEnabled = $_.DHCPEnabled
    }
  }
   #dem neu erstellten Objekt "$MyConfigObj" auch noch die übrigen Propertys des aktuellen Netzwerkadapters zuweisen (AdapterType, MACAddress, Name, Speed)
  $Netadapter = $_   #Die ausgewählten Werte des aktuellen Netzwerkadapters in Object zwischenspeichern (brauchen wir um den Wert des Members zuzuweisen )
  $Netadapter|Get-Member -MemberType NoteProperty -Force|Foreach-Object{
    $MyConfigObj | Add-Member -MemberType NoteProperty -Name $_.Name -Value $Netadapter.($_.Name)
  }
  $MyConfigObj  # ...und das Objekt in die Pipline schicken
}

'mal unser neues ObjektArray $MyNetPhysicalWorks anzeigen:' 
$MyPhysicalNetWorks|fl *


 # ein wenig  hübsch anzeigen:
 #für jedes Object in $MyNetPhysicalWorks  (% alias Foreach-Object)
$MyPhysicalNetWorks|%{
  Write-Host ('Verbindung        = {0}' -f $_.NetConnectionID) -f black -b White
  Write-Host ('AdapterType       = {0}' -f $_.AdapterType)  -Foreground Green
  Write-Host ('Name              = {0}' -f $_.Name)  -Foreground Green
  Write-Host ('MACAddress        = {0}' -f $_.MACAddress)  -Fo Green
  Write-Host ('Geschwindigkeit   = {0}' -f $_.Speed)  -f Green
  Write-Host ('IPv4-Adresse      = {0}' -f $_.IPv4)  -Fo Blue
  Write-Host ('IPv6-Adresse      = {0}' -f $_.IPv6)  -F Blue
  Write-Host ('Temp IPv6-Adresse = {0}' -f $_.tempIPv6)  -Foreground Blue
  Write-Host ('Verb.lokale IPv6  = {0}' -f $_.VLIPv6)  -Foreground Blue
  Write-Host ('Standardgateway   = {0}' -f $_.GatewayIPv4)  -Fo Red
  Write-Host ('GateWay IPv6      = {0}' -f $_.GatewayIPv6)  -Fo Red
  Write-Host ('DHCP aktiv        = {0}' -f $_.DHCPEnabled)  -F Magenta
  Write-Host ('DHCP Server       = {0}' -f $_.DHCPServer)  -F Magenta
  Write-Host ('DNSServer 1       = {0}' -f $_.DNSServer1)  -F Yellow
  Write-Host ('DNSServer 2       = {0}' -f $_.DNSServer2)  -F Yellow
  ''
}
pause

Das erstellen/zusammenführen von Objecten ist zwar schon etwas über Anfänger hinaus.... Powershell arbeitet aber nunmal mit Objekten und nicht mit Strings, wie Batch.

so sieht es bei zwei aktiven Adaptern aus:

Bild zum Beitrag

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
 - (Computer, Technik, Spiele und Gaming)
dann guck dir doch mal an was in $Netzwerkadapter

steckt , wenn es da eine info gibt , dann kannst du ja gucken ob das wort virtuel drinne steckt .

ZaoDaDong  07.02.2022, 11:42

Auch auf "TAP" kann man prüfen, das sind dann die virtuellen Adapter, die VPN-Software anlegt.

2