Jump to content

la-kro

Members
  • Gesamte Inhalte

    8
  • Registriert seit

  • Letzter Besuch

Beiträge erstellt von la-kro

  1. 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:

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

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

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

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

  6. 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    
            }
        }
    }

     

  7. vor 2 Stunden schrieb BOfH_666:

    Hmmm ... ich kann mich natürlich auch irren (ich tue das ziemlich häufig), aber ist es für einen Anfänger nicht erstmal einfacher, die Befehle "ganz normal" - also sequenziell abzuarbeiten? ... zumal für Foreach-Object -Parallel auch Powershell 7 nötig ist, was noch nicht jeder nutzt. 

    ... und hier würd ich auch eher ein Export-Csv empfehlen. Wenn's schon mal strukturierte Daten sind  ....  ;-) 

    Danke erstmal für das Feedback. Ihr habt recht, das Foreach Parallel kann ich leider nicht nehmen. Geht erst anscheinend ab Version 3. Benutzte teilweise noch Version 2. Werde mal etwas rum experimentieren

  8. Moin Leute,

     

    hoffe ich bin hier richtig und ihr könnt mir helfen. Versuche gerade in Powershell einzusteigen und ehrlich gesagt finde ich es noch etwas kryptisch. Habe allerdings auch keinerlei Vorkenntnisse

    was Programmierung anbelangt.

    Sitze jetzt vor folgendem Problem. Ich möchte über PS alle PCs im Netzwerk nach bestimmten Information abragen. Es handelt sich alles um WMI Abfragen. So z.B. PC Model, S/N, IPconfig usw. Die PCs werden aus einer Liste ausgelesen

    und sollten dann in einer Tabelle Zeile für Zeile für den jeweiligen PC mit entsprechden Infos ausgegeben werden. Habe es nicht hinbekommen erst einen einzelnen PC mit allen Abfragen anzusteuern. Dementsprechend musste ich die WMI Befehle nacheinander ausführen. Habe jetzt also mehere "Listen". Also eine mit den S/N von allen PCs, eine mit den Modellen usw. Wie bekomme  ich diese jetzt so zusammengefügt, dass ich wie oben erwähnt eine Liste habe mit dem PCs und dahinter die entsprechenenden Werte? Momentan habe ich die einzelnen Werte für jeden PC in unterschiedlichen Zeilen.

    Hoffe ihr habt ein Idee? Habe das, was ich bis jetzt habe mal eingefügt. Danke im voraus

    $pcs = Get-Content C:\pc.txt
    test-connection -computername $pcs  -count 1 -quiet
    $cs = $pcs | foreach {get-wmiobject win32_Computersystem -computername $_} | select Name,Model
    $bios = $pcs | foreach {get-wmiobject win32_bios -computername $_} | select serialnumber 
    $ip = $pcs | foreach {Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE –ComputerName $_} | select IPAddress,DefaultIPGateway,Description,Index
    $os = $pcs | foreach {get-wmiobject win32_Operatingsystem osarchitecture -computername $_} | select osarchitecture
    $oscap = $pcs | foreach {get-wmiobject win32_Operatingsystem caption -computername $_} | select 
    $s = $cs + $bios + $ip + $os + $oscap | select name,model,serialnumber,IPAddress,DefaultIPGateway,Description,Index,caption,osarchitecture | format-table 

     

×
×
  • Neu erstellen...