la-kro 0 Geschrieben 13. Mai 2020 Autor Melden Teilen Geschrieben 13. Mai 2020 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 . 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 } } } Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 13. Mai 2020 Melden Teilen Geschrieben 13. Mai 2020 vor 30 Minuten schrieb la-kro: Allerdings mussdte ich CIMsession/Instance herausnehmen. Das gibt es offentsichtlich in Powershell 2.0 noch nicht . 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. Zitieren Link zu diesem Kommentar
lefg 276 Geschrieben 13. Mai 2020 Melden Teilen Geschrieben 13. Mai 2020 Moin Ob nicht ein fertiges Produkt ein Weg wäre auf die Mühe der Programmierung zu verzichten? Zitieren Link zu diesem Kommentar
la-kro 0 Geschrieben 13. Mai 2020 Autor Melden Teilen Geschrieben 13. Mai 2020 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 ;) Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 13. Mai 2020 Melden Teilen Geschrieben 13. Mai 2020 (bearbeitet) 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 .... !!! .... das ist keine Mühe, das ist ein Vergnügen!!! 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 13. Mai 2020 von BOfH_666 Zitieren Link zu diesem Kommentar
la-kro 0 Geschrieben 13. Mai 2020 Autor Melden Teilen Geschrieben 13. Mai 2020 vor 11 Minuten schrieb BOfH_666: Was für eine ketzerische Frage .... !!! .... das ist keine Mühe, das ist ein Vergnügen!!! 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 Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 13. Mai 2020 Melden Teilen Geschrieben 13. Mai 2020 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 Zitieren Link zu diesem Kommentar
la-kro 0 Geschrieben 13. Mai 2020 Autor Melden Teilen Geschrieben 13. Mai 2020 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 Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 13. Mai 2020 Melden Teilen Geschrieben 13. Mai 2020 (bearbeitet) 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 13. Mai 2020 von BOfH_666 Zitieren Link zu diesem Kommentar
la-kro 0 Geschrieben 13. Mai 2020 Autor Melden Teilen Geschrieben 13. Mai 2020 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 ;) Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 13. Mai 2020 Melden Teilen Geschrieben 13. Mai 2020 Noch ne Kleinigkeit: Wenn Du hier im Forum antwortest, musst Du nicht immer den kompletten Vor-Beitrag zitieren. Lösch doch bitte einfach alles aus dem Zitat raus, was nicht nötig ist ... im Zweifel das gesamte Zitat. Das macht Deine Antworten leichter lesbar. Danke schon mal. Zitieren Link zu diesem Kommentar
la-kro 0 Geschrieben 13. Mai 2020 Autor Melden Teilen Geschrieben 13. Mai 2020 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 Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 13. Mai 2020 Melden Teilen Geschrieben 13. Mai 2020 (bearbeitet) Bitte nicht immer wieder alles komplett zitieren! Was funktioniert nicht, welche Variablen sind leer? Bitte im Hinterkopf behalten: Wir können Deinen Bildschirm nicht sehen und auch Deine Gedanken (leider) nicht lesen. bearbeitet 13. Mai 2020 von BOfH_666 Zitieren Link zu diesem Kommentar
lefg 276 Geschrieben 13. Mai 2020 Melden Teilen Geschrieben 13. Mai 2020 vor 6 Stunden schrieb BOfH_666: Was für eine ketzerische Frage .... !!! .... das ist keine Mühe, das ist ein Vergnügen!!! Ja, das hatte ich auch mal so. Zitieren Link zu diesem Kommentar
daabm 1.366 Geschrieben 17. Mai 2020 Melden Teilen Geschrieben 17. Mai 2020 Mir sind das hier definitiv zu viele Vollzitate und zu wenige zielgerichtete Einzelprobleme. Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.