Question Amélioration script import AD

Plus d'informations
il y a 1 mois 3 jours #32911 par witness
Salut tout le monde.

Bonnes fêtes à tous.

Je reviens avec mon script d'import dans l'AD :
#Fonction permettant de remplacer les caractères diacritics
function Remove-DiacriticsAndSpaces
{
    Param(
        [String]$inputString
    )
    #Remplace les diacritics
    $sb = [Text.Encoding]::ASCII.GetString([Text.Encoding]::GetEncoding("Cyrillic").GetBytes($inputString))

    #Supprime les espaces et tout ce que la fonction ci-dessus a pu manquer
    return($sb -replace '[^a-z0-9]','')
}

#Fichier d'import (doit être au format UTF8)
$users = import-csv -path "C:\Users\admin\Desktop\Import AD users.csv" -delimiter ";"

$AD_SAM = get-ADuser -filter * -SearchBase "DC=mondomaine,DC=mondomaine,DC=com" | Select-Object -ExpandProperty SamAccountName

$NewUsers = $users | ForEach-Object {
    $sn = ($_.Nom).ToUpper() -replace '[ ]+',' '
    $givenname = $_.Prenom
    $Classe = $_.Classe
    $identifiant = $_.identifiant
    $ou = "OU=Eleves,DC=mondomaine,DC=mondomaine,DC=com"
    $description = 'GCU-ORG$ELEVE$' + $Classe
    $SAM = $givenname.Substring(0,1).ToLower() + $sn.ToLower()

    $SAM = Remove-DiacriticsAndSpaces -inputString $SAM
    $SAM = $SAM.SubString(0, [Math]::Min(19, $SAM.length))

    if ($AD_SAM -contains $SAM)
    {
        for ($i = 1 ; ; $i++)
        {
            $SAMtmp = $SAM.SubString(0, [Math]::Min(19 - $i.ToString().Length, $SAM.length)) + $i.ToString()

                if ($AD_SAM -notcontains $SAMtmp)
                {
                    $SAM = $SAMtmp
                    break
                }
        }
    }
    $AD_SAM += $SAM


    $CN = $sn + " " + $givenname + " " + "[$identifiant]"
    $displayName = $CN
    $UPN = $SAM + "@mondomaine.com"
    $userAccountControl = 66050
    $CannotChangePassword = 1
    $HomeDrive = "U"
    $HomeDirectory = "\\test\test"
    $ProfilePath = "\\server-data\Profils_Eleves\%profil%"
    $ScriptLogon = "test"
    $Password = '{0}{1}' -f (get-random -Minimum 1000000 -Maximum 9999999), [char](get-random -Minimum 65 -Maximum 90)
    $Password = $Password -replace '0',(Get-Random -Minimum 1 -Maximum 9) -replace 'O',[char](get-Random -Minimum 65 -Maximum 78)
    $Secure_String_pwd = ConvertTo-SecureString $Password -AsPlainText -Force
    $Enabled = 1
    

New-ADuser -displayName $displayName -Path $ou -Description $description -SamAccountName $SAM -givenname $givenname -Surname $sn -name $displayName -UserPrincipalName $UPN -PasswordNeverExpires $userAccountControl -CannotChangePassword $CannotChangePassword -HomeDrive $HomeDrive -HomeDirectory $HomeDirectory -ProfilePath $ProfilePath -ScriptPath $ScriptLogon -Enabled $Enabled -Accountpassword $Secure_String_pwd


[PSCustomObject]@{
    Nom = $sn
    Prenom = $givenname
    Classe = $Classe
    Login = $SAM
    Mot_de_passe = $Password
    }

}

#Fichier d'export (doit être au format UTF8)
$NewUsers | Export-Csv -path "C:\Users\admin\Desktop\Export eleves.csv" -Encoding UTF8 -Append -NoTypeInformation -Delimiter ";"
 

Il fonctionne très bien pour l'import mais il se limite à créer des comptes.

J'aimerais donc l'améliorer afin qu'il tienne compte des utilisateurs à créer, modifier et supprimer.

Si identifiant_CSV / identifiant_AD = modification du champ description
Si identifiant_CSV / identifiant_AD = Suppression du compte
Si identifiant_CSV / identifiant_AD = Création du compte

J'ai pensé à l'identifiant pour la comparaison entre CSV et AD car il est unique pour chaque utilisateur, il est dans le csv source et il est présent dans le displayname de l'AD (valeur entre crochet) :
$CN = $sn + " " + $givenname + " " + "[$identifiant]"
$displayName = $CN

En première approche, pour le script, je vois la chose comme ça :

Pour chaque utilisateur dans l'AD

If (la valeur displayname contient entre crochets une valeur identifiant présent dans le csv)
{
Remplacer le champ description de l'utilisateur par la valeur du champ description du csv
}
Elseif (le displayname ne contient pas entre crochets un identifiant présent dans le csv)
{
Supprimer l'utilisateur
}
Else
{
Création de l'utilisateur (en reprenant le bloc existant dans le script actuel)
}

Qu'en pensent les experts ?

Merci :)

 

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 1 mois 1 jour #32916 par rhiwotar
Réponse de rhiwotar sur le sujet Amélioration script import AD
Bonjour,

Dans l'idée, ça parait cohérant, à voir la pratique.
Je te propose quand même une petite idée, ou plutôt un garde fou, fait un export des élèves que tu modifies/supprimes, ça te permet de garder une trace et de pouvoir le recréer rapidement à l'identique s'il y a erreur humaine dans le CSV.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 4 semaines 2 jours - il y a 4 semaines 2 jours #32920 par Laurent Dardenne
Salut,
Compare-Object peut déterminer les 3 cas que tu cherches à traiter, de plus il ajoute un membre sur l'objet, utile avec l'instruction Switch.

[Edit]
Sous réserve que tu disposes de deux collections. Si, pour chaque personne, tu compares directement dans l'AD, Compare-Object ne sera pas adapté.

Tutoriels PowerShell
Dernière édition: il y a 4 semaines 2 jours par Laurent Dardenne.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 4 semaines 1 jour #32921 par witness
Réponse de witness sur le sujet Amélioration script import AD
Bonjour,

Ça peut être utile oui.

Merci.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 4 semaines 1 jour #32922 par witness
Réponse de witness sur le sujet Amélioration script import AD
Salut,

En effet, j'ai pensé après coup à cette commande pour arriver à mon but mais je n'ai pas encore travaillé mon script.

Je reviendrai avec un script plus avancé.

Merci pour le conseil :)

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.045 secondes
Propulsé par Kunena