diff --git a/Active Directory/reactivate_ad_user.ps1 b/Active Directory/reactivate_ad_user.ps1 new file mode 100644 index 0000000..ea51844 --- /dev/null +++ b/Active Directory/reactivate_ad_user.ps1 @@ -0,0 +1,349 @@ +#Script créé par Nicolas Lang - Sous licence CC-BY-SA +#https://nicolaslang.fr + +Function Reactivate-ADUSER +{ + +<# + +.SYNOPSIS +Script de réactivation de compte d'utilisateur. + +.DESCRIPTION +Ce script permet de réactiver des comptes utilisateurs désactivés, de modifier leur mot de passe, leur date de désactivation en une seule ligne de commande. + + +.EXAMPLE +C:\PS> Reactivate-Aduser -SamAccountName NicolasLang -Unlock +Réactive l'utilisateur NicolasLang + +.EXAMPLE +C:\PS> Reactivate-ADUSER -SamAccountName NicolasLang -NewExpirationDate 10d +Met une date d'expiration du compte dans 10 jours + +.EXAMPLE +C:\PS> Get-Aduser -filter 'samaccountname -like "Interimaire_*"' | Reactivate-ADUSER -NewExpirationDate 1m -NewPassword "TempPASS" -ChangePasswordAtLogon +Ajoute un mois à la date d'expiration, créé un nouveau mot de passe et force son changement à la prochaine ouverture de session pour tous les comptes commençant par "Interimaire_" + +.INPUTS +Des objets du type [Microsoft.ActiveDirectory.Management.ADUser], généralement issus d'une commande Get-Aduser + +.OUTPUTS +Un objet Arraylist qu'il est possible de renvoyer vers Export-CSV pour une lecture et un stockage aisé + +.PARAMETER SamAccountName +Le nom du compte Windows à réactiver. Peut provenir du pipe. + +.PARAMETER Unlock +Réactive le compte (décoche la case "vérrouillé" dans l'AD) + +.PARAMETER NewExpirationDate +Permet de définir une date d'expiration par rapport à aujourd'hui. Le format est le suivant : (durée)(valeur) +La valeur est soit : d (pour Days : Jours), m (pour Months : Mois), y (pour Year : Année) +Ainsi, une valeur de 2d correspond à 2 jours. Le compte sera desactivé après demain à 23h59:59. + +.PARAMETER NewPassword +Le nouveau mot de passe choisi pour le / les utilisateur(s) à réactiver + +.PARAMETER ChangePasswordAtLogon +Précise si le mot de passe est à changer à la prochaine ouverture de session. + + +.LINK +http://nicolaslang.blogspot.com/2016/08/gerer-aisement-les-deverouillages-de.html + +.NOTES +Crée par Nicolas Lang + + +#> + + [CmdletBinding(DefaultParametersetName="unlock", + ConfirmImpact="Medium", + SupportsShouldProcess=$true, + helpURI="http://nicolaslang.blogspot.com/", + SupportsPaging=$false, + PositionalBinding=$false + )] +param ( + [Parameter (Mandatory=$true, Position=0, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)] + [Alias("Username","Compte")] + [ValidateNotNullOrEmpty()] + [string]$SamAccountName, + [Parameter (Mandatory=$false)] + [switch]$Unlock, + [Parameter (Mandatory=$false)] + [ValidatePattern('^(?\d+)(?[d,m,y])$')] + [string]$NewExpirationDate, + [Parameter (Mandatory=$false)] + [string]$NewPassword, + [Parameter (Mandatory=$false)] + [switch]$ChangePasswordAtLogon + ) + + + + + Begin + { + + [switch]$whatif = $false + $whatif = $PSCmdlet.MyInvocation.BoundParameters["whatif"] + $verbose = $PSCmdlet.MyInvocation.BoundParameters["Verbose"] + $verbosestatus = $VerbosePreference + if ($verbose) + { + $VerbosePreference = "Continue" + } + + $array = New-Object System.Collections.ArrayList + + } + + Process + { + #On vérifie l'entrée du pipe, et on s'assure que le format de l'objet est correct + + + if ($_) + { + Write-Verbose "Vérification des informations venant du pipe" + if ($_ -isnot [Microsoft.ActiveDirectory.Management.ADUser]) + { + return $(throw("Le type de données est incorrect")) + } + if ($verbose) + { + Write-Verbose "Informations du pipe valides" + } + $compte = $_ + + } + else + { + Write-Verbose "Recherche du compte $SamAccountName dans l'AD" + + try + { + $compte = get-aduser $SamAccountName -Properties passwordlastset,AccountExpirationDate,Lockedout -ErrorAction Stop + } + #Si pas de commande, alors peut etre pas de module? + catch [System.Management.Automation.CommandNotFoundException] + { + + Write-Verbose "Erreur sur la commande, recherche du module AD dans la liste des modules disponibles" + + #On vérifie s'il est disponible, et on tente de le charger + if ((Get-Module -listavailable ActiveDirectory) -eq $null) + { + Return "Module ActiveDirectory manquant. Installez les outils RSAT pour utiliser cette fonction" + } + else + { + try + { + + Write-Verbose "Module trouvé, intégration dans PowerShell" + + Import-Module ActiveDirectory -ErrorAction Stop + } + catch + { + return $(throw("Impossible de charger le module ActiveDirectory! Have you tried turn it off and on again, Moss?")) + } + try + { + + Write-Verbose "Intégration OK : Nouvelle recherche du compte." + + $compte = Get-ADUser $SamAccountName -ErrorAction Stop + } + catch + { + Return $(throw("Une nouvelle erreur s'est produite : $($error[0].Exception)")) + } + } + } + catch [Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException] + { + + return $(throw("Le compte $Samaccountname est introuvable")) + } + catch + { + return "Une erreur inconnue s'est produite : $($error[0])" + } + } + $user = $compte + + $object = [PSCUSTOMOBJECT]@{ + "Compte" = $user.samaccountname + "Nom" = $user.name + } + + #region EXPIRATION + if ($NewExpirationDate) + { + switch ($user.accountexpirationdate) + { + $null { $accountexpirationdate = "?"} + + default { $accountexpirationdate = $user.accountexpirationdate} + } + $object | Add-Member -MemberType NoteProperty -Name "Accountexpirationdate" -Value $accountexpirationdate + + Write-Verbose "Calcul de la nouvelle date d'expiration." + + $NewExpirationDate -match '^(?\d+)(?[d,m,y])$' | Out-Null + switch ($Matches.duree) + { + "d" {$expirationdate = (Get-Date).date.AddDays(1).AddDays($Matches.valeur)} + "m" {$expirationdate = (Get-Date).date.AddDays(1).AddMonths($Matches.valeur)} + "y" {$expirationdate = (Get-Date).date.AddDays(1).AddYears($Matches.valeur)} + } + + Write-Verbose "Nouvelle date : $expirationdate" + Write-Verbose "Application de la nouvelle date au compte $($user.samaccountname)" + + try + { + Set-ADUser $user -AccountExpirationDate $expirationdate -ErrorAction Stop -WhatIf:([bool]$whatif) + } + catch + { + return $(throw("Une erreur s'est produite durant la modification de la date d'expiration sur $($user.samaccountname)")) + } + try + { + $accountexpirationdate = (Get-aduser $user -Properties Accountexpirationdate -ErrorAction Stop).AccountexpirationDate + } + catch + { + throw("Impossible de récuperer les informations d'expiration du compte $user") + } + finally + { + $object | Add-Member -Name "AccountExpirationDate_apres" -MemberType NoteProperty -Value $accountexpirationdate + } + + } + #endregion EXPIRATION + + #region CHANGEPASSWORDATLOGON + if ($ChangePasswordAtLogon.IsPresent) + { + + + switch ($user.passwordexpired) + { + $true { $passwordchangevalue = "Oui"} + $false { $passwordchangevalue = "Non"} + default { $passwordchangevalue = "?"} + } + + $object | Add-Member "ChangePasswordAtLogon" -MemberType NoteProperty -Value $passwordchangevalue + + Write-Verbose "Application du changement de mot de passe forcé" + + try + { + set-aduser $user -ChangePasswordAtLogon $true -WhatIf:([bool]$whatif) + } + catch + { + return $(throw("Erreur lors de l'application du changement de mdp à la prochaine ouverture de session. $($error[0])")) + } + finally + { + + Write-Verbose "Récupération du nouveau status de changement de mot de passe" + + $passwordchangevalue = $null + switch ((get-aduser $user -Properties passwordexpired).passwordexpired) + { + $true { $passwordchangevalue = "Oui"} + $false { $passwordchangevalue = "Non"} + default { $passwordchangevalue = "?"} + } + $object | Add-Member "ChangePasswordAtLogon_Apres" -MemberType NoteProperty -Value $passwordchangevalue + } + + } + #endregion CHANGEPASSWORDATLOGON + + #region PASSWORD + if ($NewPassword) + { + $invalidpassword = $true + Write-Verbose "Modification du mot de passe pour $($user.samaccountname)" + While ($invalidpassword) + { + try + { + Set-ADAccountPassword $user -Reset -NewPassword (ConvertTo-SecureString $NewPassword -AsPlainText -Force) -ErrorAction Stop -WhatIf:([bool]$whatif) + $invalidpassword = $false + } + catch [Microsoft.ActiveDirectory.Management.ADPasswordComplexityException] + { + $invalidpassword = $true + + $NewPassword = Read-Host "Le mot de passe ne respecte pas le niveau de complexité, de longueur, ou d'historique.`nEntrez un nouveau mot de passe : " + } + catch + { + return $(throw("Erreur lors de la mise à jour du mot de passe sur $($user.samaccountname).`n$($error[0])")) + } + + finally + { + $object | Add-Member -MemberType NoteProperty -Name "Password_apres" -Value $NewPassword -Force + } + } + } + + #endregion PASSWORD + + #region UNLOCK + if ($Unlock.IsPresent) + { + + switch ($user.lockedout) + { + $true { $islockedout = "Oui" } + $false { $islockedout = "Non" } + default { $islockedout = "???" } + } + $object | Add-Member -Name "Verrouillage" -MemberType NoteProperty -Value $islockedout + + Write-Verbose "Déverouillage du compte utilisateur $($user.samaccountname)" + try + { + Unlock-ADAccount -Identity $user -WhatIf:([bool]$whatif) + } + catch + { + return $(throw("Une erreur est survenue lors du déverouillage du compte $($user.samaccountname)`n$($error[0])")) + } + switch ((get-aduser $user -Properties lockedout).lockedout) + { + $true {$islockedout = "Oui"} + $false {$islockedout = "Non"} + default {$islockedout = "???"} + } + $object | Add-Member -Name "Verrouillage_apres" -MemberType NoteProperty -Value $islockedout + + + + } + + #endregion UNLOCK + + $array.Add($object) | Out-Null + } + End + { + + $VerbosePreference = $verbosestatus + return $array + } +} \ No newline at end of file