none
Powershell, Serverliste aus AD ermittel und diese nach Registryeintrag durchsuchen und ausgeben RRS feed

  • Frage

  • Write-Host "PS-Script zur Versionsbestimmung`n`n" -BackgroundColor Blue  
    
    
    # zu untersuchende Registrywerte (=schlüssel) bestimmen
    # Basisknoten : 'LocalMachine', 'ClassesRoot', 'CurrentConfig', 'CurrentUser' oder 'Users'
    $RegistryHive = "LocalMachine"
    
    # Pfad zum Schlüssel
    $RegistryKeyPath = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{F517B83A-28CB-48E8-B996-175F62730DBD}"
    
    #Name des Schlüssels
    $RegistryKeyName = "Version"
    
    
    # Zu überprüfender Rechner abfragen
    
    while ($true)
    {
        $RemoteServername = Read-Host -Prompt 'Namen des zu überprüfenden Servers/Rechners eingeben (Ende mit Ctrl+C oder Leerstring)'
    
        if ([string]::isNullOrEmpty($RemoteServername))
        { exit(0) }
    
        # Das Script benötitgt den laufenden Dienst 'RemoteRegistry' auf dem Zielrechner
        # Es wird untersucht, ob der Dienst läuft.
        # Falls der Dienst nicht läuft, wird versucht den Dienst zu remote starten.
        # Hierfür wird zuvor noch der Starttyp des Dienstes auf Manual gesetzt.
    
        # Falls diese aktion fehlschlä#gt, kann der Registryeintrag auf Remoterechner nicht bestimmt werden
        #  und das Script beendet sich mit einer Fehlermeldung.
        try 
        {
            $regService = Get-Service -ComputerName $RemoteServername -Name RemoteRegistry
    
            if ($regService.Status -ne [System.ServiceProcess.ServiceControllerStatus]::Running)
            {
                if ($regService.StartType -eq [System.ServiceProcess.ServiceStartMode]::Disabled)
                {
                    Set-Service -ComputerName $RemoteServername -Name RemoteRegistry –StartupType "Manual"
                }
    
                Write-Host "starte RemoteRegistry Dienst auf Rechner: $($RemoteServername)"
    
                Get-Service -ComputerName $RemoteServername -Name RemoteRegistry | Start-Service
            }
    
            $Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($RegistryHive, $RemoteServername)
            $RegKey= $Reg.OpenSubKey($RegistryKeyPath)
            if ($RegKey -eq $null)
            {
                Write-Host "Fehler: RegistryKey $($RegistryKeyPath) nicht vorhanden!"  -BackgroundColor Red
            }
            else
            {
                $Version = $RegKey.GetValue($RegistryKeyName)
    
                Write-Host "Registryeintrag ist: " -NoNewline
                Write-Host " $Version " -ForegroundColor Black -BackgroundColor Yellow
            }
        }
        catch
        {
            Write-Error "Fehler für Registrywert: $($_.Exception.Message)"  
        }
    }
    
    
    
    
    
    Hiermit kann Remote ein vorhandener Server nach dem Eintrag in der Registry abfragt werden. Was müsste geändert werden damit das Script die Server aus dem AD abfragt, diese dann verarbeitet und eine vorhanden oder fehlt Ausgabe als csv Datei ausgibt?
    Freitag, 20. April 2018 07:55

Antworten

  • Hallo,

    benutze "get-adcomputer", um deine Server in eine Variable zu packen, oder verwende "get-adgroupmember", um Mitglieder einer AD-Gruppe auszulesen. Speicher die Ausgabe in der Variable $Servers.

    Dann ersetzt Du deine "While-Schleife" durch ein "foreach ($Server in $Servers.SamAccountName) {}" und lässt das "Read-Host" weg.

    Du kannst dir wie folgt ein Array erstellen, schreibe das einfach in die Schleife und verknüpfe mit einer IF-Schleife oder erstelle dir ein Datenfeld, wo dann True oder False drin steht, die Variable musst du dann eben vorher setzen. Vor der o.g. foreach-schleife musst Du dein $Array = @() setzen.

    $Array += new-object psobject -property @{
    "Feldname" = $Variable
    "Feldname2" = "Irgendwas"
    "Feldname3" = $Server.IrgendeinObjekt
    }

    Das Array kannst Du mit dem Befehl "export-csv" weg speichern.

    MfG, Jannik

    Nachtrag: Benutze "Name" statt "SamAccountName" bei AD-Computerobjekten...

    • Bearbeitet JannikD Freitag, 20. April 2018 09:15
    • Als Antwort markiert partycolonia Freitag, 20. April 2018 09:39
    Freitag, 20. April 2018 08:47

Alle Antworten

  • Hallo,

    benutze "get-adcomputer", um deine Server in eine Variable zu packen, oder verwende "get-adgroupmember", um Mitglieder einer AD-Gruppe auszulesen. Speicher die Ausgabe in der Variable $Servers.

    Dann ersetzt Du deine "While-Schleife" durch ein "foreach ($Server in $Servers.SamAccountName) {}" und lässt das "Read-Host" weg.

    Du kannst dir wie folgt ein Array erstellen, schreibe das einfach in die Schleife und verknüpfe mit einer IF-Schleife oder erstelle dir ein Datenfeld, wo dann True oder False drin steht, die Variable musst du dann eben vorher setzen. Vor der o.g. foreach-schleife musst Du dein $Array = @() setzen.

    $Array += new-object psobject -property @{
    "Feldname" = $Variable
    "Feldname2" = "Irgendwas"
    "Feldname3" = $Server.IrgendeinObjekt
    }

    Das Array kannst Du mit dem Befehl "export-csv" weg speichern.

    MfG, Jannik

    Nachtrag: Benutze "Name" statt "SamAccountName" bei AD-Computerobjekten...

    • Bearbeitet JannikD Freitag, 20. April 2018 09:15
    • Als Antwort markiert partycolonia Freitag, 20. April 2018 09:39
    Freitag, 20. April 2018 08:47
  • Danke das du dir die Mühe gemacht hast, Jedoch bin ich noch recht neu in PS unterwegs und weis nicht wie ich die Änderungen am besten in den Code integrieren kann. 

    Vielleicht kannst du mir als Starthilfe ja den Code so aufbauen das er funktioniert und ich die Schematik dazu erkennen kann. 

    Danke ;-)

    Freitag, 20. April 2018 09:44
  • Hi,

    nein, Du sollst das autodidaktisch selber schaffen, aber ich helfe Dir gerne dabei.
    Fangen wir klein an.
    Versuche, dir deine Server mit den o.g. Befehlen in eine Variable zu speichern.
    Verwende als Hilfe: Get-AdComputer sowie Get-ADGroupMember. PS: Unten auf der Seite sind Beispiele

    Wenn Du das hast, schau, dass du lediglich die Computernamen, also das Attribut "Name" des AD-Objekts in der Variable $Servers gespeichert hast. Schlagwort "select-object".

    Danach musst Du nur ganz stumpf, wie bereits gesagt, dein "While ($true)" durch folgendes ersetzen:

    foreach ($RemoteServername in $Servers)

    MfG, Jannik

    Freitag, 20. April 2018 12:39