Un ami administrateur système (qui se reconnaîtra) m'a demandé si je connaissais une application permettant de lister l'appartenance aux groupes de sécurité de chaque utilisateur. Il devait faire un bon ménage dans les droits de chacun et redéfinir proprement les autorisations de chaque personne... Mais lister 300 utilisateurs manuellement n'a rien d'amusant, ni de productif.

Ma réponse n'aura été qu'un seul et unique mot : Powershell.

En moins de 70 lignes de code et 8 secondes, mon script m'aura permis de faire l'analyse de 535 comptes utilisateurs. Il génère un fichier CSV sur le bureau avec l'intégralité des utilisateurs, et dans chaque colonne le(s) groupe(s) auquel il appartient.

Les prérequis sont d'avoir un ordinateur client avec RSAT d'installé et le module Active Directory pour Powershell, ou de lancer ce script depuis un contrôleur de domaine version 2008R2 minimum (si votre AD est sur un serveur 2008, suivez ce lien. Vous aurez malgré tout besoin de lancer ce script depuis un ordinateur client.)

Vous pouvez télécharger le script sur mon espace git personnel.

function Give-time {
    $retour = (Get-date).ToLongTimeString()
    return $retour
}
$fullpathtofile = "$([environment]::getfolderpath("Desktop"))\export_ad_"+$((get-date).toshortdatestring().replace("/","-"))+".csv"
Write-Host "$(Give-time) : Ajout du module Active Directory"
try
{
    ipmo activedirectory
}
catch
{
    Write-Host "$(Give-time) : Attention! Impossible de récupérer le module A.D. pour Powershell. Assurez vous que les RSAT sont bien activés (si vous êtes sur un poste client) ou que le contrôleur de domaine sur lequel vous lancez ce script est correctement configuré"
    Write-host "show_sidebar: false
visible: false
------------Fin du script dans 10 secondes---------------"
    $x = 0
    do
    {
        Write-Host -NoNewline "*"
        Start-Sleep -Seconds 1
        $x++
    }until ($x -ge 10)
    Exit
}

Write-Host "$(Give-time) : Obtention des données de l'A.D."
$users = Get-ADUser -filter * -Properties name,memberof | Sort-Object -Property memberof | Select-Object name,samaccountname,memberof
$max=0
Write-host "$(Give-time) : Calcul du maximum de groupes"
foreach ($user in $users)
{
    if ($max -lt $($user.memberof).count) 
    {
        $max = $(($user.memberof).count)
    } 
}

$array = new-object System.collections.arraylist

Write-Host "$(Give-time) : Analyse des données"
foreach ($user in $users)
{
    $object = New-Object psobject
    $object | Add-Member -MemberType NoteProperty -Name "Name" -Value $($user.name)
    $object | Add-Member -MemberType NoteProperty -Name "SamAccountName" -Value $($user.samaccountname)

    $groups = $($user.memberof) | % {$_.split(",")[0] -replace ("^CN=","")}
    $grpnumber = 0

    for ($start = 0; $start -lt $max;$start++)
        {

            if (!$groups -or !$groups[$start])
            {
                $object |Add-member -membertype Noteproperty -name "Group Number $($start+1)" -value ""
            }
            else
            {
                $object | Add-Member -MemberType NoteProperty -Name "Group Number $($start+1)" -value @($groups)[$start]
            }

        }

    $array.Add($object) | Out-Null
}
Write-host "$(Give-time) : Fin de l'analyse des données. Export du fichier csv sur le bureau"
$array | sort-object -Property name | Export-Csv -Path $fullpathtofile -Encoding UTF8 -Force -NoTypeInformation -Delimiter ";"

Ajouter un commentaire

Article précédent Article suivant