Augmentation du MaxPageSize avec ntdsutil

Par défaut et principalement pour des raisons de sécurité, ActiveDirectory ne renvoie au maximum que 1000 entrées aux requêtes LDAP qui lui sont adressées et fonctionne grâce à un système de pages, permettant d'accéder aux autres éléments, toujours par tranche de 1000 maximum. Si un bon nombre d'applications ou de librairies sont capables de gérer ce système de pages, ce n'est pas le cas de toutes. Bien que cela ne soit pas recommandé par Microsoft, il est possible d'augmenter la variable MaxPageSize grâce à ntdsutil si besoin est.

L'exécutable ntdsutil peut être appelé depuis n'importe quel contrôleur de domaine, peu importe ses rôles ; il s'agit d'un paramètre de niveau domaine.

Une fois connecté à un DC, ouvrir un cmd avec élévation et exécuter ntdsutil :

ntdsutil

Ensuite, se connecter au serveur, dans cet exemple, le DC s'appelle dc01 ; à chaque instruction valider par entrée - le prompt va changer de ldap policy à server connections lors de la deuxième commande :

ldap policies
connections
connect to server dc01

Une fois que la connexion est faite, saisir "q" et valider pour revenir au prompt ldap policy. D'abord, afficher les paramètres courants :

show values

Ici, le MaxPageSize est bien réglé sur 1000. Pour le passer à 5000, par exemple :

set maxpagesize to 5000

Les éventuelles modifications apportées aux paramètres ne seront pas prises en compte tant que l'enregistrement de celles-ci ne sera pas effectué :

commit changes

En rappelant l'instruction show values, on vérifie que la modification a bien été écrite :

Désormais, ActiveDirectory retournera tout au plus 5000 éléments par requête LDAP.

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.