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-Key: 334148

Url: https://administrator.de/contentid/334148

Printed on: April 19, 2024 at 18:04 o'clock

Member: SeaStorm
SeaStorm Apr 05, 2017 at 14:32:56 (UTC)
Goto Top
Hi

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

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

sollte das hinbekommen
Member: SeaStorm
SeaStorm Apr 05, 2017 updated at 14:47:23 (UTC)
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} 
}
Member: Hainoon
Hainoon Apr 06, 2017 at 06:26:41 (UTC)
Goto Top
Hi,
Wo bekomme ich dann hier die Liste der nicht vorhanden User ?
Member: SeaStorm
SeaStorm Apr 06, 2017 at 06:32:23 (UTC)
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.
Member: Hainoon
Hainoon Apr 06, 2017 at 06:51:22 (UTC)
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
Member: SeaStorm
SeaStorm Apr 06, 2017 at 07:15:43 (UTC)
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 ...
Member: Hainoon
Hainoon Apr 06, 2017 at 07:32:56 (UTC)
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...
Member: Hainoon
Hainoon Apr 07, 2017 at 06:38:31 (UTC)
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..
Member: SeaStorm
Solution SeaStorm Apr 07, 2017 updated at 07:20:56 (UTC)
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
Member: Hainoon
Hainoon Apr 07, 2017 at 07:34:01 (UTC)
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
Member: SeaStorm
Solution SeaStorm Apr 07, 2017 at 08:27:27 (UTC)
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
Member: Hainoon
Hainoon Apr 07, 2017 at 09:13:57 (UTC)
Goto Top
Ich seh schon du verweigerst Konkrete Lösungen :D
Member: Hainoon
Hainoon Apr 07, 2017 updated at 09:34:15 (UTC)
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   
           
        } 
}
Member: SeaStorm
Solution SeaStorm Apr 07, 2017 at 09:35:13 (UTC)
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
Member: SeaStorm
SeaStorm Apr 07, 2017 at 09:41:47 (UTC)
Goto Top
du initialisierst das array bei jedem schleifendurchlauf erneut.

Oberhalb des ForEach initialisieren, innerhalb erweitern, unterhalb ausgeben
Member: Hainoon
Hainoon Apr 07, 2017 at 10:36:44 (UTC)
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.
Mitglied: 132895
132895 Apr 07, 2017 updated at 13:36:31 (UTC)
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
Member: Hainoon
Hainoon Apr 07, 2017 at 12:22:03 (UTC)
Goto Top
Hi Hauruck,
Hier ist die Codierung fehlerhaft oder ?
Mitglied: 132895
132895 Apr 07, 2017 updated at 12:30:09 (UTC)
Goto Top
Member: Hainoon
Hainoon Apr 07, 2017 at 12:30:38 (UTC)
Goto Top
Ich bekomme nur Crytische zeichen und je nach dem wie ich die Codierung ändere verändern sich diese oder ich bekomme garnix
Member: Hainoon
Hainoon Apr 07, 2017 at 12:32:00 (UTC)
Goto Top
Funktioniert das Skript bei dir ?
Mitglied: 132895
132895 Apr 07, 2017 updated at 12:33:44 (UTC)
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.
Member: Hainoon
Hainoon Apr 07, 2017 updated at 12:46:53 (UTC)
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  
Mitglied: 132895
132895 Apr 07, 2017 updated at 13:34:08 (UTC)
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...
Member: Hainoon
Hainoon Apr 07, 2017 updated at 13:54:35 (UTC)
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
Mitglied: 132895
132895 Apr 07, 2017 updated at 14:01:08 (UTC)
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!!!!!
Member: Hainoon
Hainoon Apr 07, 2017 at 14:00:31 (UTC)
Goto Top
Funktioniert aber :P
Mitglied: 132895
132895 Apr 07, 2017 updated at 14:03:13 (UTC)
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.
Member: SeaStorm
SeaStorm Apr 07, 2017 at 14:10:19 (UTC)
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   
Member: Hainoon
Hainoon Apr 07, 2017 at 16:23:56 (UTC)
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
Member: Hainoon
Hainoon Apr 07, 2017 at 16:24:25 (UTC)
Goto Top
Aber Danke für deine Hilfe face-smile um das mal nicht kalt wirken zu lassen.
Member: Hainoon
Hainoon Apr 07, 2017 at 16:24:43 (UTC)
Goto Top
Dann hättest du es ja sehen müssen ;)
Member: bellojr
bellojr Apr 21, 2021 at 07:02:46 (UTC)
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
Member: SeaStorm
SeaStorm Apr 21, 2021 at 16:56:29 (UTC)
Goto Top
Mach da besser mal einen neuen Thread zu auf. Das hier sieht ja keiner mehr, der nicht am Thread beteiligt war
Member: bellojr
bellojr Apr 22, 2021 at 06:38:02 (UTC)
Goto Top
Danke für den Tipp