hainoon
Goto Top

AD Usernamen in CSV Vergleichen

Hallo Liebe Community,
Ich hatte zu diesem Thema schon einen ähnlichen Thread offen, habe das Thema vorerst auf Eis gelegt gehabt da ich einen Workaround mit einem Teil des Skriptes darstellen konnte nun ist die Anforderung doch wieder aufgetaucht und ich muss mich erneut damit befassen.

Ihr konntet mir damals gut weiterhelfen jedoch komme ich mit dem Letzen also ein guter Ansatz in den Teil meines Skriptes nicht ganz weiter ich habe das Auslesen der User.
Mit SearchBase sAMAccountName kann ich Arbeiten. Ich Brauche jedoch ein if der ausgibt das der User gefunden ist oder nicht. Und auch fehlt mir das else, das mir die Nicht existierenden User in der Liste ausgibt.

Import-Module ActiveDirectory

$OU_ADUSER="OU=Benutzer,OU=X,OU=X,DC=X,DC=de"  
$userCSV="U:\export3.csv"  

Import-Csv $userCSV -delimiter ';'  | select SAMAccountName  
  $csv_username = $_.SAMAccountName
  $user = Get-aduser -Filter * -SearchBase $OU_ADUSER | ?{$_sAMAccountName -eq $csv_username}
  if ($user){
    # User wurde gefunden, info bleibt aus
    $info= @{}
  }else{
   $csv_username| export-csv -path "U:\user.csv"  

  }

Hier mein nicht ganz so schlauer Ansatz - Kann gar nicht so funktionieren ich weiß, ich wollte nur darstellen was ich bereits habe.

Ich würde mich um eure Hilfe sehr freuen da es im Moment echt drängt und ich ohne dieses Script in meinem vorhaben nicht weiterkomme.
Ich brauche richtige Ansätze und Verknüpfungen.

Gruß,
Hainoon -Euer Script N00b

Content-ID: 334148

Url: https://administrator.de/forum/ad-usernamen-in-csv-vergleichen-334148.html

Ausgedruckt am: 22.12.2024 um 18:12 Uhr

SeaStorm
SeaStorm 05.04.2017 um 16:32:56 Uhr
Goto Top
Hi

#Alle AD User Auslesen
$users = Get-ADUser -filter *

if($users | Where-Object {$_.SamAccountName -eq $user }) 
{$true} 
else 
{$false} 

sollte das hinbekommen
SeaStorm
SeaStorm 05.04.2017 aktualisiert um 16:47:23 Uhr
Goto Top
# 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} 
}
Hainoon
Hainoon 06.04.2017 um 08:26:41 Uhr
Goto Top
Hi,
Wo bekomme ich dann hier die Liste der nicht vorhanden User ?
SeaStorm
SeaStorm 06.04.2017 um 08:32:23 Uhr
Goto Top
Hi

ich habe das so verstanden, das du eine Liste von Usernamen in der CSV hast und jetzt wissen willst ob der User im AD existiert.
Mein Script guckt genau das an und gibt TRUE an, wenn der User existiert, bzw FALSE, wenn nicht.
Hainoon
Hainoon 06.04.2017 um 08:51:22 Uhr
Goto Top
Das ist auch Richtig face-smile
Ich bin froh das du es auch verstanden hast :D
Jedoch würde ich gerne wissen welcher User aus der Liste nicht mehr in der AD existiert.
Gibt es das mit Export csv eine Möglichkeit ?

Gruß,
Hainoon
SeaStorm
SeaStorm 06.04.2017 um 09:15:43 Uhr
Goto Top
äh?
hab ich doch geschrieben ... die Schleife da läuft durch und prüft ganz genau das. Wenn ein User in der CSV steht, der nicht im AD existiert, springt er in den FALSE Abschnitt ...
Hainoon
Hainoon 06.04.2017 um 09:32:56 Uhr
Goto Top
Ja aber eine Datei mit einer Liste der User die Fehlen wird ja nicht erstellt es wird in dem Fall ja nur die Liste importiert der User die Verglichen werden sollen .. in dem fall haben wir ja nur den vergleich ohne ausgabe...
Hainoon
Hainoon 07.04.2017 um 08:38:31 Uhr
Goto Top
Für jedermann den es Interessiert im Moment bin ich nun soweit :
Import-Module ActiveDirectory

$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'   
            }|export-csv U:\export_final.csv -NoType -Delimiter ';' -Encoding UTF8  
        } 
        else {
            New-Object psobject -Property @{
                Name = $csvuser.SAMAccountName
                Status = 'nichtmehr im AD, nur in der Liste'   
                
            }|export-csv U:\export_final.csv -NoType -Delimiter ';' -Encoding UTF8  
           
        } 
}

Leider wird die erstellte Datei immer wieder überschrieben hierzu fehlt mir noch ein Befehl..
SeaStorm
Lösung SeaStorm 07.04.2017 aktualisiert um 09:20:56 Uhr
Goto Top
Hi

aktuell exportierst du jedes mal erneut in die CSV. ein " -Append" würde helfen, ist aber eine schlechte herangehensweise.
Anstatt jedes mal den Wert eine Variable zu schmeissen und dann einzeln in die Datei zu schreiben, solltest du alle Werte nacheinander in ein Array werfen und dieses dann, nachdem die Foreach-Schleife fertig ist, in einem Rutsch in die CSV schreiben. Effizienter, schneller, schöner
Hainoon
Hainoon 07.04.2017 um 09:34:01 Uhr
Goto Top
Könntest du mir zeigen im Code wie du das machen würdest ?
Ich hatte es mit -Append auch schon versucht jedoch wird hier die Datei sozusagen Gar nicht mehr überschrieben wieso auch immer.
Ich weiß nicht wie ich die Werte in ein Array bringen soll da ich in der ISE keine Ausgaben mehr bekomme :D

Danke für die Hilfe face-smile
SeaStorm
Lösung SeaStorm 07.04.2017 um 10:27:27 Uhr
Goto Top
aber Google hat noch eine Ausgabe bei dir oder? ;)

https://www.windowspro.de/script/arrays-powershell-anlegen-aendern-ausle ...

    $arr=@()
    $arr += "hallo"  
    $arr += "welt"  
    echo $arr
Hainoon
Hainoon 07.04.2017 um 11:13:57 Uhr
Goto Top
Ich seh schon du verweigerst Konkrete Lösungen :D
Hainoon
Hainoon 07.04.2017 aktualisiert um 11:34:15 Uhr
Goto Top
Soweit Funktioniert es nicht ich schaff es nicht das richtig ins Script zu bringen ...
Ich bekomme jetzt garkeine ausgabe mehr was mich wundert weil der Export sollte mir ja zumindest das Array ausgeben

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'   
                
            }
            $arr=@(Get-Process) -is [array]
            $arr += $csvuser
            $arr += "Status"  
            echo $arr            |export-csv $Ausgabepfad  -NoType -Delimiter ';' -Encoding UTF8   
           
        } 
}
SeaStorm
Lösung SeaStorm 07.04.2017 um 11:35:13 Uhr
Goto Top
naja das meiste habe ich dir schon geliefert face-smile
aber ich mache dir nicht deine Arbeit face-smile gleich gar nicht, wenn es um so absolut grundlegende Dinge geht. Die erlernst du besser mal und verstehst was da passiert face-smile
Nicht zur Strafe, nur zur Übung
SeaStorm
SeaStorm 07.04.2017 um 11:41:47 Uhr
Goto Top
du initialisierst das array bei jedem schleifendurchlauf erneut.

Oberhalb des ForEach initialisieren, innerhalb erweitern, unterhalb ausgeben
Hainoon
Hainoon 07.04.2017 um 12:36:44 Uhr
Goto Top
Hi, also ich habe es jetzt mal versucht und bekomme einen Fehler beim Ausführen des Skriptes egal wo ich das Array hinzufüge.

Ich weiß es zu schätzen das hier der Lerneffekt großgeschrieben wird leider ist das als Azubi nahezu Alltag, ich habe die Aufgabe am Montag bekommen und habe davor nie was mit Power Shell gemacht alles was ich bis jetzt habe, habe ich mir selbst erarbeitet.
Deswegen habe ich auch nach Verbesserung des Codes gefragt ist nicht immer leicht vor allem wenn der Ausbilder einem nicht hilft-
Und die Shell Spuckt auch nur "Fehler" aus aber nicht wo er liegt oder wie er entsteht. Deswegen ist auch die Analyse nicht möglich.
132895
132895 07.04.2017 aktualisiert um 15:36:31 Uhr
Goto Top
Import-Module ActiveDirectory
$OU_ADUSER="OU=Benutzer,OU=X,OU=X,DC=X,DC=de"  
$userCSV="U:\export3.csv"  
(Import-Csv $userCSV -delimiter ';') | ?{(Get-aduser $_.SAMAccountName -SearchBase $OU_ADUSER -EA SilentlyContinue) -eq $null} | export-csv -path "U:\user.csv" -Delimiter ";" -NoType -Encoding UTF8  
hauruck
Hainoon
Hainoon 07.04.2017 um 14:22:03 Uhr
Goto Top
Hi Hauruck,
Hier ist die Codierung fehlerhaft oder ?
132895
132895 07.04.2017 aktualisiert um 14:30:09 Uhr
Goto Top
Hainoon
Hainoon 07.04.2017 um 14:30:38 Uhr
Goto Top
Ich bekomme nur Crytische zeichen und je nach dem wie ich die Codierung ändere verändern sich diese oder ich bekomme garnix
Hainoon
Hainoon 07.04.2017 um 14:32:00 Uhr
Goto Top
Funktioniert das Skript bei dir ?
132895
132895 07.04.2017 aktualisiert um 14:33:44 Uhr
Goto Top
Zitat von @Hainoon:
Ich bekomme nur Crytische zeichen und je nach dem wie ich die Codierung ändere verändern sich diese oder ich bekomme garnix
Dann musst du bei Import-CSV die korrekte Kodierung deiner CSV-Datei mit -Encoding angeben!!
Funktioniert das Skript bei dir ?
Ja! Ich mach Powershell schon 10 Jahre.
Hainoon
Hainoon 07.04.2017 aktualisiert um 14:46:53 Uhr
Goto Top
Okay das freut mich dann habe ich ja den Richtigen der mir helfen kann :D

Jedoch funktioniert es bei mir eben nicht egal wie ich das Encoding eintrage auch mit nachtrag bekomme ich eine leere CSV
Import-Module ActiveDirectory
$OU_ADUSER="OU=Benutzer,OU=X,OU=X,DC=X,DC=de"  
$userCSV="U:\export3.csv"  
(Import-Csv $userCSV -delimiter ';'-Encoding ) | ?{!(Get-aduser $_.SAMAccountName -SearchBase $OU_ADUSER -EA SilentlyContinue)} | export-csv -path "U:\user.csv" -Delimiter ";" -NoType -Encoding UTF8  
132895
132895 07.04.2017 aktualisiert um 15:34:08 Uhr
Goto Top
-Encoding
Au möhr, du bist mit ja ein "Spezialist", les mal die beiden Links oben dann siehst du was du falsch gemacht hast. Du musst natürlich das passende Encoding angeben wenn die PS selbst das passende Encoding nicht ermitteln kann!
Geht einwandfrei, ansonsten existieren alle User der CSV im AD.

i'm out'a here...
Hainoon
Hainoon 07.04.2017 aktualisiert um 15:54:35 Uhr
Goto Top
Also du Genie face-smile
Ich habs jetzt anders gemacht dein kram funktioniert nämlich nicht keine Ahnung was du in deinen 10 Jahren gemacht hast
$inFile = "U:\export3.csv"  
$outFile = "U:\export_final.csv"  

$aUsers = Import-Csv $inFile

foreach($aUser in $aUsers){
    #$aUser.SAMAccountName
    #$aUser | Out-File $outFile -Append
    $oADUser = Get-ADUser $aUser.SAMAccountName -ErrorAction SilentlyContinue
    if(-not ($oADUser)){
        $aUser.SAMAccountName | Out-File $outFile -Append
        $aUser.SAMAccountName + " does not exists!"  
    }else{
        $aUser.SAMAccountName + " does exists!"  
    }
    $oADUser = $null
}

Für die die es Interessiert
132895
132895 07.04.2017 aktualisiert um 16:01:08 Uhr
Goto Top
$aUsers = Import-Csv $inFile 
Tja wenn du halt nicht in der Lage bist den Delimiter für die CSV richtig (Komma statt Semikolon) anzugeben kann dir keiner mehr helfen!!!!!
Hainoon
Hainoon 07.04.2017 um 16:00:31 Uhr
Goto Top
Funktioniert aber :P
132895
132895 07.04.2017 aktualisiert um 16:03:13 Uhr
Goto Top
Logisch weil ohne Angabe des Delimiters bei Import-CSV immer das Komma genommen wird, das hattest du uns leider verschwiegen! Hätte man aber mit etwas Grips auch selber sehen können.
Und es geht definitiv, du hast halt noch viel zu lernen mein Freund.
SeaStorm
SeaStorm 07.04.2017 um 16:10:19 Uhr
Goto Top
ohje face-smile

da haste dir aber was blödes zusammenkopiert ;)
1. macht das ding für jeden Benutzer einen Aufruf gegen das AD. Sehr unschön da langsam.
2. erstellst du hier tatsächlich nur eine Textdatei, kein ordentliches CSV
3. wirft die Fehler, wenn ein User nicht existiert. Mag für deine zwecke ausreichen, ist aber eine äusserst unschöne Art.
4. zumindest bei mir erzeugt das keinen ordentlichen Inhalt in der Ausgabedatei sondern nur quark.

Abgesehen davon hast du das Wichtigste nicht erreicht: Etwas gelernt.
Du bist den weg des geringsten Widerstandes gegangen und hast irgendwas aus google zusammengewürfelt das jetzt eher schlecht als recht läuft.
Sehr schade, denn dein Bsp. davor war fast fertig. Wie ein Array funktioniert, wie eine schleife funktioniert und wie du ein Custom Objekt mit all seinen schönen Vorteilen geniessen kannst, hast du jetzt leider verpasst.

Trotzdem noch zum lernen eine kurz überflogene Version:

Import-Module ActiveDirectory

$Ausgabepfad = "C:\temp\export_final.csv"  
$users = Get-ADUser -filter *
$arr=@()

$userCSV = "c:\temp\userlist.csv"  
Import-Csv $userCSV -delimiter ';' | Foreach-Object{  
        $csvuser= $_
        
        if($users | Where-Object {$_.SamAccountName -eq $csvuser.SAMAccountName}) {
            $arr += New-Object psobject -Property @{
                SamAccountName = $csvuser.SAMAccountName
                Status = 'im AD vorhanden'   
            }
        } 
        else {
            $arr += New-Object psobject -Property @{
                SamAccountName = $csvuser.SAMAccountName
                Status = 'nichtmehr im AD, nur in der Liste'   
            }
        } 
}
echo $arr  
echo "Start export:"  
 $arr | export-csv $Ausgabepfad  -NoType -Delimiter ';' -Encoding UTF8   
Hainoon
Hainoon 07.04.2017 um 18:23:56 Uhr
Goto Top
Also wenn du meinst :D leider muss ich dir direkt mal sagen das ich das Script mit einem Arbeitskollegen der sich da etwas besser auskennt zusammen geschrieben habe also ist hier erstmal nicht gewürfelt.
Zweitens läuft es auf unserem System einbahnfrei und die CSV an sich war damit es einheitlich ist - die cash benötigen wir an sich nicht da es eh nur Zum Wörterbuch hinzufügen Namen ausgibt aber naja..

Wenn ein Lerneffekt aus einem Forum erzeugt werden sollte, ist deine Herangehensweise nicht ganz richtig -
Hättest du einen Code (es muss ja nicht mal einer sein der hier zur Lösung bringt) aber mit befehlen die zur Lösung beitragen könnten und diesen dann beschrieben hättest du DEIN Ziel erreicht.
Ich will auch jetzt keine elenden Diskussionen beginnen aber ich will es nicht unkommentiert lassen
Hainoon
Hainoon 07.04.2017 um 18:24:25 Uhr
Goto Top
Aber Danke für deine Hilfe face-smile um das mal nicht kalt wirken zu lassen.
Hainoon
Hainoon 07.04.2017 um 18:24:43 Uhr
Goto Top
Dann hättest du es ja sehen müssen ;)
bellojr
bellojr 21.04.2021 um 09:02:46 Uhr
Goto Top
Hallo Leute,
vielen Dank für den "Lernstoff". Ich stehe vor einem ähnlichen Problem. Leider komme ich mit SamAccountname nicht weiter. Hab es mal mit "SN" erfolglos probiert. Wenn man Vorname+Nachname Abfragen könnte wäre es perfect für mich. Geht das ?
Hintergrund: Es wurde jahrelang "Pseudo-Accounts" angelegt ( für eine dig. Anwendung ) die nie gepflegt wurden. Das SamAccountname sieht so aus " devobiMmüller ". Zusätzlich kommen noch viele User dazu noch keinen oder eben diesen "Pseudo-Accounts" AD-Account haben. Ich habe von der Perso eine Liste alles Mitarbeiterbeitenden bekommen.
bitte helf mir face-smile
SeaStorm
SeaStorm 21.04.2021 um 18:56:29 Uhr
Goto Top
Mach da besser mal einen neuen Thread zu auf. Das hier sieht ja keiner mehr, der nicht am Thread beteiligt war
bellojr
bellojr 22.04.2021 um 08:38:02 Uhr
Goto Top
Danke für den Tipp