none
Powershell und AD RRS feed

  • Frage

  • Hallo Zusammen

    Ich bin ziemlich neu hier, deswegen entschuldigt bitte, sollte ich die falsche Kategorie gewählt oder einen anderen Fauxpas begangen haben.

    Zu meiner Frage:

    Ich habe von einem "Kunden" folgende Aufgaben erhalten:

    Ich soll ein Powershell-Script erstellen, welches aus einer Liste (.txt) Servernamen ausliest, die schon als Computer-Objekt in der AD vorhanden sind. Sollte dies nicht der Fall sein (also wenn die in der Liste vorkommenden Servernamen nicht in der AD sind), soll eine Fehlermeldung ausgegeben werden. Die Servernamen sind pro Zeile eingeschrieben.
    Daraufhin sollen die in der Liste vorkommenden Servernamen darauf überprüft werden, ob sie der "Gruppe X" angehören. Ist dies der Fall, soll der nächste Servername überprüft werden. Ist dies nicht der Fall, so soll der Server der "Gruppe X" hinzugefügt werden.


    Hier vllt ein kleiner Pseudo-Code:

    IF Eintrag.Liste = in AD vorhanden Then
    goto next
    else
    ErrorMessage

    IF Eintrag.Liste = in Gruppe vorhanden
    goto next
    else
    AddToGroup

    Das Script sollte so aufgebaut sein, dass es sauber durchlaufen kann, ohne dass es irgendwo abbricht, weil es einen Server nicht findet oder dieser doppelt vorhanden ist oder sonst was...^^

    Hoffe Ihr könnt mir helfen :)

    LG

    10xRel0aded

    Montag, 5. Januar 2015 09:52

Antworten

  • Hi,

    hierzu eine Übersicht der verfügbaren AD-CMDlets: http://technet.microsoft.com/de-de/library/ee617195.aspx

    Mit "Get-Content" kannst Du Dir die TXT-Datei einlesen und mit einer ForEach-Schleife jeden Eintrag prüfen:

    http://technet.microsoft.com/de-de/library/ee176843.aspx

    Bitte hab Verständnis dafür, dass wir Dir hier kein fertiges Skript schreiben, ein bisschen Eigen-Invest an Gehirnschmalz ist schon noch erforderlich! :-)

    Ein typisches Skript würde z.B. so aussehen:

    $Serverlist = Get-Content <Pfad>\<Text-Datei> 
    
    ForEach ($Server in $ServerList)
       {
       if (Get-ADComputer -Filter {samaccountname -eq $Server})
          {
          <Deine gewünschte Aktion, z.B. Fehler-Ausgabe>
          }
       }
    
    usw. usw.
    Wenn Du noch irgendwo nicht weiterkommst, kannst Du natürlich hier fragen! ;-)


    Gruß

    Ben

    MCITP Windows 7

    Wenn Dir meine Antwort hilft, markiere sie bitte entsprechend als Antwort! Danke! :-)

    Hinweis: Meine Posts werden "wie besehen" ohne jedwede Gewähr bereitgestellt, da menschliche, technische und andere Fehler nicht ausgeschlossen werden können.

    • Als Antwort vorgeschlagen Lennart Mittwoch, 7. Januar 2015 10:39
    • Als Antwort markiert 10xRel0aded Donnerstag, 8. Januar 2015 09:08
    Montag, 5. Januar 2015 11:12
  • Hallo 10xRel0aded !

    Die Aufgabenstellung sieht mir eher wie eine ‚Hausaufgabe‘ aus…

    Wie Ben schon sagte richtig sagte:
    ... ein bisschen Eigen-Invest an Gehirnschmalz ist schon noch erforderlich! :-)

    Es gibt mehrere Grundprinzipien die man in der Windows PowerShell unbedingt beachten und lernen sollte.

    Ein PowerShell Befehl heist Cmdlet (sprich Kommand-let).
    Windows PowerShell Befehle erzeugen und verarbeiteten digitale Objekte keinen Text!
    Windows PowerShell nutzt eine Pipeline | um das Ergebnis als einzelne Objekte von einem Cmdlet zum nächsten weiterzugeben.

    PowerShell arbeitet fast immer robust. Das heisst auch bei Fehlern wird die Abarbeitung (im  Script), nicht abgebrochen.
    Dazu kennt Windows PowerShell das Prinzip der Terminierenden Errors die zu einem Abbruch führen und die nicht Terminierenden Errors die nicht zu einem Abbruch führen.
    Dies kann man über den –ErrorAction Parameter steuern den jedes Cmdlet hat oder global über die ErrorActionPreference Variable.

    Dies ist absolutes PowerShell Grundwissen, das man sich in einem Lehrgang, mit der sehr guten PowerShell Hilfe oder mit einem guten PowerShell Buch aneignen sollte.
    Du findest Buchtipps in meinem Blog und ich habe auf Youtube einige PowerShell Lern-Videos gemacht. (Schau in meine Signatur hier).

    In der PowerShell wird das Cmdlet 'Get-Content' dafür benutzt Textdateien einzulesen.
    Get-Content liest eine Datei Zeilenweise ein und jede Zeile wird sofort ausgegeben (weitergereicht)

    In der PowerShell wird das ForEach Konstrukt benutzt um für jedes Objekt (Zeile) etwas auszuführen.
    Achtung! In der PowerShell gibt es 2 ForEach Konstrukte lies dazu bitte meinen Artikel:
    PowerShell ForEach und ForEach-Object.
    http://www.admin-source.de/BlogDeu/905/powershell-foreach-und-foreach-object

    Da du ein absoluter PowerShell newbie bist, hier ein Code wie das im Prinzip aussehen könnte:

    $ServerTextPfad = 'C:\Pfad\zur\TextDatei.txt'
    $ADServerGruppenName = 'ServerGroup123'
    
    
    Get-Content -Path $ServerTextPfad | ForEach-Object {
        
        # Das Objekt (die Zeile) das gerade verarbeitet wird,
    	# befindet sich inder automatischen generierten Variable mit dem Namen $_
        
        # Computer aus dem AD holen und Fehlermeldungen unterdrücken
        $ADServer = Get-ADComputer -Identity $_ -ErrorAction SilentlyContinue
        
        # Wenn der Computer im AD vorhanden ist
        If($ADServer) {
            # testen ob der Server in der Gruppe ist
            If( (Get-ADGroupMember -Identity $ADServerGruppenName | Select-Object -ExpandProperty Name) -notcontains $_ ) {
               
               # Server in die Gruppe einfügen
               $ADServer | Add-ADGroupMember -Identity $ADServerGruppenName
            }
        } Else {
            
            # Server nicht im Active directory gefunden, Warnmeldung ausgeben 
            Write-Warning "Computer $_ ist nicht im AD vorhanden!"
        }
    }

    Es gibt mehrere Möglichkeiten, mit der PowerShell das Active Directory (AD) zu verwalten.

    1. Nutzung der Directory Services .NET Klassen (Typen)
    2. Die Active Directory  Cmdlets der Firma DELL (ehemals Quest) aus dem ActiveRoles Management Snapin .
    3. Die Active Directory Cmdlets von Microsoft  aus dem Active Directory Modul
    4. Nutzung von WMI zur Verwaltung von Active Directory (nicht empfohlen und veraltet)

    Lise bitte dazu meinen Artikel:
    PowerShell Active Directory
    http://www.powershell-group.eu/powershell-active-directory/

    Bitte sage uns welche Technik du verwenden willst / sollst, damit wir die Zielgerichtet helfen können.


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    • Als Antwort vorgeschlagen Lennart Mittwoch, 7. Januar 2015 10:39
    • Als Antwort markiert 10xRel0aded Donnerstag, 8. Januar 2015 09:07
    Montag, 5. Januar 2015 11:29

Alle Antworten

  • Hi,

    hierzu eine Übersicht der verfügbaren AD-CMDlets: http://technet.microsoft.com/de-de/library/ee617195.aspx

    Mit "Get-Content" kannst Du Dir die TXT-Datei einlesen und mit einer ForEach-Schleife jeden Eintrag prüfen:

    http://technet.microsoft.com/de-de/library/ee176843.aspx

    Bitte hab Verständnis dafür, dass wir Dir hier kein fertiges Skript schreiben, ein bisschen Eigen-Invest an Gehirnschmalz ist schon noch erforderlich! :-)

    Ein typisches Skript würde z.B. so aussehen:

    $Serverlist = Get-Content <Pfad>\<Text-Datei> 
    
    ForEach ($Server in $ServerList)
       {
       if (Get-ADComputer -Filter {samaccountname -eq $Server})
          {
          <Deine gewünschte Aktion, z.B. Fehler-Ausgabe>
          }
       }
    
    usw. usw.
    Wenn Du noch irgendwo nicht weiterkommst, kannst Du natürlich hier fragen! ;-)


    Gruß

    Ben

    MCITP Windows 7

    Wenn Dir meine Antwort hilft, markiere sie bitte entsprechend als Antwort! Danke! :-)

    Hinweis: Meine Posts werden "wie besehen" ohne jedwede Gewähr bereitgestellt, da menschliche, technische und andere Fehler nicht ausgeschlossen werden können.

    • Als Antwort vorgeschlagen Lennart Mittwoch, 7. Januar 2015 10:39
    • Als Antwort markiert 10xRel0aded Donnerstag, 8. Januar 2015 09:08
    Montag, 5. Januar 2015 11:12
  • Hallo 10xRel0aded !

    Die Aufgabenstellung sieht mir eher wie eine ‚Hausaufgabe‘ aus…

    Wie Ben schon sagte richtig sagte:
    ... ein bisschen Eigen-Invest an Gehirnschmalz ist schon noch erforderlich! :-)

    Es gibt mehrere Grundprinzipien die man in der Windows PowerShell unbedingt beachten und lernen sollte.

    Ein PowerShell Befehl heist Cmdlet (sprich Kommand-let).
    Windows PowerShell Befehle erzeugen und verarbeiteten digitale Objekte keinen Text!
    Windows PowerShell nutzt eine Pipeline | um das Ergebnis als einzelne Objekte von einem Cmdlet zum nächsten weiterzugeben.

    PowerShell arbeitet fast immer robust. Das heisst auch bei Fehlern wird die Abarbeitung (im  Script), nicht abgebrochen.
    Dazu kennt Windows PowerShell das Prinzip der Terminierenden Errors die zu einem Abbruch führen und die nicht Terminierenden Errors die nicht zu einem Abbruch führen.
    Dies kann man über den –ErrorAction Parameter steuern den jedes Cmdlet hat oder global über die ErrorActionPreference Variable.

    Dies ist absolutes PowerShell Grundwissen, das man sich in einem Lehrgang, mit der sehr guten PowerShell Hilfe oder mit einem guten PowerShell Buch aneignen sollte.
    Du findest Buchtipps in meinem Blog und ich habe auf Youtube einige PowerShell Lern-Videos gemacht. (Schau in meine Signatur hier).

    In der PowerShell wird das Cmdlet 'Get-Content' dafür benutzt Textdateien einzulesen.
    Get-Content liest eine Datei Zeilenweise ein und jede Zeile wird sofort ausgegeben (weitergereicht)

    In der PowerShell wird das ForEach Konstrukt benutzt um für jedes Objekt (Zeile) etwas auszuführen.
    Achtung! In der PowerShell gibt es 2 ForEach Konstrukte lies dazu bitte meinen Artikel:
    PowerShell ForEach und ForEach-Object.
    http://www.admin-source.de/BlogDeu/905/powershell-foreach-und-foreach-object

    Da du ein absoluter PowerShell newbie bist, hier ein Code wie das im Prinzip aussehen könnte:

    $ServerTextPfad = 'C:\Pfad\zur\TextDatei.txt'
    $ADServerGruppenName = 'ServerGroup123'
    
    
    Get-Content -Path $ServerTextPfad | ForEach-Object {
        
        # Das Objekt (die Zeile) das gerade verarbeitet wird,
    	# befindet sich inder automatischen generierten Variable mit dem Namen $_
        
        # Computer aus dem AD holen und Fehlermeldungen unterdrücken
        $ADServer = Get-ADComputer -Identity $_ -ErrorAction SilentlyContinue
        
        # Wenn der Computer im AD vorhanden ist
        If($ADServer) {
            # testen ob der Server in der Gruppe ist
            If( (Get-ADGroupMember -Identity $ADServerGruppenName | Select-Object -ExpandProperty Name) -notcontains $_ ) {
               
               # Server in die Gruppe einfügen
               $ADServer | Add-ADGroupMember -Identity $ADServerGruppenName
            }
        } Else {
            
            # Server nicht im Active directory gefunden, Warnmeldung ausgeben 
            Write-Warning "Computer $_ ist nicht im AD vorhanden!"
        }
    }

    Es gibt mehrere Möglichkeiten, mit der PowerShell das Active Directory (AD) zu verwalten.

    1. Nutzung der Directory Services .NET Klassen (Typen)
    2. Die Active Directory  Cmdlets der Firma DELL (ehemals Quest) aus dem ActiveRoles Management Snapin .
    3. Die Active Directory Cmdlets von Microsoft  aus dem Active Directory Modul
    4. Nutzung von WMI zur Verwaltung von Active Directory (nicht empfohlen und veraltet)

    Lise bitte dazu meinen Artikel:
    PowerShell Active Directory
    http://www.powershell-group.eu/powershell-active-directory/

    Bitte sage uns welche Technik du verwenden willst / sollst, damit wir die Zielgerichtet helfen können.


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    • Als Antwort vorgeschlagen Lennart Mittwoch, 7. Januar 2015 10:39
    • Als Antwort markiert 10xRel0aded Donnerstag, 8. Januar 2015 09:07
    Montag, 5. Januar 2015 11:29
  • Hallo Peter

    Vielen Dank für die überaus rasche Antwort! Werde den heutigen Nachmittag und evtl. morgen investieren, zu der von mir gewünschten Lösung zu kommen :) Feedback folgt, denke jedoch jetzt schon, dass dies ein guter Lösungsansatz ist :) Melde mich sobald fertig!

    LG

    10xRel0aded

    Montag, 5. Januar 2015 12:39
  • Danke natürlich auch an Ben! :)
    Montag, 5. Januar 2015 12:40
  • Gerade wollte ich mich beschweren... ;-))))

    Gruß

    Ben

    MCITP Windows 7

    Wenn Dir meine Antwort hilft, markiere sie bitte entsprechend als Antwort! Danke! :-)

    Hinweis: Meine Posts werden "wie besehen" ohne jedwede Gewähr bereitgestellt, da menschliche, technische und andere Fehler nicht ausgeschlossen werden können.

    Mittwoch, 7. Januar 2015 12:26