Powershell : liste des utilisateurs désactivés

Toujours dans une optique de réaliser un nettoyage de printemps sur son ActiveDirectory, voici un script listant les comptes utilisateurs désactivés et qui ne se sont pas connectés au domaine depuis un nombre de jours spécifié.

Write-Host "Disabled accounts listing script"
Write-Host "================================"
Write-Host "This script will list disabled user accounts that didn't login since a specified number of days."
[int]$nodays = Read-Host "Number of days"
$dusers = Get-AdUser -filter * -Properties LastLogonDate | Where-Object {$_.Enabled -eq $false}
$fdusers = $dusers | Where-Object {$_.LastLogonDate -ne $null -and $_.LastLogonDate.AddDays($nodays) -lt (Get-Date)}
$fdusers | ft SamAccountName,LastLogonDate
Write-Host "Done. Bye."

Powershell : liste des groupes vides et export CSV

Afin de compléter le script que j’ai proposé dans l’article hier permettant de lister les OU vides, j’ai conçu un script effectuant le même travail mais pour des groupes. Seule la requête à l’AD est différente.

Il est possible que le script renvoie des erreurs si il tente d’interroger un groupe dont il y a un membre qui n’est pas membre du domaine local mais membre d’un domaine approuvé ; c’est la commande Get-AdGroupMember qui la renvoie mais cette erreur n’a aucune incidence sur le traitement du script.

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()
$fileExpl = New-Object System.Windows.Forms.SaveFileDialog
$fileExpl.ValidateNames = $true
$fileExpl.CreatePrompt = $false
$fileExpl.OverwritePrompt = $true
$fileExpl.RestoreDirectory = $false
$fileExpl.InitialDirectory = "$env:userprofile"
$output = @()

$AllGroups = Get-AdGroup -filter * | select SamAccountName,DistinguishedName
foreach ($Group in $AllGroups){
    if((Get-ADGroupMember $Group.SamAccountName).Count -eq 0){
        $emptyGrp = New-Object PSCustomObject
		$emptyGrp | Add-Member -Name "DN" -Value $Group.SamAccountName -MemberType NoteProperty
		$output+=$emptyGrp
    }
}

$fileExpl.DefaultExt = "csv"
$fileExpl.Filter = "Comma-separated values file (*.csv)|*.csv"
$fileExpl.Title = "Export empty groups list to CSV file"
$fileExpl.Filename = "emptygrp.csv"
$fileExpl.ShowDialog() | out-null
if ($fileExpl.Filename -ne "") {
	$output | Export-CSV $fileExpl.Filename -Encoding UTF8
}

Powershell : liste des OU vides et export CSV

Avec le temps, un ActiveDirectory peut contenir de plus en plus d’OU ne contenant aucun objet, car ceux-ci ont été déplacés ailleurs ou il s’agit tout simplement d’un reliquat. Le script Powershell suivant parcourt l’annuaire et liste les OU qui ne contiennent aucun objet pour ensuite en faire un fichier CSV à l’emplacement spécifié par l’utilisateur.

A noter que les OU ont eu leur chemin inversé, c’est à dire que plutôt que de commencer à l’OU pour aller vers la racine du domaine, le script écrit dans le fichier CSV le nom en commençant par la racine du domaine ; cela permet une fois que la conversion CSV > tableau est réalisée, de pouvoir trier et lire plus facilement les chemins vers les OU.

Par exemple, au lieu d’avoir un tableau comme ceci :

On obtient ceci, plus exploitable et compréhensible car on reprend le chemin qui sera parcouru dans la console pour retrouver l’OU en question :

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()
$fileExpl = New-Object System.Windows.Forms.SaveFileDialog
$fileExpl.ValidateNames = $true
$fileExpl.CreatePrompt = $false
$fileExpl.OverwritePrompt = $true
$fileExpl.RestoreDirectory = $false
$fileExpl.InitialDirectory = "$env:userprofile"
$output = @()

$OUs = Get-ADOrganizationalUnit -filter * | select DistinguishedName
foreach ($OU in $OUs){
    $OUObjects = Get-ADObject -Filter * -SearchBase $OU.DistinguishedName -SearchScope OneLevel
    if($OUObjects -eq $null){
		$emptyOU = New-Object PSCustomObject
		$emptyOU | Add-Member -Name "DN" -Value $OU.DistinguishedName -MemberType NoteProperty
		$output+=$emptyOU
	}
}

$fileExpl.DefaultExt = "csv" 
$fileExpl.Filter = "Comma-separated values file (*.csv)|*.csv"
$fileExpl.Title = "Export empty OU list to CSV file"
$fileExpl.Filename = "emptyOU.csv"
$fileExpl.ShowDialog() | out-null 
if($fileExpl.Filename -ne "") { 
	$output | Export-CSV $fileExpl.Filename -Encoding UTF8
}

Powershell : GPO Remote Updater

Si vous avez suivi mes derniers articles, vous n’êtes pas sans savoir que j’ai travaillé sur le Windows Update Delivery Optimization et sur des GPO en lien avec ce composant.

J’ai développé un script Powershell à interface graphique permettant d’exécuter à distance un gpupdate, soit sur un ordinateur unique, soit sur chaque ordinateur d’un groupe ActiveDirectory.

Il est possible de choisir les paramètres à mettre à jour et de mettre un timer sur l’exécution du gpupdate ; dans ce dernier cas, le traitement se termine lorsque la commande est reçue par l’ordinateur distant étant donné que c’est ce dernier qui effectue le décompte jusqu’au lancement d’un gpupdate.

A noter que la commande Invoke-GPUpdate ne réalise pour autant pas une mise à jour silencieuse des éléments de GPO sur les ordinateurs, il convient donc de communiquer avant d’exécuter le script sur tout un groupe d’ordinateurs en cours d’utilisation. Je vous renvoie à la documentation de la commande pour plus d’informations sur les versions de Windows supportés et sur les ports qui doivent être ouverts dans les firewall afin que la communication puisse être établie.