pixel0815
Goto Top

Frage zu Skript, Abgleich Vorname und Nachname mit AD

Hallo zusammen,

ich habe als Grundlage einen auszug aus einem HR System.
Dort gibt es viele Felder, unter anderem auch Vor und Nachname.
Damit gleiche ich Zeile für Zeile das AD ab.

Die Emailadresse wird auch benötigt, diese liegt in einem externen Mail Forest. Das abziehen der Daten funktioniert auch soweit gut.
Es gibt aber manchmal lücken, und dann sind Email und der Benutzernamen aus dem Mail Forest nicht in der CSV.

Hat da jemand ein Tip für mich? Oder kann einiges zusammengefasst werden?
$csv = Import-CSV -Path 'W:\Stammdaten.csv' -Delimiter ";" -Encoding Unicode  
$aduser = Get-ADUser -Filter * -Properties Surname,Givenname,LastLogonDate,Enabled,msDS-parentdistname,PasswordLastSet
#$aduser = Get-ADUser -Filter * -Properties Surname,Givenname,LastLogonDate,EmailAddress,Enabled,msDS-parentdistname

Function Umlaute-Ersetzen([string]$text){
    return [regex]::Replace($text,'(?i)[äöüß]',{param($m) switch -CaseSensitive ($m){'ä'{'ae'};'ü'{'ue'};'ö'{'oe'};'ß'{'ss'};'Ä'{'Ae'};'Ü'{'Ue'};'Ö'{'Oe'}}})  
}

$csv | %{
    $sn = $_.Nachname
    $gn = $_.Vorname

    $kst = $_.Kostenstelle
    $kst1 = $_.KST
    $perso =$_.Vertragsstatus
    $personalnr =$_.PNR
    $mandant=$_.MAN
    $DA=$_.DA
    $Anrede=$_.Anrede
    $titel=$_.Titel
    $Namenszusatz=$_.Namenszusatz
    $Vorsatzwort=$_.Vorsatzwort


    $user = $aduser | ?{($_.Surname -like "*$sn*" -and $_.GivenName -like "*$gn*") -or ($_.Surname -like (Umlaute-Ersetzen "*$sn*") -and $_.GivenName -like (Umlaute-Ersetzen "*$gn*" ))}  

    # Mailadresse holen
    $filter = "$($user.SamaccountName)*"   
    $filter1= "$($user.SamaccountName)-6"   

    $mailinfos= Get-ADUser -Filter {SamAccountname -like $filter -or SamAccountName -like $filter1 } -server "mailserver.mail" -SearchBase "OU=Mandant1234,DC=xxx,DC=xxx -Properties Name,SamAccountName,Mail| select Name,SamAccountName,Mail  

    $email = $mailinfos.mail -join "; "  
    $SAM-Mailcenter = $mailinfos.SamAccountName -join "; "  

    if($user){
       $user | select *,@{n='Kostenstelle';e={$kst}},@{n='Vertragsstatus';e={$perso}},@{n='Email-Adresse';e={$email}},@{n='KST-Nummer';e={$kst1}},@{n='Personalnummer';e={$personalnr}},@{n='MandantNr';e={$mandant}},@{n='DA';e={$DA}},@{n='Anrede';e={$anrede}},@{n='Titel';e={$titel}},@{n='Namenszusatz';e={$Namenszusatz}},@{n='Vorsatzwort';e={$Vorsatzwort}},@{n='Mailcenter-SAM';e={$SAM-Mailcenter }}  

   }else{[pscustomobject]@{SamAccountName="-NICHT GEFUNDEN - Bitte prüfen-";Name="$sn, $gn";Kostenstelle="$kst"}}  

} | select Anrede,Titel,Vorsatzwort,Namenszusatz,Surname,Givenname,Name,SamAccountName,Mailcenter-SAM,Email-Adresse,Enabled,LastLogonDate,PasswordLastSet,MandantNr,DA,Personalnummer,KST-Nummer,Kostenstelle,Vertragsstatus,msDS-parentdistname | export-csv "W:\Testliste.csv" -Delimiter ";" -Force -Notype -Encoding Unicode  

Content-Key: 435218

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

Printed on: May 3, 2024 at 13:05 o'clock

Member: erikro
erikro Apr 01, 2019 at 14:39:08 (UTC)
Goto Top
Moin,

ein paar Tipps hätte ich:

1. Quellcode richtig formatieren, um ihn lesbarer zu machen.
2. In Skripten keinen Aliases verwenden wie % und ?. Auch das macht den Code lesbarer.
3. Nicht Foreach-Object benutzen, sondern die Foreach-Schleife. Letzteres ist schneller.
https://sid-500.com/2017/08/31/measure-command-a-speed-comparison-foreac ...
https://devblogs.microsoft.com/scripting/getting-to-know-foreach-and-for ...

Also nicht

$csv | foreach-Object {...}

sondern besser

foreach($dataset in $csv) {...}

Ansonsten scheint das Skript zu machen, was Du willst, sofern ich richtig verstanden habe, was Du willst. face-wink

hth

Erik
Mitglied: 139374
139374 Apr 01, 2019 updated at 14:44:32 (UTC)
Goto Top
Ein Fall für "beaf286644d2c4bb62b6f19b6127f9de4b6a9a1e0e11e6ee79a0dd40038ba246"