Powershell : création d'un batch de users AD sur import CSV

Ce script permet de créer en masse des utilisateurs dans un AD sur base d'un fichier CSV.

$userlist = Import-CSV usertocreate.csv
foreach($user in $userlist){
	New-AdUser -Name $user.Name -GivenName $user.FirstName -Surname $user.LastName -Path $user.OrgUnit -StreetAddress $user.Address -City $user.City -PostalCode $user.PostalCode -Country FR -HomeDrive "U:" -HomeDirectory $user.HomeDir -AccountPassword (ConvertTo-SecureString -AsPlainText $user.MatriculeID -Force) -UserPrincipalName $user.UPN
    Enable-ADAccount $user.Name
	Set-ADUser -Identity $user.Name -ChangePasswordAtLogon $true
	$GrpList = $user.Groups
	while($GrpList.IndexOf(",") -ne -1) {
		$commaindex = $GrpList.IndexOf(",")
		Add-AdGroupMember -Identity $GrpList.SubString(0,$commaindex) -Members $user.Name
		$GrpList = $GrpList.SubString($commaindex+1,$GrpList.Length-($commaindex+1))
	}
	Add-AdGroupMember -Identity $GrpList -Members $user.Name
} 

Le script (une version commentée est disponible en fin d'article, comme toujours) prend quelques propriétés pour la création du compte en sus des usuelles. Il pourra donc être nécessaire d'en retirer, en rajouter ou de modifier les noms attribués dans le script pour s'adapter au fichier d'entrée qui pourra être généré à partir d'une application RH par exemple.

Le script ajoute également l'utilisateur fraîchement créé aux groupes AD spécifiés, en découpant la liste située entre guillemets (afin qu'elle soit interprétée comme une chaîne de caractères unique) en fractions séparées par une virgule.

Le mot de passe est basé sur un numéro matricule fictif que seul l'utilisateur final connaît ; cependant pour des raisons de sécurité, ce mot de passe sera à modifier à la première connexion.

Powershell : vérification de masse d'existence de comptes AD

Ce script prend un fichier CSV en entrée comprenant des noms de comptes AD afin de vérifier pour chacun s'il existe vraiment grâce à dsquery et réalise un export CSV de la liste générée.

$userlist = Import-CSV userlist.csv
$i = 0
$userexport = @()
foreach($user in $userlist){
	if ((dsquery user -samid $user.Name) -eq $null) { 
		$user.name
		$i++
		$name=@{Name = $user.name}
		$export = New-Object PSObject -Property $name
		$userexport+=$export
	}
}
Write-Host "Number of accounts not present in AD"$i" out of"($userlist.length)
$userexport | Export-CSV user-noexist.csv -NoTypeInformation

Pourquoi dsquery et non pas Get-AdUser ? Car ce dernier renvoie un message d'erreur si l'utilisateur n'existe pas et que le but du script est simplement de lister les users qui ne sont pas présents dans l'AD.

A noter qu'en fonction du titre de la "colonne" comportant les noms dans le fichier CSV, il sera nécessaire de modifier la requête -samid $user.Name en -samid $user.NomColonne.

Powershell : ActiveDirectory Recycle Bin Explorer

La corbeille ActiveDirectory est une fonctionnalité disponible sur les forêts en niveau fonctionnel 2008 R2. Comme son nom l'indique, elle permet de restaurer des objets qui ont été supprimés, durant un laps de temps qui dépend de la configuration de la forêt.

Cette corbeille n'apparaît pas en tant que telle dans la console ActiveDirectory Users and Computers ou encore dans ADSI Edit, et pourtant elle existe bien dans l'AD en tant que "Deleted Objects".

Si il est possible de parcourir le contenu de la corbeille via la console ActiveDirectory Administrative Center disponible dans le Server Manager à partir de Windows Server 2012, cela implique d'avoir l'environnement graphique d'installé sur les contrôleurs de domaine et cela est surtout incompatible dans un environnement où l'on travaille avec les RSAT.

C'est pourquoi j'ai développé un script Powershell avec une interface graphique simpliste permettant d'afficher le contenu de la corbeille ActiveDirectory et permettant de restaurer en un clic un objet préalablement supprimé.

Les informations sont affichées dans un DataGridView ; il est possible de trier ou de rechercher / filtrer par nom ou type, de réaliser un export CSV de la liste complète des objets étant dans la corbeille.


Powershell : obtention des liens des GPO

Si la console gpmc.msc permet de parcourir toutes les GPO ainsi que leurs liens, cela n'est pas directement possible avec Powershell et la commande Get-GPO qui ne retournera que les informations de base de la GPO.

Afin de pouvoir obtenir les liens dans Powershell, il faut ruser un peu ; dans les deux scripts Powershell suivants, j'ai donc utilisé une technique de sioux consistant à réaliser un rapport au format XML de la GPO (grâce à Get-GPOReport) et à parcourir ledit fichier XML pour y identifier les liens grâce aux balises <LinksTo>.

Ce premier script liste toutes les GPO qui n'ont aucun lien, activé ou non :

Write-Host "Unlinked GPO listing script"
 Write-Host "==========================="
 Write-Host "Working… Please wait.`r`n"
 $GPOlist = Get-GPO -all
 foreach($GPO in $GPOList){
     $xmlreport = Get-GPOReport -Guid $GPO.Id -Report xml
     if($xmlreport.GPO.LinksTo.Count -eq 0){ Write-Host $GPO.DisplayName ; $count+=1}
 }
 Write-Host "`r`nUnlinked GPO count:"$count
 Write-Host "GPO parsed:"$gpolist.Length
 Write-Host "Done."

Ce deuxième script attend en paramètre le nom d'une GPO et retourne dans la console Powershell les objets auxquels cette GPO est liée. Par exemple, on appellera le script ainsi : .\win_gpolinks.ps1 -gpo "SRV-2016-Security-V3"

Param([string]$gpoinput)
 $gpo = Get-GPO $gpoinput
 $report = Get-GPOReport -Guid $gpo.Id -Report xml
 foreach($link in $report.GPO.LinksTo){
     Write-Host $link.SOMPath
 }

A noter qu'il est nécessaire d'avoir les RSAT d'installés sur la station (si ce n'est pas un DC) depuis laquelle le script est exécuté ; il peut également être nécessaire d'appeler Import-Module GroupPolicy pour exécuter les cmdlets Get-GPO et Get-GPOReport.