Partage
  • Partager sur Facebook
  • Partager sur Twitter

BASH - Effacer doublons et raccourcir mots

    15 juin 2021 à 10:31:41

    Bonjour, 

    Je suis entrain de créer un script pour créer en masse des utilisateurs dans un active directory depuis un fichier CSV. 

    Les identifiants sont créés à partir du nom et du prénom (première lettre du prénom . nomdefamille exemple Pierre DUPOND p.dupond)

    J'ai deux questions : 

    - Je souhaite éviter les doublons et s'il y a un doublon rajouté 1 à la fin

    - Couper les noms trop long à 10 caractères s'il fait plus 

    Merci d'avance

    -
    Edité par tonny16 27 juin 2021 à 16:41:50

    • Partager sur Facebook
    • Partager sur Twitter
      16 juin 2021 à 0:23:32

      Bonjour,

      Renomme le titre de ton sujet s'il-te-plait, «PowerShell», c'est trop vague.

      tonny16 a écrit:

      - Je souhaite éviter les doublons et s'il y a un doublon rajouté 1 à la fin

      C'est quoi un doublon? Sur quels attributs d'utilisateur AD veux-tu te baser pour déterminer le doublon? SamAccountName et Name?

      Une fois que tu as les réponses à cette question. Comment ferais-tu pour trouver un utilisateur dans l'AD selon certains attributs?

      tonny16 a écrit:

      - Couper les noms trop long à 10 caractères s'il fait plus

      Les noms de famille je suppose? Tu as chercher sur comment déterminer la longueur du chaîne de caractère en PS? Et comment obtenir une sous-chaîne de caractère depuis une chaîne de caractère?

      PS est orienté objet. Peut-être que les variables de type chaîne de caractère disposent de méthodes particulières? ;)

      https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/get-member?view=powershell-7.1

      Si tu veux plus d'aide, il faudra commencer par poster le script que tu as écris jusqu'ici.

      • Partager sur Facebook
      • Partager sur Twitter
        21 juin 2021 à 14:12:05

        Bonjour,

        Je précise mes questions :

        Je pars à zéro pour l'AD. C'est donc lors de la création que je veux vérifier s'il y a un doublon.

        S'il y a deux m.dupont (Michel et Morgan DUPONT) du coup j'ai un doublon. Comment vérifier la présence d'un doublon ?

        Je vous mets mon code, soyez indulgent, je commence tout juste

        $CSVFile = "C:\AD_USERS\listeelevetest.csv"
        $cvsData = Import-CSV -Path $csvFile -Delimiter ";" -Encoding UTF8;
        
        Foreach($Utilisateur in $cvsData) {
        $UtilisateurNom = $Utilisateur.nom
        $UtilisateurPrenom = $Utilisateur.prenom
        $nompropre = $UtilisateurNom -replace '[\W]',''.ToLower()
        $prenompropre = $UtilisateurPrenom -replace 'é','e'.ToLower()
        $Utilisateurlogin = ($prenompropre).Substring(0,1) + "." + $nompropre.ToLower()
        $Utilisateurloginok = $Utilisateurlogin.ToLower()
        $motdepasse = $Utilisateur.datenaissance
        $nbcaractere = $nompropre.Length
        
        if ($nbcaractere -ge 8) {
        $nompropre.Substring(0,7)
        
        }
        $Utilisateurloginok
        
        $motdepasse
        }

        Merci pour votre aide

        • Partager sur Facebook
        • Partager sur Twitter
          21 juin 2021 à 17:14:38

          je ferai l'opération au niveau du fichier csv, via excel
          • Partager sur Facebook
          • Partager sur Twitter
            21 juin 2021 à 20:34:01

            Bonjour,

            Alors oui, on pourrait le faire au moment de parser du fichier CSV (pas besoin d'Excel).

            Il faut alors parser tous le fichiers CSV pour au moins créer les ID que tu vas utiliser dans l'AD en les plaçant au fur et à mesure dans une structure itérable de type tableau ou liste (je sais plus trop en PS) et vérifier avant de l'ajouter à la structure qu'il n'existe pas dedans. Et enfin, réitérer sur cette structure et ajouter les utilisateurs à l'AD.

            C'est une très mauvaise solution. Car elle implique d'itérer la structure avant chaque ajout et de d'itérer une dernière fois dessus à la fin. Ce qui augmente, proportionnellement aux nombres de ligne de ton CSV, la complexité en temps et en mémoire (en gros ton programme mettra plus de temps et demandera plus de ressources pour être exécuté). En plus, le jour où tu veux RAJOUTER des utilisateurs dans l'AD, ton script ne fonctionnera plus :-°

            Une solution simple, c'est de parser ton CSV et d'ajouter les utilisateurs au fur et à mesure dans l'AD. À chaque ajout, il suffit de vérifier que l'utilisateur que tu veux créer n'existe pas déjà dans l'AD.

            https://docs.microsoft.com/fr-fr/powershell/module/activedirectory/?view=windowsserver2019-ps

            Plus précisément: https://docs.microsoft.com/fr-fr/powershell/module/activedirectory/get-aduser?view=windowsserver2019-ps

            Pour tester si un utilisateur existe dans l'AD avec un attribut sAMAccountName donné:

            try {
                Get-ADUser -Identity $utilsateurlogin
            } catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] {
                Write-Host "L'utilsateur $utilisateurlogin n'existe pas."
            }
            

            Le try { ... } catch { ... } est important car si l’utilisateur n'existe pas une exception est levée. Sans le try { ... } catch { ... } ton programme s'arrête dans ce cas.

            (Attention: ça ne fonctionne que si tu sais que l'identifiant est similaire pour le sAMAccountName et l'UPN (UserPrincipalName). Ce qui est souvent le cas. Car les deux peuvent être utilisés pour se connecter avec l'annuaire LDAP de l'AD).

            Je te conseil d'au moins découper ton programme en plusieurs fonctions pour éviter d'avoir un code impossible à lire.

            Une autre structure utile pour éviter d'avoir trop de variables qui se baladent dans ton code est la table de hachage: https://docs.microsoft.com/fr-fr/powershell/module/microsoft.powershell.core/about/about_hash_tables?view=powershell-7.1

            Ainsi, si les clés de la table de hachage correspondent aux paramètre attendu d'une cmdlet, tu peux directement passer cette table en paramètre. Ce qui est utile avec New-ADUser par exemple: ;)

            $pswd = "Password1" | ConvertTo-SecureString -AsPlainText -Force
            $utilsateurParametres = @{
                Name = "Michel Dupont"
                GivenName = "Michel"
                Surname = "Dupont"
                DisplayName = "Michael Dupont"
                SamAccountName = "m.dupont"
                UserPrincipalName = "m.dupont@domaine.local"
                Path = "OU=Utilisateurs,DC=domaine,DC=local"
                Enabled = $true
                AccountPassword = $pswd
                ChangePasswordAtLogon = $true
            }
            New-ADUser @utilsateurParametres

            L'attribut AccountPassword ne peut pas prendre une simple chaîne de caractère (d'où la première ligne pour la transformer). De plus, il existe peut-être une complexité minimale imposée (souvent 8 caractère, un chiffre, une majuscule, une minuscule).

            Je te souhaite bon courage pour essayer d'assimiler un peu tout ça et d'en faire un script. On t'aidera si tu bloques (tant que tu postes ton code, même s'il est pas beau ;) ).

            EDIT: Bash c'est pire encore comme nom de sujet :colere2:

            -
            Edité par KoaTao 21 juin 2021 à 20:43:07

            • Partager sur Facebook
            • Partager sur Twitter
              27 juin 2021 à 16:46:01

              Bonjour,

              J'ai avancé sur mon code :

              $CSVFile = "C:\AD_USERS\listeelevetest.csv"
              $cvsData = Import-CSV -Path $csvFile -Delimiter ";"
              
              Foreach($Utilisateur in $cvsData) {
              $UtilisateurNom = $Utilisateur.nom
              $UtilisateurPrenom = $Utilisateur.prenom
              $code = ($Utilisateur.datenaissance).Substring(6,2)
              $nompropre = $UtilisateurNom -replace '[\W]',''.ToLower()
              $prenompropre = $UtilisateurPrenom -replace 'é','e'.ToLower()
              $Utilisateurlogin = ($prenompropre).Substring(0,1) + "." + $nompropre.ToLower() + $code
              $Utilisateurloginok = $Utilisateurlogin.ToLower()
              $motdepasse = $Utilisateur.datenaissance
              $nbcaractere = $nompropre.Length
              
              
              
              
              $Utilisateurloginok
              $motdepasse
              }
              

              Pour limiter le nombre de doublon j'ai pensé à ajouté le jour de naissance au login (Jean Dupond 01/05/2000 : j.dupond01)

              Qu'est-ce que vous dites de mon code ? Vilain ?

              Merci

              • Partager sur Facebook
              • Partager sur Twitter

              BASH - Effacer doublons et raccourcir mots

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              • Editeur
              • Markdown