none
2 Array gegeneinander Abgleich mit unterschiedlichen Feldbezeichnungen RRS feed

  • Frage

  • Hallo Powershellgurus,

    ich hab ein Problem bei einem Skript den ich gerade baue. Leider bin ich nicht gerade Fachmann was Powershellskripte angeht und hoffe daher auf eure Hilfe. Ich versuche eine Skript zu schreiben der 2 Arrays miteinander abgleicht. Das erste Array wird mit Daten aus ADUsern gefüllt und das zweite mit Ordnernamen von einem Verzeichnis bei mir auf der Festplatte. Mein Problem ist nun das ich nicht in der Lage bin die 2 Arrays miteinander abzugleichen. Ziel ist es am Ende eine Ausgabe zu bekommen die mir sagt ob User xlz einen Ordner hat der seinem Namen entspricht. Einfaches ja nein oder etwas vergleichbares reicht.

    Zum vereinfachten Code:

    #User zählen
    $z = Get-ADUser -Filter * -SearchBase "OU=AX,OU=Standorte,DC=Test,DC=dir" | measure
    $z.Count = ($z.Count-1)
    
    Write-Host "Useranzahl  : " $z.Count
    #----------------------------------
    #Ordner zaehlen
    $folder = "C:\Users\max.muster\Desktop\test"
    $z2 = @(Get-ChildItem -Path $folder | Select-Object Name)
    Write-Host "Ordneranzahl: " $z2.Count
    #-----------------------------------
    #User array füllen
    $user = @(Get-ADUser -Filter * -SearchBase "OU=AX,OU=Standorte,DC=Test,DC=dir" | select-object SamAccountName)
    #---------------------------------------
    #Ordner array füllen
    $ordner = @(Get-ChildItem -Path $folder | Select-Object Name)
    
    #läuft so oft wie User da
    for($y=1;$y -le $z.count; $y++){
    
        #läuft so oft wie Ordner da
    	for($x=1;$x -le ($z2.count+1); $x++){
    
    	if($folder[$x] -like $user[$y]){
    			write-host "$user[$y]      | Ja | " 
    		}
    	if($x -eq ($z2.count+1)){
                Write-Host "| Nein | ", $user[$y]
    }}}

    Ausgabe $user

    SamAccountName                                                                                                                                                                 
    --------------                                                                                                                                                                                                                                                                                                                                       
    Admin.Meister                                                                                                                                                                    
    Meister.Test                                                                                                                                                                   
    Max.Muster
    Test.Neuer
    Admin.Test 

    Ausgabe $ordner

    Name                                                                                                                                                                           
    ----                                                                                                                                                                           
    Max.Reuter                                                                                                                                                                  
    Admin.Meister
    Test.Test
    Test.Neuer
    Admin.Test
                                                                                                                                                                      

    Ich vermute mal nun das mein Problem darin liegt das ich Äpfel mit Birnen vergleiche da "SamAccountName" nicht gleich "Name" ist und somit dies nicht funktioniert. Leider weis ich nicht wie man diese "Feldbeschreibung/Name" greift so das ich einen Abgleich machen kann. Ich habe es auf mit diff und Compare-Object probiert, leider ohne Erfolg. Ich hoffe nun das jemand mein Problem versteht und mir helfen bzw. es mir erklären kann. 2 Tage googeln haben mir leider auch nicht geholfen.

    MFG

    Helmchen

    Freitag, 4. September 2015 09:51

Antworten

  • Hallo,

    hier mal ein Beispiel:

    $ArrayUser = @('Admin.Meister';'Meister.Test';'Max.Muster';'Test.Neuer';'Admin.Test')
    $ArrayFolder = @('Admin.Meister';'MeisterXX.Test';'Max.Muster';'TestXX.Neuer';'Admin.Test')
    foreach ($User in $ArrayUser) {
    	if ($ArrayFolder -contains $User) {
    		Write-Host "Es gibt ein Verzeichnis das dem Namen des $User enstspricht" 
    	}
    }
    Ach und bei den beiden Select-Objects in deinem Code solttest Du noch den Parameter -expandpropery nutzen.

    ... | Select-Object -ExpandProperty SamAccountName

    Das muesste funktionieren, deinen Code angepasst (ungetestet)

    $folder = "C:\Users\max.muster\Desktop\test"
    $Users = Get-ADUser -Filter * -SearchBase "OU=AX,OU=Standorte,DC=Test,DC=dir" | Select-Object -ExpandProperty SamAccountName
    $Folders = Get-ChildItem -Path $folder | Select-Object -ExpandProperty Name
    foreach ($User in $Users) {
    	if ($Folders -contains $User) {
    		Write-Host "Es gibt ein Verzeichnis das dem Namen des $User enstspricht" 
    	}
    }



    Beste Gruesse
    brima





    • Bearbeitet brima Freitag, 4. September 2015 10:29
    • Als Antwort markiert helmchen67 Freitag, 4. September 2015 12:27
    Freitag, 4. September 2015 10:17

Alle Antworten

  • Hallo,

    hier mal ein Beispiel:

    $ArrayUser = @('Admin.Meister';'Meister.Test';'Max.Muster';'Test.Neuer';'Admin.Test')
    $ArrayFolder = @('Admin.Meister';'MeisterXX.Test';'Max.Muster';'TestXX.Neuer';'Admin.Test')
    foreach ($User in $ArrayUser) {
    	if ($ArrayFolder -contains $User) {
    		Write-Host "Es gibt ein Verzeichnis das dem Namen des $User enstspricht" 
    	}
    }
    Ach und bei den beiden Select-Objects in deinem Code solttest Du noch den Parameter -expandpropery nutzen.

    ... | Select-Object -ExpandProperty SamAccountName

    Das muesste funktionieren, deinen Code angepasst (ungetestet)

    $folder = "C:\Users\max.muster\Desktop\test"
    $Users = Get-ADUser -Filter * -SearchBase "OU=AX,OU=Standorte,DC=Test,DC=dir" | Select-Object -ExpandProperty SamAccountName
    $Folders = Get-ChildItem -Path $folder | Select-Object -ExpandProperty Name
    foreach ($User in $Users) {
    	if ($Folders -contains $User) {
    		Write-Host "Es gibt ein Verzeichnis das dem Namen des $User enstspricht" 
    	}
    }



    Beste Gruesse
    brima





    • Bearbeitet brima Freitag, 4. September 2015 10:29
    • Als Antwort markiert helmchen67 Freitag, 4. September 2015 12:27
    Freitag, 4. September 2015 10:17
  • Hi Helmchen,

    versuch mal bitte Folgendes:

    $user = Get-ADUser -Filter * -SearchBase "OU=AX,OU=Standorte,DC=Test,DC=dir"
    Und schau mal, ob du die Daten, die du brauchst aus dem Object $user anders beziehen kannst

    $user = @(Get-ADUser -Filter * -SearchBase "OU=AX,OU=Standorte,DC=Test,DC=dir" | select-object Givename,Surname)

    Vielleicht ja so.



    Best regards,

    David das Neves

    Technology Specialist - Consulting Services
    Computacenter AG & Co. oHG - Munich

    Blog    

    Caution: This post was written with the intention to help and may contain errors.
    If my post was helpful or answered your question please mark it respectively. Thanks.


    Freitag, 4. September 2015 10:31
  • Hallo nochmal,

    meine Anfrage war wohl zu einfach, die Antworten kam in Rekordzeit. Erstmal vielen Dank, es hat geklappt. ;)

    @David das Neves

    Ja, es wäre möglich die Daten so zu beziehen, aber im Feld SamAccountName sind die Daten = den Ordnernamen der User die ich versuche zu greifen. Daher denke ich das dies die beste Wahl ist. Das Format passt halt.

    SamAccount = Vorname.Nachname

    Ordnername = Vorname.Nachname

    MFG

    Helmchen

    Freitag, 4. September 2015 11:27
  • Hallo,

    ok freut micht.

    Dann lies bitte noch das hier. Click

    Danke.

    Beste Gruesse
    brima

    Freitag, 4. September 2015 11:56
  • Hallo,

    Man könnte die Arrays auch ohne Schleife vergleichen:

    $User = @("user1","user2","user3","user4")
    $Folder = @("user3","user4","user5","user6")
    
    
    Write-Host ""`n"Member, die in beiden Arrays drin sind"
    $Members = $User | Where {$Folder -Contains $_}
    $Members
    
    
    Write-Host ""`n"Member, die in Array1, aber nicht in Array2 sind"
    $Members = $User | Where {$FOlder -NotContains $_}
    $Members

    finde ich etwas angenehmer, als die Schleifenstrukturen

    Gruß

    Kai

    Freitag, 4. September 2015 13:28
  • Hallo,

    nun ja wenn Du jetzt aber noch andere Dinge mit den Members machen musst, brauchst Du doch wieder eine Schleife, oder du musst weiter pipen  "... | Foreach-Object { ...", was dann aber langsamer arbeitet.

    Beste Gruesse
    brima

    Freitag, 4. September 2015 16:19