Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Shop Recherche
5689 connectés 

  FORUM HardWare.fr
  Systèmes & Réseaux Pro
  Infrastructures serveurs

  Problème script Powershell pour AD

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème script Powershell pour AD

n°159932
bibi773
Posté le 23-01-2019 à 09:34:35  profilanswer
 

Bonjour à tous,
 
voilà j'ai un problème, je vous explique le contexte:
j'ai une liste d'USER (nom, prénom à désactivé et déplacé)
je lance un script qui récupère le name,SurName,GivenName,SamaccountName,UserPrincipalName, et le DistinguishedName pour savoir ou il sont dans l'ad avant déplacement, bien sur j'export toute ses info.
 
Ensuite je cherche à faire un script qui contrôle si l'user existe bien, fait des log (je cherche a exclure l'OU essai, ça fonctionne) et j'exporte sous forme de tableau.
 
Mon problème c'est que mon script tapait dans toute l'AD (pas optimal et très long) je cherche a faire un get-aduser dans une OU cible mais ça pourri mon script.
Voici le script bancale
 
Import-Module ActiveDirectory  
 
# Chemin vers le fichier CSV
$Fichier=import-csv c:\tmp\fichier.csv
$array = @()
#exclusion d'une OU
$OUDN = 'OU=essai,OU=user,OU=@test1.local,DC=test1,DC=local'
 # Fichier de logs nommé à la date et l'heure de l'exécution du script
$DateHeure = Get-Date -Format "yyyyMMddHHmm"
$log = "c:\tmp\log\fichier_$DateHeure.log"
$action = foreach($user in $fichier) {
#$testuser = $users.SamAccountName
$Users = Get-ADUser -identity $user.SamAccountName | Select-Object name,SurName,GivenName,SamaccountName,UserPrincipalName,Enabled,DistinguishedName
    If ($Users -ne $Null)
    {
        $line = New-Object -TypeName psobject
        <#$line = crée un object de type powershell#>
        $line | Add-Member  -MemberType NoteProperty -Name 'SamAccount1' -Value "$user.SamAccountName"
        $line | Add-Member  -MemberType NoteProperty -Name 'Name' -Value $($Users.Name)
        $line | Add-Member  -MemberType NoteProperty -Name 'SurName' -Value $($Users.SurName)
        $line | Add-Member  -MemberType NoteProperty -Name 'GivenName' -Value $($Users.GivenName)
        $line | Add-Member  -MemberType NoteProperty -Name 'Exist' -Value "True"
        $line | Add-Member  -MemberType NoteProperty -Name 'SamaccountName' -Value $($Users.SamaccountName)
        $line | Add-Member  -MemberType NoteProperty -Name 'UserPrincipalName' -Value $($Users.UserPrincipalName)
        $line | Add-Member  -MemberType NoteProperty -Name 'Enabled' -Value $($Users.Enabled)
        $line | Add-Member  -MemberType NoteProperty -Name 'DistinguishedName' -Value $($Users.DistinguishedName)
        $array += $line
    }
    else
    {
        $line = New-Object -TypeName psobject
        $line | Add-Member  -MemberType NoteProperty -Name 'SamAccount1' -Value "$user.SamAccountName"
        $line | Add-Member  -MemberType NoteProperty -Name 'Name' -Value "Null"
        $line | Add-Member  -MemberType NoteProperty -Name 'SurName' -Value "Null"
        $line | Add-Member  -MemberType NoteProperty -Name 'GivenName' -Value "Null"
        $line | Add-Member  -MemberType NoteProperty -Name 'Exist' -Value "Not Found"
        $line | Add-Member  -MemberType NoteProperty -Name 'SamaccountName' -Value "Null"
        $line | Add-Member  -MemberType NoteProperty -Name 'UserPrincipalName' -Value "Null"
        $line | Add-Member  -MemberType NoteProperty -Name 'Enabled' -Value "False"
        $line | Add-Member  -MemberType NoteProperty -Name 'DistinguishedName' -Value "Null"
        $array += $line
    }
   
    }
    $array | ft
    #$array | Export-csv -path "c:\tmp\array.csv" -Delimiter ";" -NoTypeInformation
$action #| export-csv -Path c:\tmp\export-user.csv -NoTypeInformation -Encoding UTF8
#$action1 | export-csv -Path c:\tmp\userunknow.csv -NoTypeInformation -Encoding UTF8
foreach ($user in $Fichier){
    try{
        $UserLogin = $user.SamAccountName
        Set-ADUser -Identity $user.Samaccountname -Enabled $false
        Get-ADUser -Filter $user.SamAccountName -SearchBase 'OU=user,OU=@test1.local,DC=test1,DC=local' | Where-Object { $_.DistinguishedName -notlike "*,$OUDN" } |move-adobject -targetpath "ou=désactivé,ou=@test1.local,dc=test1,dc=local"
        Add-Content -Path "$log" -Value "l'utilisateur $UserLogin est désormais désactivé et déplacé !"
 
        }
    catch{    
    Add-Content -Path "$log" -Value "ERREUR ! Impossible de mettre à jour l'utilisateur $UserLogin !"
    }
}
 
Si quelqu'un à une idée, je pense que ça viens de la fin sur le get-adUser -Filter juste après le set, j'ai aussi essayé avec des {}sur cette ligne ça change rien.
 
en revanche si on remplace cette ligne par
Get-ADUser -Filter $user.SamAccountName -SearchBase 'OU=user,OU=@test1.local,DC=test1,DC=local' | Where-Object { $_.DistinguishedName -notlike "*,$OUDN" } |move-adobject -targetpath "ou=désactivé,ou=@test1.local,dc=test1,dc=local"
 
tout fonctionne mais ça get la totalité de l'ad et pas seulement l'OU utilisateur.
 
voilou
 
Et bonne année à tous
 


---------------
http://forum.hardware.fr/forum2.ph [...] w=0&nojs=0
mood
Publicité
Posté le 23-01-2019 à 09:34:35  profilanswer
 

n°159947
nebulios
Posté le 23-01-2019 à 18:18:56  profilanswer
 

Ce mur de texte ne te pose pas de problèmes ? Sinon utilise -filter et la méthode filter left format right

n°159953
CK Ze CaRi​BoO
Posté le 23-01-2019 à 19:52:01  profilanswer
 

J'ai un peu de mal à comprendre ce que tu veux faire au départ.
Tu as une liste d'utilisateurs dans un fichier dont tu veux vérifier l'existence dans l'AD et ensuite faire quoi exactement ?


---------------
The only thing necessary for the triumph of evil is for good people to do nothing.
n°159955
bibi773
Posté le 23-01-2019 à 20:55:01  profilanswer
 

Désoler pour le brouillon,
en faite j'ai une liste de SamaccountName et je dois déplacer et désactivé des users, par précaution je crée un tableau pour avoir un backup et je dois aussi exclure une UO ça c'est bon. Mais mon script tape dans toute l'AD se qui le rend très lent et moins fiable, mon problème est dans le le get-aduser dans try:
 
Get-ADUser -Filter $user.SamAccountName -SearchBase 'OU=user,OU=@test1.local,DC=test1,DC=local' | Where-Object { $_.DistinguishedName -notlike "*,$OUDN" } |move-adobject -targetpath "ou=désactivé,ou=@test1.local,dc=test1,dc=local"  
 
j'ai essayé avec cette syntaxe get-aduser -Filter {SamAccountName -eq $user.SamAccountName}
 
par contre si je fais un get-aduser -identity ça fonctionne mais ça prend toute l'AD.
 
Je suis pas un champion en powershell mais la j'ai presque 500 user à bouger.


---------------
http://forum.hardware.fr/forum2.ph [...] w=0&nojs=0
n°159956
Je@nb
Modérateur
Kindly give dime
Posté le 23-01-2019 à 21:33:55  profilanswer
 

ta construction de tableau sert pas à gd chose ... en plus du coup tu te tapes 2x la recherche des users ...
et ton filtre c'est plutôt -Filter "SamAccountName -eq '$($user.SamAccountName)'"

n°160082
bibi773
Posté le 29-01-2019 à 11:16:41  profilanswer
 

Bonjour, un grand merci pour vos pistes, j'ai résolu mon problème.
Le tableau m'a été demandé et ça permet au support de savoir où était l'user avant déplacement au cas où il y aurait un mauvais user dans la liste. L'erreur humaine reste possible.
 
Effectivement le -Filter m'aide grandement
 
Voici le scrpit terminé au cas où (encore désolé pour le parpaing :D)
 
 
Import-Module ActiveDirectory  
 
# Chemin vers le fichier CSV
$Fichier=import-csv c:\tmp\fichier.csv
#Création tableau
$array = @()
# Fichier de logs nommé à la date et l'heure de l'exécution du script
    $DateHeure = Get-Date -Format "yyyyMMddHHmm"
    $log = "c:\tmp\log\fichier_$DateHeure.log"
# la boucle
$action = foreach($user in $fichier) {
    try
    {
    # Déclaration de variable:
    #$User récupère les identités des users du fichier csv dans l'AD
    $Users = Get-ADUser -identity $user.SamAccountName | Select-Object name,SurName,GivenName,SamaccountName,UserPrincipalName,Enabled,DistinguishedName
    # $UserLogin se base sur le Samaccount Name du CSV
    $UserLogin = $user.SamAccountName
    # $User1 filter les UO pour que les GET soit que dans l'UO user et pas toute l'AD
    $Users1 = Get-ADUser -Filter { samAccountName -eq $UserLogin} -SearchBase 'OU=user,OU=@test1.local,DC=test1,DC=local' | Select-Object name,SurName,GivenName,SamaccountName,UserPrincipalName,Enabled,DistinguishedName
        # on commence par le filtre $User1 pour selectionné qu'UO, s'il n'est pas null passer a la suite
        if ($Users1 -ne $null)
        {
             # $OUDN est une OU à exclure, on la déclare
             $OUDN = 'OU=essai,OU=user,OU=@test1.local,DC=test1,DC=local'
             #second if après le filtre $Users1 si l'utilisateur de l'UO user ne ressemble pas à l'OU à exclure (OU essai) passer à la suite
            if ($Users1.DistinguishedName -notlike "*,$OUDN" )
            {
            # Ensuite après le filtre $Users1 et le filtre $Users1.DistinguishedName , Si l'identité de l'user dans du fichier csv corresponds à l'AD, on récupère les info dans le tableau
            If ($Users -ne $Null)
    {
         
        $line = New-Object -TypeName psobject
        <#$line = crée un object de type powershel, fait une ligne #>
        $line | Add-Member  -MemberType NoteProperty -Name 'SamAccount1' -Value "$user.SamAccountName"
        $line | Add-Member  -MemberType NoteProperty -Name 'Name' -Value $($Users.Name)
        $line | Add-Member  -MemberType NoteProperty -Name 'SurName' -Value $($Users.SurName)
        $line | Add-Member  -MemberType NoteProperty -Name 'GivenName' -Value $($Users.GivenName)
        $line | Add-Member  -MemberType NoteProperty -Name 'Exist' -Value "True"
        $line | Add-Member  -MemberType NoteProperty -Name 'SamaccountName' -Value $($Users.SamaccountName)
        $line | Add-Member  -MemberType NoteProperty -Name 'UserPrincipalName' -Value $($Users.UserPrincipalName)
        $line | Add-Member  -MemberType NoteProperty -Name 'Enabled' -Value $($Users.Enabled)
        $line | Add-Member  -MemberType NoteProperty -Name 'DistinguishedName' -Value $($Users.DistinguishedName)
        # Récupère les lignes et les ajoute dans le tableau
        $array += $line
    }
    # Sinon remplir les info dans se tableau
    else
    {
        $line = New-Object -TypeName psobject
        $line | Add-Member  -MemberType NoteProperty -Name 'SamAccount1' -Value "$user.SamAccountName"
        $line | Add-Member  -MemberType NoteProperty -Name 'Name' -Value "Null"
        $line | Add-Member  -MemberType NoteProperty -Name 'SurName' -Value "Null"
        $line | Add-Member  -MemberType NoteProperty -Name 'GivenName' -Value "Null"
        $line | Add-Member  -MemberType NoteProperty -Name 'Exist' -Value "Not Found"
        $line | Add-Member  -MemberType NoteProperty -Name 'SamaccountName' -Value "Null"
        $line | Add-Member  -MemberType NoteProperty -Name 'UserPrincipalName' -Value "Null"
        $line | Add-Member  -MemberType NoteProperty -Name 'Enabled' -Value "False"
        $line | Add-Member  -MemberType NoteProperty -Name 'DistinguishedName' -Value "Null"
        $array += $line
    }
    #une fois la boucle avec tous les if fait on procède à la modification
    #désactive l'user
    Set-ADUser -Identity $UserLogin -Enabled $false
    # déplace l'user dans OU désactivé
    get-aduser $UserLogin | move-adobject -targetpath "ou=désactivé,ou=@test1.local,dc=test1,dc=local"
    #indique la réussite dans les logs
    Add-Content -Path "$log" -Value "l'utilisateur $UserLogin est désormais désactivé et déplacé !"
            }
            # Sinon
             else
            {
        # Indique l'erreur dans les logs
        Add-Content -Path "$log" -Value "ERREUR ! Impossible de mettre à jour l'utilisateur $UserLogin !"
        }
        }
    }
catch
{
    #Si l'user n'est pas dans l'AD on le récupère dans la variable $Action1
    $action1 = Write-Output $user
}      
}
#affiche directement sous forme de tableau tous les users
$array | ft
#exporte le tableau avant modification
$array | Export-csv -path "c:\tmp\array.csv" -Delimiter ";" -NoTypeInformation
# execute la boucle
$action
# Récupère les users inconnu dans un autre fichier
$action1 | export-csv -Path c:\tmp\userunknow.csv -NoTypeInformation -Encoding UTF8


Message édité par bibi773 le 29-01-2019 à 11:17:42

---------------
http://forum.hardware.fr/forum2.ph [...] w=0&nojs=0

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Systèmes & Réseaux Pro
  Infrastructures serveurs

  Problème script Powershell pour AD

 

Sujets relatifs
[WIFI CISCO] problème de déconnexionSamba 4 et syncronisation AD
Problème d'adressage ip sur PC WIN 7probleme de connectivie local et DHCP
Problème affichage outlook web access[Powershell] - resultat de Invoke-command
Problème borne expiration CISCO - URGENTproblème AD exchange 10
Problème bascule DNS secondaire 
Plus de sujets relatifs à : Problème script Powershell pour AD


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR