Powershell : liste des homedirs orphelins V2

J'avais présenté dans un précédent article un script Powershell permettant de lister les homedirs orphelins, c'est à dire les homedirs dont le compte AD lié n'existe plus. Celui-ci se basait sur une vérification du nom du répertoire et testait la corrélation avec un utilisateur existant dans l'AD. Rapide mais peu robuste car un utilisateur changeant d'identifiant déjoue le script.

J'ai donc réalisé une v2 de ce script, en utilisant cette fois-ci l'instruction Get-Acl pour récupérer le propriétaire des répertoires. Chaque homedir possède en propriétaire un SID qui renvoie vers un utilisateur local ou du domaine. Si l'utilisateur du domaine est supprimé, alors le SID disparaît de l'annuaire... mais reste référencé en tant que propriétaire du homedir, comme on peut le voir sur cette capture d'écran du répertoire avec la colonne Owner affichée :

comptetest sur DOMAIN existe toujours par contre les comptes propriétaires des autres répertoires ont été supprimés de l'AD car Windows ne fait pas le lien entre le SID enregistré et un SID existant dans l'annuaire.      

Le script commenté est disponible en fin d'article et est prêt à être adapté à n'importe quel environnement.

function noexist{
Write-Host "Homedir $folderfullpath doesn't have any owner."
Add-Content -path "orphan-homedir.log" -Force -Value $folderfullpath
}

Write-Host "Orphan homedir listing script V2"
Write-Host "================================"
Write-Host ""
Clear-Content -path "orphan-homedir.log" -Force
for ($Line = 15; $Line -gt 0; $Line--) {
$RemoteServer = (Get-Content C:\homedir-srv-list.txt -TotalCount 15)[-$Line]
Write-Host "Building user homedir list on $RemoteServer"
$HomedirPath = "\\"+$RemoteServer+"\c$\homedir"
Add-Content -path "orphan-homedir.log" -Force -Value "`r`n$RemoteServer`r`n========"
$folderlist = Get-ChildItem $HomedirPath | select name
Write-Host "Checking directories ACLs"
foreach ($folder in $folderlist) {
$folderFullPath = $homedirpath+$folder.Name
$prop = Get-Acl $folderFullPath
if ($prop.Owner.Contains("S-1-5-21")) { noexist }
}
}
Write-Host "Please find in orphan-homedir.log the list of homedirs that don't have any linked AD account."
Write-Host "Bye"

Powershell : liste des homedirs orphelins

Afin de libérer un peu d'espace disques sur les serveurs de fichiers portant les homedirs, j'ai développé un script lisant dans un fichier les serveurs de fichiers hébergeant des homedirs, récupérant les noms des répertoires, puis faisant une comparaison entre chaque nom de répertoire et un utilisateur AD. Si l'utilisateur AD est introuvable, cela signifie selon toute vraisemblance que l'utilisateur n'existe plus, et que le homedir peut donc être détruit. Le script exporte enfin vers un fichier texte la liste des homedir orphelins détectés sur chaque serveur.

function noexist{
    Write-Host "Homedir $username doesn't have any owner."
    Add-Content -path "orphan-homedir.log" -Force -Value $username
}


Write-Host "Orphan homedir listing script"
Write-Host "============================="
Write-Host ""
Clear-Content -path "orphan-homedir.log" -Force
for ($Line = 15; $Line -gt 0; $Line--) {
    $RemoteServer = (Get-Content C:\homedir-srv-list.txt -TotalCount 15)[-$Line]
    Write-Host "Building user homedir list on $RemoteServer"
    $HomedirPath = "\\"+$RemoteServer+"\c$\homedir"
    Add-Content -path "orphan-homedir.log" -Force -Value "`r`n$RemoteServer`r`n========"
    $folderlist = Get-ChildItem $HomedirPath | select name
    Write-Host "Compairing homedir list to AD user list"
    foreach ($name in $folderlist) {
        $username = $name.Name   
        Try { $aduser = Get-ADUser $username }
        Catch { noexist }
    }
}
Write-Host "Please find in orphan-homedir.log the list of homedirs that don't have any linked AD account."
Write-Host "Bye"

Il ne reste donc plus qu'à adapter les variables en fonction de l'environnement sur lequel le script est exécuté. Le script doit être exécuté sur un contrôleur de domaine ou une station ayant les outils Powershell ActiveDirectory, ainsi qu'avec un compte utilisateur pouvant parcourir les répertoires administratifs des serveurs.