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

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

Printed on: April 26, 2024 at 21:04 o'clock

Member: H41mSh1C0R
H41mSh1C0R Jun 01, 2017 at 07:38:22 (UTC)
Goto Top
Member: a1b2c3
a1b2c3 Jun 01, 2017 at 07:56:55 (UTC)
Goto Top
Hallo,


noch als Ergänzung zu dem Link von H41mSh1C0R

Eine Übersicht möglicher Vergleichsoperatoren


Viele Grüße
Member: colinardo
colinardo Jun 01, 2017 updated at 08:11:17 (UTC)
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
Member: ReneBue
ReneBue Jun 01, 2017 at 11:17:21 (UTC)
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
Member: ReneBue
ReneBue Jun 01, 2017 at 11:18:11 (UTC)
Goto Top
Danke! Werde mich aufjedenfall damit befassen

Gruß
Member: colinardo
colinardo Jun 01, 2017 updated at 11:25:53 (UTC)
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?
Member: colinardo
Solution colinardo Jun 01, 2017 at 11:33:57 (UTC)
Goto Top
Das ist schnell gemacht face-wink
Get-AdUser -Filter * -Properties DisplayName | ?{$_.DisplayName -ne $_.Name} | %{Set-ADUser $_ -DisplayName $_.Name}
Member: ReneBue
ReneBue Jun 02, 2017 at 05:13:19 (UTC)
Goto Top
Danke schonmal face-smile
Ich werde es später testen und berichten ob es funktioniert!

face-smile