none
Auslesen des AD/LDIFDE + suchen über zwei Zeilen mit zwei Strings RRS feed

  • Frage

  • Moin moin,

    Ich hab hier ein Problem, das besteht nun schon seit dem 11.07 und bekomme es nun nicht mehr alleine gelöst.

    #$TargetFolder = ".\Notes"
    #$SourceFolder = ".\"
    #$Extension = "*.id"
    
    #ForEach ($File in Get-Childitem $SourceFolder -Include $Extension -Recurse -name) { #Für jede ID die im SourceFolder liegt wird die Schleife
    		#Write-Host "Kopiere ID $File"
    		#Copy-Item $TargetFolder -Recurse .\Notes.$file
    		#Move-Item .\$file .\Notes.$file\Data
    		#(Get-Content .\Notes.$file\Data\setup.txt) | Foreach-Object {$_ -replace 'name.id', $file} | Set-Content .\Notes.$file\Data\setup.txt
    		#Get-ChildItem .\Notes.$file\Data\$file | Get-Content | Foreach-Object {If ($_ -match 'cn=([^"]+)/O=Dfd-hamburg') {		
    		#$a = $Matches[1]
    		#}}
    		#pause
    		#(Get-Content .\Notes.$file\Data\setup.txt) | Foreach-Object {$_ -replace 'Vorname Nachname', $Matches[1]} | Set-Content .\Notes.$file\Data\setup.txt
    #	}#Foreach
        
    #Write-Host "Fertig!"
    $a = "Jannis Kroeger"
    #Ldifde -f C:\TEMP\eos.ldf -r "(objectClass=User)" -l "cn,givenname,sn,homeDirectory" -s eos.lcl -t 389 #Holt aus dem AD alle Nutzer ab
    #$AD = Get-Content C:\TEMP\eos.ldf #Ließt alle Daten aus der ebend erstellten Datei ein.
    $array = $a -split "\s+" #Aufteilen des Vor- und Nachnamen
    #$array[1] #Ausgabe des Nachnamen
    #$array[0] #Ausgabe des Vornamen
    #___________________________________________________________________________________________________________________________________________________________#
    $Path = "C:\TEMP"                #Die Dateien in diesem Verzeichnis wird analysiert
    $FileFilter = "*.txt"  			 #Hier können auch Platzhalter angegeben werden z.B. "File*.txt"
    $SearchString = "$array[1]"  	 #Hier können reguläre Ausdrücke verwendet werden z.B. "E[q-s]ror: 225"
    $SearchString2 = "$array[0]"
    $OutPutFile = "Result.log"
    $Fullpath = "C:\TEMP\eos.txt"
    
    Function Analyze{
     #param($Fullpath,$SearchString)#,$OutputFile,$SearchString,$Searchstring2)
    
     $LineNumber = 0
     $Hits=@()                   #Array mit den Zeilennummern, die den Searchtext enthalten
     
     "{0} {1}" -f $FullPath,[Environment]::NewLine #Dateiname über die Hits schreiben
     
     $Lines = @(Get-Content $Fullpath)  #Array mit allen Zeilen der Datei
     $Lines[-1] = "Dummy"                       #Vorgängerzeile der ersten TextZeile
     
     $Lines | ForEach{                     #Jede Zeile (=jedes Element des Arrays) untersuchen
       $LineNumber += 1                     #Zeilennummer
       If($_ -like $array[1]){         #Prüfen, ob $Suchstring in der Zeile enthalten ist
         $Hits += $LineNumber              #Füge die Zeilennummer dem Array Hits hinzu
       }#If
     }#Lines
     
    $Lines | ForEach{                     #Jede Zeile (=jedes Element des Arrays) untersuchen
      $LineNumber += 1                     #Zeilennummer
      If($_ -like $array[0]){         #Prüfen, ob $Suchstring in der Zeile enthalten ist
        $Hits += $LineNumber              #Füge die Zeilennummer dem Array Hits hinzu
      }#If
    }#Lines
     
     For($i=0; $i -le $Hits.Count; $i++){  #Alle Zeilennummern mit Hits hochzählen
      $Value = ""
      If($Hits[$i] -eq $($Hits[$i-1]+1)) #Wenn zwei Zeilennummern mit Hits aufeinander folgen
        {
        $Value += "Zeile {0}: {1} {2}" -f $Hits[$i-1],$Lines[$Hits[$i]-2],[Environment]::NewLine
        $Value += "Zeile {0}: {1} {2}" -f $Hits[$i],$Lines[$Hits[$i]-1],[Environment]::NewLine
       
        $Value        #Eventuell auskommentieren, wenn keine Bildschirmausgabe gewünscht ist
        Add-Content -Path $Path\$OutPutFile -Value $Value  #auskommentieren, wenn keine Fileausgabe gewünscht ist   
        Remove-Variable Value -EA 0  
        }#if
      }#for
     
    }#function
    $LogFiles = Get-ChildItem $Patch #-path $Path #-filter $FileFilter
    $LogFiles | ForEach {
    Analyze #-FullPath $_.FullName #-OutPutFile $OutPutfile -SearchString $SearchString,$Searchstring2 #Funktionsaufruf
    }

    Der Teil über dem laaaaangen Strich funktioniert tadellos!

    Was möchte ich eigentlich erreichen? Ich möchte in erster Linie das HomeDir, dass bei den Usern angegeben ist in einer Variable haben um es später als Pfad nutzen zukönnen, damit das Ganze über dem Strich dort hin kopiert werden kann.

    Der Accountname ist allerdings nicht so einfach ermittel bar und deshalb gehe ich hier solche Umwege über den Vor- und Nachnamen die allein schon ein Gefrikel waren herauszubekommen.

    Dsquery und dsget hab ich mir mal angeguckt aber nie zum laufen bekommen, außerdem fände ich es sehr praktisch, wenn diejenigen die befugt sind dieses Skript zu starten, nicht auf die RSAT  angewiesen sind.

    Habt ihr vielleicht Durchblick oder eine Idee?

    KOMMENTAR: Wenn die erste Zeile gefunden wurde mit dem Nachnamen, muss die folgende Zeile mit dem Vornamen passen. In der darauf folgenden Zeile steht dann das HomeDir:

    sn: Kroeger
    givenName: Jannis
    homeDirectory: \\XXXX02\wtshome$\KroegerJ




    P.S.: Das Skript hört nicht auf zu laufen, mit folgender Ausgabe:

    Kroeger
    Jannis
    C:\TEMP\eos.txt 
    
    C:\TEMP\eos.txt 
    
    C:\TEMP\eos.txt 
    
    (...)

    Danke

    Jannis



    • Bearbeitet Jannis K Montag, 15. Juli 2013 12:15
    Montag, 15. Juli 2013 12:10

Antworten

  • Hallo Jannis!

    PowerShell selbst hat mehrere Möglichkeiten auf das Active Directory zuzugreifen.
    Du brauchst die DOS Befehle und die RSAT dazu nicht!

    Du brichst dir da den Hals mit Textverarbeitung. Genau aus diesem Grund verarbeitete PowerShell keinen Text sondern Objekte. Objekte ermöglichen das punktgenaue auslesen von Daten über einen Namen (Property).

    Das Active Directory liefert auch Objekte deshalb kann PowerShell diese mit Leichtigkeit verarbeiten!


    Der Accountname ist allerdings nicht so einfach ermittel bar und deshalb gehe ich hier solche Umwege über den Vor- und Nachnamen die allein schon ein Gefrikel waren herauszubekommen.

    Wie und WO möchtest du denn den Windows (Active Directory) Account ermitteln?

    Den Account von dem zur Zeit angemeldeten Benutzer eines Rechners kann man ganz leicht auslesen:

    $ENV:Username

    $Env:USERDOMAIN

    Das Aktive Directory Fragst du so nach dem Homedirectory von dir:

    ([ADSI](([AdsiSearcher]"(&(objectClass=user)(sn=Kroeger)(givenname=Jannis))").FindOne()).Path).displayname


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    • Bearbeitet Peter Kriegel Montag, 15. Juli 2013 15:08 dsfdsfdfsdf
    • Als Antwort markiert Jannis K Dienstag, 16. Juli 2013 06:13
    Montag, 15. Juli 2013 14:44

Alle Antworten

  • Hallo Jannis!

    PowerShell selbst hat mehrere Möglichkeiten auf das Active Directory zuzugreifen.
    Du brauchst die DOS Befehle und die RSAT dazu nicht!

    Du brichst dir da den Hals mit Textverarbeitung. Genau aus diesem Grund verarbeitete PowerShell keinen Text sondern Objekte. Objekte ermöglichen das punktgenaue auslesen von Daten über einen Namen (Property).

    Das Active Directory liefert auch Objekte deshalb kann PowerShell diese mit Leichtigkeit verarbeiten!


    Der Accountname ist allerdings nicht so einfach ermittel bar und deshalb gehe ich hier solche Umwege über den Vor- und Nachnamen die allein schon ein Gefrikel waren herauszubekommen.

    Wie und WO möchtest du denn den Windows (Active Directory) Account ermitteln?

    Den Account von dem zur Zeit angemeldeten Benutzer eines Rechners kann man ganz leicht auslesen:

    $ENV:Username

    $Env:USERDOMAIN

    Das Aktive Directory Fragst du so nach dem Homedirectory von dir:

    ([ADSI](([AdsiSearcher]"(&(objectClass=user)(sn=Kroeger)(givenname=Jannis))").FindOne()).Path).displayname


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    • Bearbeitet Peter Kriegel Montag, 15. Juli 2013 15:08 dsfdsfdfsdf
    • Als Antwort markiert Jannis K Dienstag, 16. Juli 2013 06:13
    Montag, 15. Juli 2013 14:44
  • Hallo Peter,

    den Vor- und Nachnamen lese ich aus der *.id-File aus die dem jeweiligen Nutzern zu zuordnen ist. Der aktuell angemeldete Benutzer interessiert deshalb garnicht (den Zweizeiler merk ich mir trotzdem ;-P ).

    deinen ADsiSearcher finde ich gerade sehr spannend!
    -> Die Ausgabe ist allerdings exakt der ".Displayname" also:
    Jannis Kroeger

    Ich hab mal 5 Sekunden gegoogelt... da ein /? beim "adsiSearcher" nichts bringt.

    ([ADSI](([AdsiSearcher]"(&(objectClass=user)(sn=Kroeger)(givenname=Jannis))").FindOne()).Path).HomeDirectory

    also ".HomeDirectory" statt ".Homedir" oder ".terminalserverprofilepath".

    Bringt den gewünschten erfolg und zwar so gut und komfortabel das ich aus der gesamten Textverarbeitung nun eine einzige Zeile bekomme!!!

    Herzlichsten Dank!
    Bester Schubser überhaupt!

    Jannis

    P.S.: Wenn ich das ganze jetzt zu einfach gedacht hab hau ich mich -.-"

    $homedir = ([ADSI](([AdsiSearcher]"(&(objectClass=user)(sn=$array[1])(givenname=$array[0]))").FindOne()).Path).homedirectory
    $homedir

    Dabei kommt nichts raus...
    Der Befehl alleine gibts einfach das Homedirectory...

    PP.S.: Ja zu einfach! Warscheinlich wieder ein Umweg über 4 Ecken aber es läuft mit Variablen statt dem Array:

    $Vorname = $array[0]#Ausgabe des Nachnamen
    $Nachname = $array[1] #Ausgabe des Vornamen
    $homedir = ([ADSI](([AdsiSearcher]"(&(objectClass=user)(sn=$Nachname)(givenname=$Vorname))").FindOne()).Path).homedirectory
    $homedir
    
    Ausgabe:
    \\FSXXX02\wtshome$\*janniskroeger*
    
    (Sinngemäß unkenntlich gemacht)

    • Bearbeitet Jannis K Dienstag, 16. Juli 2013 06:23 war zu einfach
    Dienstag, 16. Juli 2013 06:13
  • P.S.: Wenn ich das ganze jetzt zu einfach gedacht hab hau ich mich -.-"
    $homedir = ([ADSI](([AdsiSearcher]"(&(objectClass=user)(sn=$array[1])(givenname=$array[0]))").FindOne()).Path).homedirectory
    $homedir

    Dabei kommt nichts raus...

    Das würde auch gehen!
    Variablen werden in Text (String) mit doppelten Anführungszeichen zu ihren Werten (expandiert).
    Wenn die Variable aber nicht einfach dumm den Wert zurückgeben kann, sondern eine Aktion mit der Variable nötig ist. Dann muss die in eine so genannte Subexpression (unterfunktion)  $() verpackt werden.

    $Wert =  'hallo welt'
    
    # geht nicht
    "Ich sage immer $Wert.ToUpper()"
    "Ich verdiene 3 * 5  € im Monat"
    
    # geht weil es mit der subexpression vorher ausgeführt wird
    "Ich sage immer $($Wert.ToUpper())"
    "Ich verdiene $(3 * 5) € im Monat"
    
    # Klammern und Subexpressions richtig einsetzen ;-))
    ([ADSI](([AdsiSearcher]"(&(objectClass=user)(sn=$($array[1]))(givenname=$($array[0])))").FindOne()).Path).homedirectory


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Dienstag, 16. Juli 2013 12:38
  • [Neue Frage, Neuer Thread]

    Dort gehts nun wieder los:
    http://social.technet.microsoft.com/Forums/de-DE/9081b943-42b7-46c3-88ea-0bd60db4eccf/anhand-einer-liste-von-nach-und-vornamen-usernamen-hinzufgen

    Gruß

    • Bearbeitet Jannis K Montag, 16. September 2013 11:10
    Montag, 16. September 2013 10:13
  • Bitte hole bitte keinen "alten", bereits beantworteten Threads wieder hoch. Diese Übersieht man zu leicht, weil sie schon als beantwortet markiert sind.

    Man Sollte möglichst nur 1 Frage pro Thread stellen, dann kann man sich sauberere Unterhalten.
    Ebenso wir von anderen die Antwort zu "DER einen" Frage besser gefunden.

    Mach also bitte einen neuen Thread (Frage) auf.


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Montag, 16. September 2013 10:40