Outils & Référence

🪟 Scripts PowerShell — Windows — Scripts prêts à l'emploi

📜 Scripts Utiles

15 scripts PowerShell pour l'administration Windows, Active Directory et le parc informatique.

📜 7 scripts 🟢 0 débutant 🔵 5 confirmé 🔴 2 expert
Inventaire parc informatique AD
Confirmé ADinventaireCSVSCCM

Exporte la liste de tous les ordinateurs AD avec OS, dernière connexion, OU et statut.

script
# ─── Variables à modifier ───────────────────────────
$OutputFile = "C:\Temp\inventaire_parc_$(Get-Date -f yyyyMMdd).csv"
$DomainController = "DC01"  # Optionnel
# ────────────────────────────────────────────────────

Import-Module ActiveDirectory

$computers = Get-ADComputer -Filter * -Properties `
    Name, OperatingSystem, OperatingSystemVersion, `
    LastLogonDate, DistinguishedName, Enabled, IPv4Address

$rapport = $computers | Select-Object @{N='Nom';E={$_.Name}},
    @{N='OS';E={$_.OperatingSystem}},
    @{N='Version';E={$_.OperatingSystemVersion}},
    @{N='Derniere_Connexion';E={$_.LastLogonDate}},
    @{N='IP';E={$_.IPv4Address}},
    @{N='Actif';E={$_.Enabled}},
    @{N='OU';E={($_.DistinguishedName -split ',(?=OU=)')[1..10] -join '/'}}

$rapport | Export-Csv -Path $OutputFile -NoTypeInformation -Encoding UTF8 -Delimiter ";"

Write-Host "✅ Inventaire exporté : $OutputFile"
Write-Host "   Machines trouvées : $($rapport.Count)"
Write-Host "   Actives : $(($rapport | Where-Object Actif -eq True).Count)"
Création d'utilisateurs AD en masse depuis CSV
Confirmé ADuseraddCSVbulk

Crée des comptes Active Directory en masse depuis un fichier CSV avec OU et groupes.

script
# ─── Variables à modifier ───────────────────────────
$CsvFile = "C:\Temp\nouveaux_users.csv"
# Format CSV : Prenom,Nom,Login,Departement,Groupe,OU
# Ex : Jean,Dupont,jdupont,DSI,GRP_Techniciens,"OU=Techniciens,DC=domain,DC=local"
$DefaultPassword = "Bienvenue2025!"
$DomainSuffix = "@domaine.local"
# ────────────────────────────────────────────────────

Import-Module ActiveDirectory

$users = Import-Csv $CsvFile -Delimiter ";"

foreach ($u in $users) {
    $samAccount = $u.Login
    $upn = "$samAccount$DomainSuffix"

    # Vérifier si l'utilisateur existe déjà
    if (Get-ADUser -Filter {SamAccountName -eq $samAccount} -ErrorAction SilentlyContinue) {
        Write-Warning "⚠️  $samAccount existe déjà — ignoré"
        continue
    }

    $securePass = ConvertTo-SecureString $DefaultPassword -AsPlainText -Force

    New-ADUser -Name "$($u.Prenom) $($u.Nom)" `
        -GivenName $u.Prenom `
        -Surname $u.Nom `
        -SamAccountName $samAccount `
        -UserPrincipalName $upn `
        -Department $u.Departement `
        -Path $u.OU `
        -AccountPassword $securePass `
        -ChangePasswordAtLogon $true `
        -Enabled $true

    Add-ADGroupMember -Identity $u.Groupe -Members $samAccount
    Write-Host "✅ Créé : $samAccount ($($u.Prenom) $($u.Nom))"
}
Write-Host "Terminé — $($users.Count) utilisateurs traités"
Rapport des comptes AD inactifs
Confirmé ADsecuriteauditinactifs

Identifie et exporte les comptes AD inactifs depuis N jours — utilisateurs et ordinateurs.

script
# ─── Variables à modifier ───────────────────────────
$JoursInactivite = 90
$OutputDir = "C:\Temp"
$DesactiverAutomatiquement = $false  # $true = désactive auto
# ────────────────────────────────────────────────────

Import-Module ActiveDirectory
$DateLimite = (Get-Date).AddDays(-$JoursInactivite)

# Comptes utilisateurs inactifs
$usersInactifs = Get-ADUser -Filter {
    LastLogonDate -lt $DateLimite -and Enabled -eq $true
} -Properties LastLogonDate, Department, Manager |
    Select-Object Name, SamAccountName, LastLogonDate, Department |
    Sort-Object LastLogonDate

# Ordinateurs inactifs
$computersInactifs = Get-ADComputer -Filter {
    LastLogonDate -lt $DateLimite -and Enabled -eq $true
} -Properties LastLogonDate, OperatingSystem |
    Select-Object Name, LastLogonDate, OperatingSystem

$usersInactifs | Export-Csv "$OutputDir\users_inactifs_$(Get-Date -f yyyyMMdd).csv" `
    -NoTypeInformation -Delimiter ";" -Encoding UTF8

$computersInactifs | Export-Csv "$OutputDir\computers_inactifs_$(Get-Date -f yyyyMMdd).csv" `
    -NoTypeInformation -Delimiter ";" -Encoding UTF8

Write-Host "📊 Utilisateurs inactifs : $($usersInactifs.Count)"
Write-Host "📊 Ordinateurs inactifs  : $($computersInactifs.Count)"

if ($DesactiverAutomatiquement -and $usersInactifs.Count -gt 0) {
    $usersInactifs | ForEach-Object {
        Disable-ADAccount -Identity $_.SamAccountName
        Write-Host "🔒 Désactivé : $($_.SamAccountName)"
    }
}
Export GPO appliquées sur un poste
Confirmé GPOauditrsopAD

Exporte les stratégies de groupe appliquées sur un ordinateur au format HTML ou XML.

script
# ─── Variables à modifier ───────────────────────────
$Ordinateur = "PC-JDUPONT"    # Nom du poste ou $env:COMPUTERNAME
$Utilisateur = "DOMAIN\jdupont"  # Optionnel
$OutputDir = "C:\Temp\GPO_Reports"
# ────────────────────────────────────────────────────

New-Item -ItemType Directory -Path $OutputDir -Force | Out-Null

# Rapport HTML RSOP
$HtmlFile = "$OutputDir\GPO_${Ordinateur}_$(Get-Date -f yyyyMMdd).html"
Get-GPResultantSetOfPolicy -Computer $Ordinateur -ReportType Html -Path $HtmlFile
Write-Host "✅ Rapport GPO HTML : $HtmlFile"

# Liste des GPO appliquées (rapide)
Write-Host ""
Write-Host "── GPO appliquées sur $Ordinateur ──────────"
$rsop = [xml](Get-GPResultantSetOfPolicy -Computer $Ordinateur -ReportType Xml)
$rsop.Rsop.ComputerResults.GPO | ForEach-Object {
    $statut = if ($_.IsValid -eq "true") {"✅"} else {"❌"}
    Write-Host "$statut $($_.Name)"
}

# Vérifier si une GPO spécifique est appliquée
$GpoAChercher = "Default Domain Policy"
$appliquee = $rsop.Rsop.ComputerResults.GPO | Where-Object Name -eq $GpoAChercher
if ($appliquee) {
    Write-Host ""
    Write-Host "✅ '$GpoAChercher' est bien appliquée"
} else {
    Write-Host "❌ '$GpoAChercher' NON trouvée"
}
Rapport espace disque tous les serveurs
Confirmé diskserveursWMImonitoring

Interroge une liste de serveurs via WMI et génère un rapport d'espace disque consolidé.

script
# ─── Variables à modifier ───────────────────────────
$Serveurs = @("SRV-WEB01", "SRV-DB01", "SRV-FILE01", "SRV-AD01")
$SeuilAlerte = 80    # % d'utilisation
$OutputFile = "C:\Temp\disques_$(Get-Date -f yyyyMMdd).csv"
# ────────────────────────────────────────────────────

$rapport = @()

foreach ($srv in $Serveurs) {
    if (-not (Test-Connection $srv -Count 1 -Quiet)) {
        Write-Warning "⚠️  $srv : injoignable"
        continue
    }

    try {
        $disques = Get-WmiObject -ComputerName $srv Win32_LogicalDisk `
            -Filter "DriveType=3" -ErrorAction Stop

        foreach ($d in $disques) {
            $total = [math]::Round($d.Size / 1GB, 1)
            $libre = [math]::Round($d.FreeSpace / 1GB, 1)
            $pct   = [math]::Round(($d.Size - $d.FreeSpace) / $d.Size * 100, 1)
            $statut = if ($pct -gt $SeuilAlerte) {"⚠️ ALERTE"} else {"✅ OK"}

            $rapport += [PSCustomObject]@{
                Serveur   = $srv
                Disque    = $d.DeviceID
                Total_GB  = $total
                Libre_GB  = $libre
                Usage_Pct = $pct
                Statut    = $statut
            }
            Write-Host "$statut $srv $($d.DeviceID) — ${pct}% utilisé (libre: ${libre}GB)"
        }
    } catch {
        Write-Warning "❌ $srv : erreur WMI — $($_.Exception.Message)"
    }
}

$rapport | Export-Csv $OutputFile -NoTypeInformation -Delimiter ";" -Encoding UTF8
Write-Host "✅ Rapport exporté : $OutputFile"
Déploiement logiciel via GPO/Script
Expert deployMSIGPOsilencieux

Installe un logiciel MSI/EXE en silence sur un ou plusieurs postes à distance.

script
# ─── Variables à modifier ───────────────────────────
$Installeur = "\\SRV-FILE01\Deploiement\7zip\7z2301-x64.msi"
$ArgumentsMSI = '/qn /norestart ALLUSERS=1'
$Cibles = @("PC-JDUPONT", "PC-AMARTIN", "PC-FLEROY")
$LogDir = "C:\Temp\Deploy_Logs"
# ────────────────────────────────────────────────────

New-Item -ItemType Directory -Path $LogDir -Force | Out-Null
$resultats = @()

foreach ($pc in $Cibles) {
    Write-Host "📦 Installation sur $pc..."

    if (-not (Test-Connection $pc -Count 1 -Quiet)) {
        Write-Warning "⚠️  $pc : injoignable"
        $resultats += [PSCustomObject]@{PC=$pc; Statut="Injoignable"}
        continue
    }

    try {
        # Copier l'installeur localement sur la cible
        $dest = "\\$pc\C$\Temp\installeur.msi"
        Copy-Item $Installeur $dest -Force

        # Lancer l'installation via PSRemoting
        $result = Invoke-Command -ComputerName $pc -ScriptBlock {
            param($args)
            $proc = Start-Process msiexec.exe -ArgumentList "/i C:\Temp\installeur.msi $args" `
                -Wait -PassThru
            return $proc.ExitCode
        } -ArgumentList $ArgumentsMSI

        $statut = if ($result -eq 0) {"✅ Succès"} else {"❌ Erreur (code:$result)"}
        Write-Host "  $statut"
        $resultats += [PSCustomObject]@{PC=$pc; Statut=$statut; Code=$result}

    } catch {
        Write-Warning "❌ $pc : $($_.Exception.Message)"
        $resultats += [PSCustomObject]@{PC=$pc; Statut="Erreur PS"}
    }
}

$resultats | Format-Table -AutoSize
$resultats | Export-Csv "$LogDir\deploy_$(Get-Date -f yyyyMMdd_HHmm).csv" `
    -NoTypeInformation -Delimiter ";" -Encoding UTF8
Audit des membres des groupes AD sensibles
Expert ADsecuritegroupesaudit

Vérifie les membres des groupes AD à forts privilèges (Domain Admins, Enterprise Admins...).

script
# ─── Variables à modifier ───────────────────────────
$GroupesSensibles = @(
    "Domain Admins",
    "Enterprise Admins",
    "Schema Admins",
    "Administrators",
    "Account Operators"
)
$OutputFile = "C:\Temp\audit_groupes_$(Get-Date -f yyyyMMdd).csv"
$EmailAlerte = "ssi@domaine.fr"
# ────────────────────────────────────────────────────

Import-Module ActiveDirectory
$rapport = @()

foreach ($groupe in $GroupesSensibles) {
    try {
        $membres = Get-ADGroupMember -Identity $groupe -Recursive |
            Get-ADObject -Properties LastLogonDate, Enabled |
            Select-Object Name, ObjectClass, SamAccountName, Enabled, LastLogonDate

        Write-Host "━━ $groupe ($($membres.Count) membres) ━━"
        $membres | ForEach-Object {
            $ico = if ($_.Enabled -eq $false) {"⚠️"} else {"✅"}
            Write-Host "  $ico $($_.Name) [$($_.ObjectClass)]"
            $rapport += [PSCustomObject]@{
                Groupe         = $groupe
                Nom            = $_.Name
                Type           = $_.ObjectClass
                Login          = $_.SamAccountName
                Actif          = $_.Enabled
                DerniereConnex = $_.LastLogonDate
            }
        }
    } catch {
        Write-Warning "⚠️  Groupe '$groupe' introuvable"
    }
}

$rapport | Export-Csv $OutputFile -NoTypeInformation -Delimiter ";" -Encoding UTF8
Write-Host "✅ Rapport exporté : $OutputFile ($($rapport.Count) entrées)"
Ajouter Les Fibrés à mes sources préférées
Retrouvez plus souvent nos guides dans vos résultats Google