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.
# ─── 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.
# ─── 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.
# ─── 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.
# ─── 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é.
# ─── 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.
# ─── 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...).
# ─── 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