Jump to content

PC Netzwerkabfrage mit Poweshell


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Moin,

 

danke erstmal an alle. Leider kann ich die Win7 Rechner nicht aussortierten (liegt nicht in meiner Hand). Allerdings gibt es auch schon Win10 Rechner im Netz ;) Das Script sollte ja für alles funktionieren.

Einfach das Powershell bei den Win 7ern geht leider auch nicht. Soweit funktioniert das Script von @BOfH_666 ganz gut. Allerdings mussdte ich CIMsession/Instance herausnehmen. Das gibt es offentsichtlich in Powershell 2.0 noch nicht :crying:. Habe es dann durch die ganz normalen WMI Abfragen ersetzt. Funktioniert auch soweit. Habe jetzt das Einlesen der IPadressen von den PC`s geändert. Diese stehen in einer XML Datei. Wenn ich jetzt die Adressen, welche in dem Array gespeichert sind, dan muss ich sie ja immer mit $variable.address abrufen. Das funktioniert auch soweit, nur das er anscheined das PScustonobejct vollständig ignoriert. Die Variablen für das Customobject enthalten aber genau die Werte, welche sie enthalten sollten. Woran kann das liegen. Habe ja nur in der aktuell laufenden Variable der Schleife ein .address angehängt. Ohne das .address funktioniert es gar nicht und die Variable enthält auch komplett flasche Werte (Host, anstelle der IP Adresse)

Habe den Code mal angehängt.

[XML]$a = get-content c:/hosts.xml
$a.hosts.valueservers.valueserver.host
$pcs = $a.hosts.valueservers.valueserver.host
foreach ($pc in $pcs) {
    if (Test-Connection -ComputerName $pc.address -Count 1 -Quiet) {
       Write-host Information of $pc.address -Foregroundcolor blue -Backgroundcolor white 
        $CS   = Get-wmiobject Win32_ComputerSystem -Computername $pc.address
        $BIOS = Get-wmiobject Win32_BIOS -Computername $pc.address
        $IP = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE –ComputerName $pc.address
        $OS = get-wmiobject win32_Operatingsystem osarchitecture -computername $pc.address
        $Win = get-wmiobject win32_Operatingsystem caption -computername $pc.address
        $Mon = get-wmiobject wmimonitorid -computername $pc.address -namespace root\wmi|foreach-object{($_.SerialnumberID|foreach-object{[char]$_}) -join „“}
        $prog= Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\* | select-object Displayname 
           [PSCustomObject]@{
            ComputerName            = $Cs.Name
            Model                   = $CS.Model
            SerialNumber            = $BIOS.SerialNumber
            "Monitor Serial"        = $Mon
            "OS Version"            = $Win.caption
            "OS 32/64bit"           = $OS.Osarchitecture
            IPAddress               = $IP.IPAddress
            Gateway                 = $IP.DefaultGateway
            "NWcard index"          = $IP.Index
            Framework               = $prog    
        }
    }
}

 

Link zu diesem Kommentar
vor 30 Minuten schrieb la-kro:

Allerdings mussdte ich CIMsession/Instance herausnehmen. Das gibt es offentsichtlich in Powershell 2.0 noch nicht :crying:

Ich leiste mir den Luxus Windows 7 und Powershell vor Version 5.1 nicht mehr zu supporten.  ;-) 

 

Ohne Deine XML-Datei zu sehen, können wir dazu schwerlich was Intelligentes beitragen. Eine CSV-Datei wäre aber vermutlich deutlich einfacher zu handhaben. ;-);-) 

vor 30 Minuten schrieb la-kro:

$prog= Get-ItemProperty HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\* | select-object Displayname 

 

Diese Zeile fragt den lokalen PC ab, auf dem das Script läuft ... und das wieder und wieder bei jedem Schleifendurchlauf. ;-) 

Link zu diesem Kommentar
vor einer Stunde schrieb BOfH_666:

Ich leiste mir den Luxus Windows 7 und Powershell vor Version 5.1 nicht mehr zu supporten.  ;-) 

 

Ohne Deine XML-Datei zu sehen, können wir dazu schwerlich was Intelligentes beitragen. Eine CSV-Datei wäre aber vermutlich deutlich einfacher zu handhaben. ;-);-) 

Diese Zeile fragt den lokalen PC ab, auf dem das Script läuft ... und das wieder und wieder bei jedem Schleifendurchlauf. ;-) 

Dachte ich mir schon ;)

Link zu diesem Kommentar
vor einer Stunde schrieb lefg:

Ob nicht ein fertiges Produkt ein Weg wäre auf die Mühe der Programmierung zu verzichten?

Was für eine ketzerische Frage .... !!!  ;-)  :pfui1: :aetsch2:  .... das ist keine Mühe, das ist ein Vergnügen!!!   :aetsch3:

vor 17 Minuten schrieb la-kro:

Dachte ich mir schon ;)

Was jetzt?  

 

Magst Du uns die XML zeigen oder stellst Du auf CSV um oder noch ganz was anderes? Du kannst die Registry auch remote abfragen. Dafür musst Du dann aber Invoke-Command benutzen, weil Get-ItemProperty selbst nicht remoting-fähig ist. 

bearbeitet von BOfH_666
Link zu diesem Kommentar
vor 11 Minuten schrieb BOfH_666:

Was für eine ketzerische Frage .... !!!  ;-)  :pfui1: :aetsch2:  .... das ist keine Mühe, das ist ein Vergnügen!!!   :aetsch3:

Was jetzt?  

 

Magst Du uns die XML zeigen oder stellst Du auf CSV um oder noch ganz was anderes? Du kannst die Registry auch remote abfragen. Dafür musst Du dann aber Invoke-Command benutzen, weil Get-ItemProperty selbst nicht remoting-fähig ist. 

Meinte wegen dem Auslesen der "Installed Programs". Habe die XML mal angehängt.

hosts.xml

Link zu diesem Kommentar

Du versuchst die XML mit dem Pfad c:/hosts.xml einzulesen ... funktioniert das? Ich würde nur zur Sicherheit einen Backslash benutzen. ;-)

 

Und Deine XML ist falsch. Die Werte müssen in den Tags stehen, nicht in den Namen/Beschreibungen ... ich hab das mal angepasst und hier angehängt. Dann sollte es auch $PC sein und nicht $PC.Address.

 

... 'kannst Du dann so überprüfen ... 

foreach ($pc in $a.hosts.valueservers.valueserver.host){
    "Adresse: '$($pc)'"
}

 

hosts.xml

Link zu diesem Kommentar
vor 4 Minuten schrieb BOfH_666:

Du versuchst die XML mit dem Pfad c:/hosts.xml einzulesen ... funktioniert das? Ich würde nur zur Sicherheit einen Backslash benutzen. ;-)

 

Und Deine XML ist falsch. Die Werte müssen in den Tags stehen, nicht in den Namen/Beschreibungen ... ich hab das mal angepasst und hier angehängt. Dann sollte es auch $PC sein und nicht $PC.Address.

 

... 'kannst Du dann so überprüfen ... 


foreach ($pc in $a.hosts.valueservers.valueserver.host){
    "Adresse: '$($pc)'"
}

 

hosts.xml 270 B · 1 download

Das ist ja ärgerlich. Dann liegt das an der XML Datei das er das nicht richtig auslesen kann? Die kann ich leider nicht ändern. Gehört zu unserer Systemsoftware und ist von der Entwicklung so vorgegeben. Glaub ich mache das denn einfach mit ner CSV Datei. Ist zwar nicht so schön, aber anscheinend wesentlich einfacher

Link zu diesem Kommentar
vor einer Stunde schrieb la-kro:

Das ist ja ärgerlich. Dann liegt das an der XML Datei das er das nicht richtig auslesen kann? Die kann ich leider nicht ändern. Gehört zu unserer Systemsoftware und ist von der Entwicklung so vorgegeben. 

Hmmmm ... ich bin jetzt auch nicht der XML-Profi ... vielleicht kommt hier noch ein anderer Kollege und kann das lösen ... ich schau mir das später nochmal an .... 

 

Edit:

 

Ich weiß schon, warum ich immer Kopfschmerzen kriege, wenn ich mich mit XML beschäftigen muss ... das ist einfach nicht Admin-Hirne gemacht ... ;-)  ... aber wenn man dann erstmal wieder weiß, wie's geht, geht's wieder ne Weile.

 

[XML]$a = get-content c:/hosts.xml
$a.hosts.valueservers.valueserver.host
$IPListe = $a.hosts.valueservers.valueserver.host.GetEnumerator().address
foreach ($IP in $IPListe) {
    if (Test-Connection -ComputerName $IP -Count 1 -Quiet) {
        Write-Verbose "Information of $IP"
        $CS   = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $IP
        $IP   = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE –ComputerName $IP
        $OS   = Get-WmiObject -Class win32_Operatingsystem -ComputerName $IP
        $Mon  = Get-WmiObject -Class wmimonitorid -ComputerName $IP -Namespace root\wmi | ForEach-Object { ($_.SerialnumberID | foreach-object { [char]$_ }) -join '' }
        $BIOS = Get-WmiObject -Class Win32_BIOS -ComputerName $IP
        
        $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $IP)
        $regkey = $reg.OpenSubkey("SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall")
        $prog = 
        foreach ($SubKeyName in $regkey.GetSubKeyNames()) {
            $SubKey = $reg.OpenSubkey("SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$SubKeyName")
            $SubKey.GetValue("DisplayName")
        }
        [PSCustomObject]@{
            ComputerName     = $Cs.Name
            Model            = $CS.Model
            SerialNumber     = $BIOS.SerialNumber
            "Monitor Serial" = $Mon
            "OS Version"     = $OS.caption
            "OS 32/64bit"    = $OS.Osarchitecture
            IPAddress        = $IP.IPAddress
            Gateway          = $IP.DefaultGateway
            "NWcard index"   = $IP.Index
            Framework        = $prog    
        }
    }
}

Ich weiß ja nicht, warum Du die ganzen UnInstall-Keys aus der Registry auslesen möchtest, aber es könnte sein, dass da deutlich mehr ausgelesen wird als Du erwartest. Auf einem normalen System kommt da gern mal Einiges zusammen. Und Du liest im Zweifel nur den 64- oder 32-bit-Schlüssel aus - je nach Zielsystem.

 

Na dann probier mal, ob das so läuft.

 

Und Ubrigens: Was benutzt Du als Code-Editor? Meine DRINGENDE Empfehlung wäre, VSCode und die ganzen Hilfen zu benutzen, die VSCode mitbringt. Das würde die Qualität und Lesbarkeit Deines Codes deutlich verbessern, denke ich.

bearbeitet von BOfH_666
Link zu diesem Kommentar
vor 1 Stunde schrieb BOfH_666:

Hmmmm ... ich bin jetzt auch nicht der XML-Profi ... vielleicht kommt hier noch ein anderer Kollege und kann das lösen ... ich schau mir das später nochmal an .... 

 

Edit:

 

Ich weiß schon, warum ich immer Kopfschmerzen kriege, wenn ich mich mit XML beschäftigen muss ... das ist einfach nicht Admin-Hirne gemacht ... ;-)  ... aber wenn man dann erstmal wieder weiß, wie's geht, geht's wieder ne Weile.

 


[XML]$a = get-content c:/hosts.xml
$a.hosts.valueservers.valueserver.host
$IPListe = $a.hosts.valueservers.valueserver.host.GetEnumerator().address
foreach ($IP in $IPListe) {
    if (Test-Connection -ComputerName $IP -Count 1 -Quiet) {
        Write-Verbose "Information of $IP"
        $CS   = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $IP
        $IP   = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE –ComputerName $IP
        $OS   = Get-WmiObject -Class win32_Operatingsystem -ComputerName $IP
        $Mon  = Get-WmiObject -Class wmimonitorid -ComputerName $IP -Namespace root\wmi | ForEach-Object { ($_.SerialnumberID | foreach-object { [char]$_ }) -join '' }
        $BIOS = Get-WmiObject -Class Win32_BIOS -ComputerName $IP
        
        $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $IP)
        $regkey = $reg.OpenSubkey("SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall")
        $prog = 
        foreach ($SubKeyName in $regkey.GetSubKeyNames()) {
            $SubKey = $reg.OpenSubkey("SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$SubKeyName")
            $SubKey.GetValue("DisplayName")
        }
        [PSCustomObject]@{
            ComputerName     = $Cs.Name
            Model            = $CS.Model
            SerialNumber     = $BIOS.SerialNumber
            "Monitor Serial" = $Mon
            "OS Version"     = $OS.caption
            "OS 32/64bit"    = $OS.Osarchitecture
            IPAddress        = $IP.IPAddress
            Gateway          = $IP.DefaultGateway
            "NWcard index"   = $IP.Index
            Framework        = $prog    
        }
    }
}

Ich weiß ja nicht, warum Du die ganzen UnInstall-Keys aus der Registry auslesen möchtest, aber es könnte sein, dass da deutlich mehr ausgelesen wird als Du erwartest. Auf einem normalen System kommt da gern mal Einiges zusammen. Und Du liest im Zweifel nur den 64- oder 32-bit-Schlüssel aus - je nach Zielsystem.

 

Na dann probier mal, ob das so läuft.

 

Und Ubrigens: Was benutzt Du als Code-Editor? Meine DRINGENDE Empfehlung wäre, VSCode und die ganzen Hilfen zu benutzen, die VSCode mitbringt. Das würde die Qualität und Lesbarkeit Deines Codes deutlich verbessern, denke ich.

Danke. Ich probiere den VScode Editor und das Script mal aus. Mit den Programmen auslesen hast du recht, auch mit den 32/64bit. Hatte das nur erstmal so zum Testen eingefügt. Evtl muss ich mir da mal was anderes einfallen lassen. Habe gesehen du hast Enumerator beim XML lesen eingefügt. Höre ich zum ersten Mal. Bin ja aber auch neu ;)

Link zu diesem Kommentar
vor 2 Stunden schrieb BOfH_666:

Hmmmm ... ich bin jetzt auch nicht der XML-Profi ... vielleicht kommt hier noch ein anderer Kollege und kann das lösen ... ich schau mir das später nochmal an .... 

 

Edit:

 

Ich weiß schon, warum ich immer Kopfschmerzen kriege, wenn ich mich mit XML beschäftigen muss ... das ist einfach nicht Admin-Hirne gemacht ... ;-)  ... aber wenn man dann erstmal wieder weiß, wie's geht, geht's wieder ne Weile.

 


[XML]$a = get-content c:/hosts.xml
$a.hosts.valueservers.valueserver.host
$IPListe = $a.hosts.valueservers.valueserver.host.GetEnumerator().address
foreach ($IP in $IPListe) {
    if (Test-Connection -ComputerName $IP -Count 1 -Quiet) {
        Write-Verbose "Information of $IP"
        $CS   = Get-WmiObject -Class Win32_ComputerSystem -ComputerName $IP
        $IP   = Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE –ComputerName $IP
        $OS   = Get-WmiObject -Class win32_Operatingsystem -ComputerName $IP
        $Mon  = Get-WmiObject -Class wmimonitorid -ComputerName $IP -Namespace root\wmi | ForEach-Object { ($_.SerialnumberID | foreach-object { [char]$_ }) -join '' }
        $BIOS = Get-WmiObject -Class Win32_BIOS -ComputerName $IP
        
        $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $IP)
        $regkey = $reg.OpenSubkey("SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall")
        $prog = 
        foreach ($SubKeyName in $regkey.GetSubKeyNames()) {
            $SubKey = $reg.OpenSubkey("SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$SubKeyName")
            $SubKey.GetValue("DisplayName")
        }
        [PSCustomObject]@{
            ComputerName     = $Cs.Name
            Model            = $CS.Model
            SerialNumber     = $BIOS.SerialNumber
            "Monitor Serial" = $Mon
            "OS Version"     = $OS.caption
            "OS 32/64bit"    = $OS.Osarchitecture
            IPAddress        = $IP.IPAddress
            Gateway          = $IP.DefaultGateway
            "NWcard index"   = $IP.Index
            Framework        = $prog    
        }
    }
}

Ich weiß ja nicht, warum Du die ganzen UnInstall-Keys aus der Registry auslesen möchtest, aber es könnte sein, dass da deutlich mehr ausgelesen wird als Du erwartest. Auf einem normalen System kommt da gern mal Einiges zusammen. Und Du liest im Zweifel nur den 64- oder 32-bit-Schlüssel aus - je nach Zielsystem.

 

Na dann probier mal, ob das so läuft.

 

Und Ubrigens: Was benutzt Du als Code-Editor? Meine DRINGENDE Empfehlung wäre, VSCode und die ganzen Hilfen zu benutzen, die VSCode mitbringt. Das würde die Qualität und Lesbarkeit Deines Codes deutlich verbessern, denke ich.

Das funktioniert so leider nicht. Die Variablen sind auch leer :ohje2:

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...