renebue
Goto Top

AD-Benutzer per Shell auslesen und vergleichen

Hallo,

ich habe von meinem Chef eine Aufgabe bekommen die mich als Powershell anfänger zum verzweifeln bringt.
Ich soll per Skript bei den AD-Usern etwas vergleichen.

Das Skript soll den eingegeben Namen im AD mit dem Anzeigenamen (Vor- und Nachnamen) vergleichen.
Anschließend sollen unterschiede wie in diesem Beispiel heraus geschrieben werden.

Eingegebener Name: Petra Müller
Anzeigename: Petra Mueller

Ich hatte irgendwie an eine If-Abrage gedacht, aber leider habe ich noch kaum Ahnung von der Shell.

Es wäre nett, wenn mir jemand bei diesem Problem helfen könnte.

Grüße

Content-ID: 339519

Url: https://administrator.de/forum/ad-benutzer-per-shell-auslesen-und-vergleichen-339519.html

Ausgedruckt am: 16.02.2025 um 23:02 Uhr

H41mSh1C0R
H41mSh1C0R 01.06.2017 um 09:38:22 Uhr
Goto Top
a1b2c3
a1b2c3 01.06.2017 um 09:56:55 Uhr
Goto Top
Hallo,


noch als Ergänzung zu dem Link von H41mSh1C0R

Eine Übersicht möglicher Vergleichsoperatoren


Viele Grüße
colinardo
colinardo 01.06.2017 aktualisiert um 10:11:17 Uhr
Goto Top
Servus,
gehe ich richtig in der Annahme das hier nach "Ähnlichen" Namen gesucht werden soll?! Denn deine oben geschilderte Änderung (Umlaut) wäre ja nur eine von vielen welche hier der Fall sein könnten.
In dem Fall könntest du eine Änlichkeitssuche durchführen bei der der eingegebene DisplayName mit dem der AD-User mit einer Näherungsfunktion verglichen wird bei der man angibt wieviele Stellen des Namens sich ändern dürfen damit ein Account als "ähnlich" erkannt werden soll.

Hier ein Beispiel wie sowas aussieht:
Import-Module ActiveDirectory

# Funktion die die Anzahl an Änderungen an einem String zurückgibt um beide Strings aneinander anzugleichen
function Get-StringDifferences{
    param([string] $first, [string] $second)
 
    $l1 = $first.length
    $l2 = $second.length
 
    if($l1 -eq 0){return $l2}
    if($l2 -eq 0){return $l1}
 
    if($ignoreCase.IsPresent){
        $first = $first.tolowerinvariant()
        $second = $second.tolowerinvariant()
    }

    $distance = new-object -type 'int[,]' -arg ($l1+1),($l2+1)  
 
    0..$l1 | %{$distance[$_,0] = $_}
    0..$l2 | %{$distance[0,$_] = $_}

    $cost = 0
 
    for($r = 1; $r -le $l1;$r++){
        for($c = 1; $c -le $l2;$c++){
            $cost = @{$true=0;$false=1}[($second[$c-1] -ceq $first[$r-1])]
            $tmin = [System.Math]::Min(([int]$distance[($r-1),$c]+1) , ([int]$distance[$r,($c-1)]+1))
            $distance[$r,$c] = [System.Math]::Min($tmin, ([int]$distance[($r-1),($c-1)] + $cost))
        }
    }
    return $distance[$l1, $l2];
}

# Parameter der Bestimmt wie viele Änderungen (Löschungen/Hinzufügungen/etc) am Namen existieren dürfen damit er als gleich  erkannt wird
$max_abweichung = 4
# Eingabe für dem Namen anfordern
$search = Read-Host "Please enter name to search for"  
# AD User mit Funktion und Where-Object vergleichen und ähnliche Accounts ausgeben
Get-AdUser -Filter * -Properties DisplayName | ?{(Get-StringDifferences -first $search -second $_.DisplayName) -le $max_abweichung} | select SamAccountName,Name,DisplayName
Es werden hier also alle Accounts zurückgegeben bei denen am DisplayName max. 4 Änderungen vorgenommen werden dürfen damit ein Name matcht.

Grüße Uwe
ReneBue
ReneBue 01.06.2017 um 13:17:21 Uhr
Goto Top
Hallo Uwe,

danke schonmal für deinen Lösungsvorschlag.

Es kann sein dass ich mich oben etwas ungenau ausgedrückt habe.
Meine Aufgabe besteht darin, fehler bei der Namenseingabe in Verbindung mit dem Anzeigenamen herauszufinden.

Um eventuelle Tippfehler oder falsche Namenseintragungen im AD Sichtbar zu machen und zu beheben.

Das ganze wird nun gefordert, da bei einem User im AD als Name bspw. "Peter Müller" eingetragen wurde und als Anzeigenamen "Peter Mueller"
Dies sind ja zwei unterschiedliche Namen und das wollen wir vermeiden.

Und für dieses Problem soll ich ein Skript schreiben, dass die Namen mit dem Anzeigenamen bei jedem AD Benutzer abgleicht.

Grüße
und nochmal danke face-smile
ReneBue
ReneBue 01.06.2017 um 13:18:11 Uhr
Goto Top
Danke! Werde mich aufjedenfall damit befassen

Gruß
colinardo
colinardo 01.06.2017 aktualisiert um 13:25:53 Uhr
Goto Top
D.h. du willst einfach nur vergleichen ob das Feld Name mit dem Feld DisplayName übereinstimmt? Und wenn nicht den Wert von Name in das Feld von DisplayName kopieren?
colinardo
Lösung colinardo 01.06.2017 um 13:33:57 Uhr
Goto Top
Das ist schnell gemacht face-wink
Get-AdUser -Filter * -Properties DisplayName | ?{$_.DisplayName -ne $_.Name} | %{Set-ADUser $_ -DisplayName $_.Name}
ReneBue
ReneBue 02.06.2017 um 07:13:19 Uhr
Goto Top
Danke schonmal face-smile
Ich werde es später testen und berichten ob es funktioniert!

face-smile