none
Liste mit Usern in der AD vergleichen und nicht Vorhandene User ausgeben

    Frage

  • Hallo Zusammen,

    Ich bin dabei ein Script zum Vergleichen von Usern einer Datei von Usernamen aus der AD zu schreiben.

    Im Moment sieht das ganze so aus:

    # get all user accounts from ad, include just the SamAccountName,DistinguishedName,HomeDirectory attributes
    $users = Get-ADUser -filter *
    
    $userCSV="C:\Users\user\Desktop\userlist.csv"
    Import-Csv $userCSV -delimiter ';'  |  Foreach-Object{
            $csvuser= $_;
            if($users | Where-Object {$_.SamAccountName -eq $csvuser.SAMAccountName}) {echo true} else {echo false} 
    }

    Ich brauche jedoch eine ausgabe welche User jetzt nicht mehr in der AD vorhanden sind aber in der liste der Datei.

    Könnt ihr mir da weiterhelfen ?

    Gruß,

    Hainoon

    Donnerstag, 6. April 2017 09:17

Antworten

  • Moin,

    das muss erstens nicht an das else sondern an New-Object (3. geschweifte Klammer von unten) und zweitens mit -Append, damit die Datei nicht mit jedem neuen Datensatz überschrieben wird.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Donnerstag, 6. April 2017 18:10
  • Moin,

    die Prüfung hast du doch schon drin. Wenn das Script "false" ausgibt, ist es nur in der Liste udn ncihtmehr im AD. Hier nochmal eine Überscihtlichere Version:

    $users = Get-ADUser -filter *
    
    $userCSV = "C:\Users\user\Desktop\userlist.csv"
    Import-Csv $userCSV -delimiter ';' | Foreach-Object{
            $csvuser= $_
            if($users | Where-Object {$_.SamAccountName -eq $csvuser.SAMAccountName}) {
                New-Object psobject -Property @{
                    SamAccountName = $csvuser.SAMAccountName
                    Status = 'im AD vorhanden'
                }
            } 
            else {
                New-Object psobject -Property @{
                    Name = $csvuser.SAMAccountName
                    Status = 'nichtmehr im AD, nur in der Liste'
                }
            } 
    }


    Donnerstag, 6. April 2017 09:47
  • Hallo,

    also wenn ich dich richtig verstehe, baust du eine Schnittstelle, die Benutzerkonten aus anderen Systemen, die nicht mit dem AD selbst synchronisieren, mit den Konten in deinem AD, die sich in einer bestimmten Organisationseinheit befinden, vergleicht.

    Das Ergebnis wird dann später verwendet, um die Konten zu löschen oder ggf. neu zu erstellen.

    Hier mein Ansatz:

    # Wir importieren das Active Directory-Modul
    Import-Module ActiveDirectory
    
    # Datei, in der die Benutzer aus dem anderen System
    # aufgelistet sind:
    $if="\\UNC\Path\To\File.txt"
    
    # Und die Dateien, in welche geschrieben werden soll:
    $of_ad="\\UNC\Path\To\Missing_in_AD.txt"
    $of_f="\\UNC\Path\To\Missing_in_File.txt"
    
    # Und das ist die Organisationseinheit, in der sich
    # unsere Benutzerkonten befinden, die synchronisiert
    # werden sollen:
    $ou="OU=Subsystem,OU=User,DC=domain,DC=local"
    
    # Wir laden alle AD-Konten (Usernamen) in ein Array:
    $adusers=(Get-ADUser -Filter * | Where-Object { $_.DistinguishedName -like "*,$ou" }).SamAccountName

    # Und jetzt legen wir ein weiteres Array an, in welchem
    # wir beide Listen zusammenführen, aber nur Einträge, die
    # noch nicht vorhanden sind. Fangen wir mit den AD-Accounts
    # an:
    $all=$adusers

    # Und fahren wir mit der Textdatei fort:
    $fusers=Get-Content $if
    $fusers | foreach {
        if ($all -notcontains $_) {
            $all+=$_
        }
    }

    # Warum dieses Extra-Array, wird hier ersichtlich:
    # Damit wir nicht nur solche Accounts bemerken, die es
    # nicht mehr im AD gibt, sondern auch solche, die es noch
    # nicht im anderen System gibt, braucht es eine Liste mit
    # allen Usern - egal welches System.
    $all | foreach {
        $found=0
        if($adusers -contains $_) {
            $found+=1
        }
        if($fusers -contains $_) {
            $found+=2
        }
        if($found -eq 1) {
            Add-Content $of_f $_ # Benutzer gibt es im AD, aber nicht in der Datei.
        }
        elseif($found -eq 2) {
            Add-Content $of_ad $_ # Benutzer gibt es in der Datei, aber nicht im AD.
        }
    }

    Ein Hinweis an dieser Stelle: Die beiden Output-Dateien sollten vor dem Durchlauf leer sein. Die Leerung sollte durch die Skripte / Programme erfolgen, welche die Accounts dann löschen.
    Freitag, 7. April 2017 21:44

Alle Antworten

  • Moin,

    die Prüfung hast du doch schon drin. Wenn das Script "false" ausgibt, ist es nur in der Liste udn ncihtmehr im AD. Hier nochmal eine Überscihtlichere Version:

    $users = Get-ADUser -filter *
    
    $userCSV = "C:\Users\user\Desktop\userlist.csv"
    Import-Csv $userCSV -delimiter ';' | Foreach-Object{
            $csvuser= $_
            if($users | Where-Object {$_.SamAccountName -eq $csvuser.SAMAccountName}) {
                New-Object psobject -Property @{
                    SamAccountName = $csvuser.SAMAccountName
                    Status = 'im AD vorhanden'
                }
            } 
            else {
                New-Object psobject -Property @{
                    Name = $csvuser.SAMAccountName
                    Status = 'nichtmehr im AD, nur in der Liste'
                }
            } 
    }


    Donnerstag, 6. April 2017 09:47
  • Hi psott,

    Ja das ist bereits vorhanden jedoch ändert sich die Datei nicht und das wundert mich

    Donnerstag, 6. April 2017 09:55
  • > Ja das ist bereits vorhanden jedoch ändert sich die Datei nicht und das wundert mich
     
    Warum sollte die sich ändern, wenn Du sie nicht anfasst?
     
    Donnerstag, 6. April 2017 10:27
  • Ich brauche ja irgendeine ausgabe ? sonst nützt mir der check ja nichts
    Donnerstag, 6. April 2017 12:49
  • > Ich brauche ja irgendeine ausgabe ? sonst nützt mir der check ja nichts
     
    Ja hast doch auf dem Bildschirm... Steck das ganze in ein Array und schreib das dann irgendwo hin (Out-File oder Export-CSV).
     
    Wir wissen nicht, was Du damit machen willst, daher ist das schwer zu sagen :)
     
    Donnerstag, 6. April 2017 14:00
  • Also ich habe nichts aufm Bildschirm :D

    Naja wie beschrieben ich habe eine CSV Datei mit Usernamen nun soll das Script checken ob die Usernamen auch in der AD existieren und alle die nicht mehr in der AD aufgeführt sind sollen in eine neue CSV Datei gesteckt werden.

    Sodass ich weiß diese User können aus einem anderen System gelöscht werden.

    Jedoch bekomme ich wenn ich an das else noch ein

    |export-csv U:\export_final.csv -NoType -Delimiter ';' -Encoding UTF8

    anfüge eine CSV mit dem Eintrag length 33

    und mehr auch nicht...

    Donnerstag, 6. April 2017 14:29
  • Moin,

    das muss erstens nicht an das else sondern an New-Object (3. geschweifte Klammer von unten) und zweitens mit -Append, damit die Datei nicht mit jedem neuen Datensatz überschrieben wird.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Donnerstag, 6. April 2017 18:10
  • Hi Zusammen :)

    Ich bin nun soweit das ich eine Ausgabe bekommen VIELEN DANK ! dafür :)

    Leider ist der Append befehl jedesmal wenn ich ihn einbringe der Grund das ich am ende keine Aktualisierte Datei erhalte.

    Kann das An der Power Shell Version liegen ? Ich arbeite mit 2.0

    Freitag, 7. April 2017 06:35
  • Also hier der Aktuelle Code jedoch wenn ich nach Export.csv $Ausgabepfad -Append anhänge wird die Datei nichtmehr Aktualisiert
    Import-Module ActiveDirectory
    
    
    $Ausgabepfad = "U:\export_final.csv"
    $users = Get-ADUser -filter *
    
    $userCSV = "U:\export3.csv"
    Import-Csv $userCSV -delimiter ';' | Foreach-Object{
            $csvuser= $_
            if($users | Where-Object {$_.SamAccountName -eq $csvuser.SAMAccountName}) {
                New-Object psobject -Property @{
                    SamAccountName = $csvuser.SAMAccountName
                    Status = 'im AD vorhanden' 
                }
            } 
            else {
                New-Object psobject -Property @{
                    Name = $csvuser.SAMAccountName
                    Status = 'nichtmehr im AD, nur in der Liste' 
                    
                }|export-csv $Ausgabepfad -NoType -Delimiter ';' -Encoding UTF8 
               
            } 
    }

    Freitag, 7. April 2017 07:07
  • Hat hier jemand eine Idee?
    Freitag, 7. April 2017 12:08
  • > Kann das An der Power Shell Version liegen ? Ich arbeite mit 2.0
     
    Dann mußt Du das anders machen - append kam erst mit Version 3 :-)
     
     
    Freitag, 7. April 2017 13:03
  • Okay ich habe das mal versucht jedoch bekomme ich glaube ich hier codierungsfehelr..

    Import-Module ActiveDirectory
    $OU_ADUSER="OU=Benutzer,OU=X,OU=X,DC=X,DC=de"
    $userCSV="U:\export3.csv"
    (Import-Csv $userCSV -delimiter ';'-Encoding UTF8 ) | ?{!(Get-aduser $_.SAMAccountName -SearchBase $OU_ADUSER -EA SilentlyContinue)} | export-csv -path "U:\user.csv" -Delimiter ";" -NoType -Encoding UTF8

    Freitag, 7. April 2017 13:08
  • Hallo,

    also wenn ich dich richtig verstehe, baust du eine Schnittstelle, die Benutzerkonten aus anderen Systemen, die nicht mit dem AD selbst synchronisieren, mit den Konten in deinem AD, die sich in einer bestimmten Organisationseinheit befinden, vergleicht.

    Das Ergebnis wird dann später verwendet, um die Konten zu löschen oder ggf. neu zu erstellen.

    Hier mein Ansatz:

    # Wir importieren das Active Directory-Modul
    Import-Module ActiveDirectory
    
    # Datei, in der die Benutzer aus dem anderen System
    # aufgelistet sind:
    $if="\\UNC\Path\To\File.txt"
    
    # Und die Dateien, in welche geschrieben werden soll:
    $of_ad="\\UNC\Path\To\Missing_in_AD.txt"
    $of_f="\\UNC\Path\To\Missing_in_File.txt"
    
    # Und das ist die Organisationseinheit, in der sich
    # unsere Benutzerkonten befinden, die synchronisiert
    # werden sollen:
    $ou="OU=Subsystem,OU=User,DC=domain,DC=local"
    
    # Wir laden alle AD-Konten (Usernamen) in ein Array:
    $adusers=(Get-ADUser -Filter * | Where-Object { $_.DistinguishedName -like "*,$ou" }).SamAccountName

    # Und jetzt legen wir ein weiteres Array an, in welchem
    # wir beide Listen zusammenführen, aber nur Einträge, die
    # noch nicht vorhanden sind. Fangen wir mit den AD-Accounts
    # an:
    $all=$adusers

    # Und fahren wir mit der Textdatei fort:
    $fusers=Get-Content $if
    $fusers | foreach {
        if ($all -notcontains $_) {
            $all+=$_
        }
    }

    # Warum dieses Extra-Array, wird hier ersichtlich:
    # Damit wir nicht nur solche Accounts bemerken, die es
    # nicht mehr im AD gibt, sondern auch solche, die es noch
    # nicht im anderen System gibt, braucht es eine Liste mit
    # allen Usern - egal welches System.
    $all | foreach {
        $found=0
        if($adusers -contains $_) {
            $found+=1
        }
        if($fusers -contains $_) {
            $found+=2
        }
        if($found -eq 1) {
            Add-Content $of_f $_ # Benutzer gibt es im AD, aber nicht in der Datei.
        }
        elseif($found -eq 2) {
            Add-Content $of_ad $_ # Benutzer gibt es in der Datei, aber nicht im AD.
        }
    }

    Ein Hinweis an dieser Stelle: Die beiden Output-Dateien sollten vor dem Durchlauf leer sein. Die Leerung sollte durch die Skripte / Programme erfolgen, welche die Accounts dann löschen.
    Freitag, 7. April 2017 21:44