Question Ajouter colonne "restored" et écrire "ok ou "nok dans un fichier csv en sortie

Plus d'informations
il y a 1 an 7 mois - il y a 1 an 7 mois #32491 par Julien
Bonjour,

J'ai écrit un script qui permet, à partir d'un fichier csv en entrée (contenant une seule colonne "EmployeeNumber") de déterminer le SamAccountName correspondant et un certain nombres d'autres propriétés liées à l'utilisateur, et ce, en fonction que le User en question ait un compte actif, désactivé, ou supprimé dans l'Active Directory. Le tout est envoyé dans un fichier csv en sortie, nommé SamAccountName.$CurrentDate.csv

L'idée étant de pouvoir avoir les informations sur chaque compte AD passé en entrée (actif, désactivé et/ou supprimé) et pouvoir restaurer, à partir de ce fichier csv en entrée, tous les Users dont au moins un compte est supprimé. Le tout, exporté vers mon fichier csv en sortie SamAccountName.$CurrentDate.csv

Pour le moment, je parviens :

- à avoir les informations sur l'état des comptes en question : actifs, désactivés, supprimés et à obtenir les propriétés essentielles des comptes,
- à restaurer les utilisateurs pour lesquels au moins un compte est supprimé

Ce que je souhaiterais ajouter, c'est une colonne avec en tête nommée "Restored" dans mon fichier csv en sortie "SamAccountName.$CurrentDate.csv" et y intégrer un commentaire de type "ok" ou "nok" pour chaque compte utilisateur qui aura pu être restauré ou non grâce au fichier csv en entrée et ce, bien entendu, dans une boucle, puisque le fichier en entrée contiendra une multitude d'EmployeeNumber.

Tout fonctionne, même si j'ai bien conscience que la structure pourrait certainement être simplifié, mais je débute vraiment en powershell. Seule la possibilité d'exporter dans ce même fichier csv en sortie, une colonne "Restored" manque, mais je ne sais pas comment m'y prendre pour l'ajouter et marquer l'information voulue.

Voici le script que j'ai développé pour le moment :
 $Missing = New-Object psobject
 $Missing | Add-Member Noteproperty SamAccountname("Matricule erroné ou collaborateur non parti")
 $Missing | Add-Member Noteproperty title("Aucune correspondance")
 $Missing | Add-Member Noteproperty enabled("Aucune correspondance")
 $Missing | Add-Member Noteproperty Isdeleted("Aucune correspondance")
 $Missing | Add-Member Noteproperty employeeNumber (" ")
$Users = Import-Csv D:\Scripts\EmployeeNumber.csv
$CurrentDate = Get-Date
$CurrentDate = $CurrentDate.ToString('MM-dd-yyyy')

ForEach ($User in $Users) {
  $EmployeeNumber = $User.EmployeeNumber

# Si l'EmployeeNumber est inférieur à 6 caractères, ajouter des 0 à gauche
If($EmployeeNumber.length -lt 6){
$EmployeeNumber = "{0:d6}" -f [int]$EmployeeNumber
}


  $user = Get-ADObject -Filter {isDeleted -eq $True -and (EmployeeNumber -eq $EmployeeNumber)} -IncludeDeletedObjects -Properties employeeNumber,title,SamAccountName,enabled,Isdeleted | Select employeeNumber,title,SamAccountName,enabled,Isdeleted
  $user2 = Get-Aduser -Filter {EmployeeNumber -eq $EmployeeNumber} -Properties employeeNumber,title,SamAccountName,enabled,Isdeleted |select employeeNumber,title,SamAccountName,enabled,Isdeleted

# S'il existe un compte supprimé et un compte actif/désactivé, faire ce qui suit
If($user -ne $null -and $user2 -ne $null){
$user | Export-Csv -Path "D:\Scripts\SamAccountName.$CurrentDate.csv" -Append -Delimiter ";"
$user2 | Export-Csv -Path "D:\Scripts\SamAccountName.$CurrentDate.csv" -Append -Delimiter ";"

 Get-ADObject -Filter {employeenumber -eq $EmployeeNumber} -IncludeDeletedObjects | Restore-ADObject
                         }
# S'il existe un compte supprimé et qu'aucun compte actif/désactivé n'est trouvé, faire ce qui suit
elseif($user -ne $null -and $user2 -eq $null){
  $user = Get-ADObject -Filter {isDeleted -eq $True -and (EmployeeNumber -eq $EmployeeNumber)} -IncludeDeletedObjects -Properties employeeNumber,title,SamAccountName,enabled,Isdeleted | Select employeeNumber,title,SamAccountName,enabled,Isdeleted
  $user | Export-Csv -Path "D:\Scripts\SamAccountName.$CurrentDate.csv" -Append -Delimiter ";"

  Get-ADObject -Filter {employeenumber -eq $EmployeeNumber} -IncludeDeletedObjects | Restore-ADObject
                         }    

# S'il n'existe aucun compte supprimé et qu'il existe un compte actif/désactivé, faire ce qui suit
elseif($user -eq $null -and $user2 -ne $null){
  $user = Get-Aduser -Filter {EmployeeNumber -eq $EmployeeNumber} -Properties employeeNumber,title,SamAccountName,enabled,Isdeleted |select employeeNumber,title,SamAccountName,enabled,Isdeleted
  $user | Export-Csv -Path "D:\Scripts\SamAccountName.$CurrentDate.csv" -Append -Delimiter ";"
                             }   

# S'il n'existe aucun compte supprimé ni aucun compte actif/désactivé, faire ce qui suit
elseif($user -eq $null -and $user2 -eq $null){
$Missing.employeeNumber = $EmployeeNumber
$Missing | Export-Csv -Path "D:\Scripts\SamAccountName.$CurrentDate.csv" -Append -Delimiter ";"
         }   

  }


Si quelqu'un a une idée pour une simplification du processus et surtout l'ajout de la colonne "Restored" en sortie avec "ok" ou "nok" selon que le compte a été restauré ou non, j'apprécierai vraiment.

Merci

 
Dernière édition: il y a 1 an 7 mois par Laurent Dardenne. Raison: balise code

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

Plus d'informations
il y a 1 an 7 mois #32495 par Laurent Dardenne
Salut,
pour l'ajout de propriété tu peux procéder de la manière suivante.
Remplace :
select employeeNumber,title,SamAccountName,enabled,Isdeleted
par
Select-Object *,'Restored'
Select-Object crée un nouveau psobject, tu peux donc récupérer une liste de propriétés (*) et lui en ajouter d'autres
A priori ton fichier csv ne contiendra que le dernier user traité.

Tutoriels PowerShell

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

Plus d'informations
il y a 1 an 7 mois #32520 par Julien
Bonjour,

Merci pour ta proposition, ça a pu marcher avec cela.
Et désolé pour le retard de réponse.

J'ai un autre souci pour lequel je ne trouve aucune solution :

Je récupère grâce à un objet, une liste de comptes utilisateurs dans l'AD.
Il s'agit en fait de comptes supprimés.
Il arrive qu'il y est plusieurs fois un même compte supprimé avec les mêmes attributs, et je souhaiterais donc, à partir de cette liste, comparer toutes les occurrences identiques du même compte.

Par exemple, dans mon objet de comptes supprimés, j'ai plusieurs fois :

SamAccountName = a.anieze
userPrincipalName = amara.anieze

SamAccountName = a.anieze
userPrincipalName = amara.anieze

Je souhaiterais pouvoir identifier quand deux occurrences sont identiques, aussi bien pour le SamAccountName et pour le userPrincipalName.

Je ne sais pas comment procéder

Auriez vous une idée ?

merci



Sam

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

Plus d'informations
il y a 1 an 7 mois #32523 par Laurent Dardenne
Salut,
on peut grouper les objets selon un critère :
$list=@{SamAccountName = 'a.anieze';userPrincipalName = 'amara.anieze'},
@{SamAccountName = 'a.anieze';userPrincipalName = 'amara.anieze'},
@{SamAccountName = 'B.anieze';userPrincipalName = 'amara.Bnieze'},
@{SamAccountName = 'B.anieze';userPrincipalName = 'amara.Cnieze'} 

$Accounts=$list |% {
    [PscustomObject]$_
}
$Groups=$Accounts|group-object SamAccountName
$Groups[0].Group[0]

# résultat différent si SamAccountName est identique pour + comptes mais avec un userPrincipalName différent
$Accounts|group-object SamAccountName,userPrincipalName
Cela dépend donc du contenu de l'AD et de la rigueur avec laquelle il est / a été renseigné...

Tutoriels PowerShell

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

Plus d'informations
il y a 1 an 7 mois #32540 par Julien
Bonjour,

Merci pour votre aide, mais je ne vois pas comment l'adapter dans mon script.
Là il s'agit de Amara Anieze mais il peut s'agir de n'importe quel autre utilisateur passé dans l'objet $ListeDEL pour lequel un ou plusieurs comptes supprimés ont été trouvés.
L'idée étant de restaurer tous les comptes "uniques" de l'utilisateur et une occurrence de ses comptes similaires si aucun compte actif/désactivé n'est déjà trouvé pour lui.

Actuellement, quand je demande à restaurer $user présent dans $ListeDEL, j'ai une erreur car Powershell trouve plusieurs fois le même compte supprimé.
Par exemple, il trouve plusieurs fois le compte sam=a.anieze et upn=amara.anieze
Powershell doit alors se demander quel compte utiliser pour restaurer puisqu'ils sont tous identiques. Dans ce cas de figure je souhaiterai qu'il utilise par exemple la première occurence du même compte et procéder à sa restauration.
Mais dans $ListeDEL il peut aussi y avoir un autre compte différent pour cette utilisatrice --> sam=amara.anieze et upn=amara.anieze
Dans ce cas, il faut restaurer ce compte unique ET une occurrence du compte plusieurs fois identiques. Et cette vérification est donc à faire pour tous les comptes de tous les utilisateurs qui passeront dans $ListeDEL.

J'ai totalement réécris mon script et j'ai ajouté en commentaire ce que je viens de détailler ci-dessus et que je souhaiterai pouvoir inclure comme vérification/restauration. Je n'arrive vraiment pas à m'en sortir avec ce bout de script.
Votre solution doit probablement marcher mais je ne vois pas comment l'adapter à mon cas sans avoir à spécifier a.anieze dans le code, puisque cela concernera une multitude d'utilisateurs passés dans $ListeDEL.

Ci dessous mon code. Merci beaucoup pour l'aide que vous pourrez m'apporter.
Je débute en powershell.


#$StartupVars = @()
#$StartupVars = Get-Variable | Select-Object -ExpandProperty Name

$DefaultVariables = $(Get-Variable).Name
((Compare-Object -ReferenceObject (Get-Variable).Name -DifferenceObject $DefaultVariables).InputObject).foreach{Remove-Variable -Name $_}

$ListeEmployees = Import-Csv D:\Scripts\EmployeeNumber.csv
$CurrentDate = Get-Date
$CurrentDate = $CurrentDate.ToString('MM-dd-yyyy')


ForEach ($User in $ListeEmployees) {
$EmployeeNum = $User.EmployeeNumber

# Si l'EmployeeNumber est inférieur à 6 caractères, ajouter des 0 à gauche
If($EmployeeNum.length -lt 6){
$EmployeeNum = "{0:d6}" -f [int]$EmployeeNun
}# Fin de vérification longueur EmployeeNumber

$ListeDEL = Get-ADObject -Filter {isDeleted -eq $True -and (EmployeeNumber -eq $EmployeeNum)} -IncludeDeletedObjects -Properties employeeNumber,title,SamAccountName,userPrincipalName,displayName,Isdeleted | Select employeeNumber,title,SamAccountName,userPrincipalName,displayName,Isdeleted


If($ListeDEL -eq $null){

Write-Host "$EmployeeNum n'a aucun compte à restaurer"
}# Fin de recherche : Si ListeDEL vide -> pas de compte à restaurer

Else{
ForEach($User in $ListeDEL){

$ListeActif = Get-Aduser -Filter {EmployeeNumber -eq $EmployeeNum} -Properties employeeNumber,title,SamAccountName,userPrincipalName,displayName,Isdeleted | Select employeeNumber,title,SamAccountName,userPrincipalName,displayName,Isdeleted

$UtilDELSam = $User.SamAccountName
$UtilDELUpn = $User.userPrincipalName

If($ListeActif -eq $null){


#partie du code où je souhaiterais vérifier si tous les $user dans l'objet $ListeDEL sont identiques ou pas.
# l'idée étant de restaurer tous les comptes uniques de $ListeDEL puis une occurence d'un compte plusieurs fois identiques.

# Dans $ListeDEL je peux avoir plusieurs fois le même utilisateur avec strictement les mêmes infos, mais pas toujours.
# Exemple : j'ai plusieurs fois le compte : sam=a.anieze et upn=amara.anieze mais j'ai aussi sam=amara.anieze et upn=amara.anieze
# Dans cet exemple : je souhaiterais restaurer une occourence du compte plusieurs fois identiques ET le compte unique sam=amara.anieze ; upn=amara.anieze
# A noter que ces utilisateurs sont fournis à partir d'une liste d'EmployeeNumber pour lesquels une recherche est faite dans l'AD pour vérifier l'existence d'un compte actif/désactivé et un compte éventuellement supprimé.
# L'idée étant de restaurer tous les comptes différents de ces utilisateurs.


Get-ADObject -Filter {samaccountname -eq $UtilDELSam} -IncludeDeletedObjects | Restore-ADObject
Write-Host "$UtilDELSam restauré" -ForegroundColor Yellow
}# Fin de rehcherche : Si ListeActif est vide --> restaurer le compte supprimé

else{

$UtilActifSam = $ListeActif.SamAccountName
$UtilActifUpn = $ListeActif.userPrincipalName
$UtilActifDPName = $ListeActif.displayName

# Si le SAM supprimé est différent du SAM actif et que l'UPN supprimé est différent de l'UPN actif alors
If($UtilDELSam -ne $UtilActifSam -and $UtilDELUpn -ne $UtilActifUpn){

Get-ADObject -Filter {samaccountname -eq $UtilDELSam} -IncludeDeletedObjects | Restore-ADObject
Write-Host "$UtilDELSam restauré" -ForegroundColor Yellow
}# Fin du SAM différent ET de l'UPN différent : restauration du compte

#Elseif($UtilDELSam -eq $UtilActifSam -or $UtilDELUpn -eq $UtilActifUpn){

else{

if($UtilDELSam -eq $UtilActifSam){
Write-Host "$UtilActifDPName a un compte existant avec le même SAM que celui du compte supprimé : restauration impossible" -ForegroundColor DarkYellow
}# Fin de recherche sur SAM supprimé et actif équivalent
else{
Write-Host "$UtilActifDPName a un compte existant avec le même UPN que celui du compte supprimé : restauration impossible" -ForegroundColor DarkGreen
} # Fin de recherche sur UPN supprimé et actif équivalent
}# Fin du SAM équivalent OU UPN équivalent : compte existant et similaire trouvé --> pas de restauration possible

}# Fin de recherche : Si ListeActif non nul

}# Fin de recherche : Pour chaque utilisateur dans ListeDEL

}# Fin de : Sinon ListeDEL non vide -> Faire autre traitement

}# Fin de : Pour chaque utilisateur présent dans le fichier ListeEmployees

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

Plus d'informations
il y a 1 an 7 mois #32545 par Laurent Dardenne
>>mais je ne vois pas comment l'adapter dans mon script.
As-tu compris le principe exposé ?

>>Là il s'agit de Amara Anieze mais il peut s'agir de n'importe quel autre utilisateur ..
Oui, ajoute autant d'exemples dans le tableau $List du code proposé. Le résultat suivra.

>>Je débute en powershell.
Dans ce cas étudie le comportement de group-object avec des objets simple en dehors de ton script (pas besoin de l'AD). Ensuite l'intégration dans ton code sera plus simple.

>>je ne vois pas comment l'adapter à mon cas sans avoir à spécifier a.anieze dans le code,
C'est une démo avec des objets de tests, dans ton cas ce doit être qq comme ceci :
#$Resultat contient la liste des comptes ceux dupliqué on un count > 0
$Resultat=$ListeDEL |Group-Object SamAccountName
Ensuite, avec le cmdlet Get-Member, tu analyses la structure des objets émis par Group-Object.

Tutoriels PowerShell

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

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