PowerShell
Introduction
PowerShell est un langage de script et un shell de commande développé par Microsoft. Il permet l'automatisation des tâches d'administration système et la gestion de l'infrastructure Windows.
Bases de PowerShell
Structure d'un script
# Commentaire sur une ligne
<#
Commentaire sur plusieurs lignes
#>
# Déclaration de variables
$nomVariable = "valeur"
$tableau = @(1, 2, 3, 4, 5)
$hashtable = @{
"clé1" = "valeur1"
"clé2" = "valeur2"
}
# Fonction simple
function Get-Salutation {
param(
[string]$nom
)
return "Bonjour $nom"
}
Gestion des fichiers
# Créer un fichier
New-Item -Path "C:\temp\test.txt" -ItemType File
# Lire un fichier
Get-Content -Path "C:\temp\test.txt"
# Écrire dans un fichier
Set-Content -Path "C:\temp\test.txt" -Value "Contenu du fichier"
# Copier un fichier
Copy-Item -Path "C:\temp\test.txt" -Destination "C:\temp\backup\"
Administration Système
Gestion des services
# Lister tous les services
Get-Service
# Démarrer un service
Start-Service -Name "Spooler"
# Arrêter un service
Stop-Service -Name "Spooler"
# Vérifier le statut d'un service
Get-Service -Name "Spooler" | Select-Object Status, Name, DisplayName
Gestion des processus
# Lister les processus
Get-Process
# Arrêter un processus
Stop-Process -Name "notepad" -Force
# Obtenir les processus utilisant le plus de CPU
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5
Active Directory
Gestion des utilisateurs
# Créer un nouvel utilisateur
New-ADUser -Name "John Doe" `
-GivenName "John" `
-Surname "Doe" `
-SamAccountName "jdoe" `
-UserPrincipalName "jdoe@domaine.local" `
-Path "OU=Users,DC=domaine,DC=local" `
-AccountPassword (ConvertTo-SecureString "MotDePasse123!" -AsPlainText -Force) `
-Enabled $true
# Rechercher un utilisateur
Get-ADUser -Filter "Name -like '*John*'"
# Modifier un utilisateur
Set-ADUser -Identity "jdoe" -Department "IT" -Title "Administrateur Système"
Gestion des groupes
# Créer un groupe
New-ADGroup -Name "Administrateurs IT" `
-GroupCategory Security `
-GroupScope Global `
-Path "OU=Groups,DC=domaine,DC=local"
# Ajouter un utilisateur à un groupe
Add-ADGroupMember -Identity "Administrateurs IT" -Members "jdoe"
# Lister les membres d'un groupe
Get-ADGroupMember -Identity "Administrateurs IT"
Monitoring et Maintenance
Surveillance système
# Obtenir l'utilisation du CPU
Get-Counter '\Processor(_Total)\% Processor Time'
# Obtenir l'utilisation de la mémoire
Get-Counter '\Memory\Available MBytes'
# Obtenir l'espace disque
Get-WmiObject Win32_LogicalDisk |
Where-Object {$_.DriveType -eq 3} |
Select-Object DeviceID,
@{Name="EspaceTotal(GB)";Expression={"{0:N2}" -f ($_.Size/1GB)}},
@{Name="EspaceLibre(GB)";Expression={"{0:N2}" -f ($_.FreeSpace/1GB)}}
Nettoyage système
# Nettoyer les fichiers temporaires
Remove-Item -Path "C:\Windows\Temp\*" -Recurse -Force
# Nettoyer le dossier de téléchargement
Remove-Item -Path "$env:USERPROFILE\Downloads\*" -Recurse -Force
# Vider la corbeille
Clear-RecycleBin -Force
Bonnes Pratiques
- Toujours utiliser des commentaires pour expliquer le code complexe
- Utiliser des noms de variables explicites
- Gérer les erreurs avec try/catch
- Utiliser des paramètres nommés pour plus de clarté
- Documenter les fonctions avec des commentaires help
- Tester les scripts dans un environnement de test avant la production
- Utiliser des modules pour organiser le code
- Implémenter la journalisation pour le suivi des exécutions
Exemples Pratiques
Intégration avec Zabbix
# Script pour envoyer des métriques à Zabbix via SNMP
function Send-ZabbixMetric {
param(
[string]$HostName,
[string]$Key,
[string]$Value
)
# Configuration SNMP
$SNMPCommunity = "public"
$ZabbixServer = "192.168.1.100"
# Envoi de la métrique via SNMP
snmpset -v 2c -c $SNMPCommunity $ZabbixServer "1.3.6.1.4.1.10050.1.1.1.1.1" s "$HostName"
snmpset -v 2c -c $SNMPCommunity $ZabbixServer "1.3.6.1.4.1.10050.1.1.1.2.1" s "$Key"
snmpset -v 2c -c $SNMPCommunity $ZabbixServer "1.3.6.1.4.1.10050.1.1.1.3.1" s "$Value"
}
# Exemple d'utilisation
$CPUUsage = (Get-Counter '\Processor(_Total)\% Processor Time').CounterSamples.CookedValue
Send-ZabbixMetric -HostName "SRV-WIN01" -Key "cpu.usage" -Value $CPUUsage
Surveillance des Services Windows
# Script pour surveiller les services critiques
function Get-CriticalServices {
$criticalServices = @(
"Spooler",
"MSSQLSERVER",
"IISADMIN",
"W3SVC"
)
$results = @()
foreach ($service in $criticalServices) {
$status = Get-Service -Name $service
$results += [PSCustomObject]@{
ServiceName = $service
Status = $status.Status
StartType = $status.StartType
LastStartTime = (Get-WmiObject Win32_Service -Filter "Name='$service'").StartName
}
}
return $results
}
# Envoi des résultats à Zabbix
$services = Get-CriticalServices
foreach ($service in $services) {
Send-ZabbixMetric -HostName "SRV-WIN01" -Key "service.$($service.ServiceName)" -Value $service.Status
}
Surveillance des Disques
# Script pour surveiller l'espace disque
function Get-DiskSpace {
Get-WmiObject Win32_LogicalDisk |
Where-Object {$_.DriveType -eq 3} |
ForEach-Object {
$freeSpace = [math]::Round($_.FreeSpace / 1GB, 2)
$totalSpace = [math]::Round($_.Size / 1GB, 2)
$usedSpace = $totalSpace - $freeSpace
$usedPercentage = [math]::Round(($usedSpace / $totalSpace) * 100, 2)
Send-ZabbixMetric -HostName "SRV-WIN01" -Key "disk.$($_.DeviceID).free" -Value $freeSpace
Send-ZabbixMetric -HostName "SRV-WIN01" -Key "disk.$($_.DeviceID).used" -Value $usedSpace
Send-ZabbixMetric -HostName "SRV-WIN01" -Key "disk.$($_.DeviceID).used_percent" -Value $usedPercentage
}
}
Surveillance de la Mémoire
# Script pour surveiller la mémoire
function Get-MemoryUsage {
$memory = Get-WmiObject Win32_OperatingSystem
$totalMemory = [math]::Round($memory.TotalVisibleMemorySize / 1MB, 2)
$freeMemory = [math]::Round($memory.FreePhysicalMemory / 1MB, 2)
$usedMemory = $totalMemory - $freeMemory
$usedPercentage = [math]::Round(($usedMemory / $totalMemory) * 100, 2)
Send-ZabbixMetric -HostName "SRV-WIN01" -Key "memory.total" -Value $totalMemory
Send-ZabbixMetric -HostName "SRV-WIN01" -Key "memory.free" -Value $freeMemory
Send-ZabbixMetric -HostName "SRV-WIN01" -Key "memory.used" -Value $usedMemory
Send-ZabbixMetric -HostName "SRV-WIN01" -Key "memory.used_percent" -Value $usedPercentage
}
Surveillance des Événements Windows
# Script pour surveiller les événements système
function Get-SystemEvents {
$events = Get-EventLog -LogName System -EntryType Error,Warning -Newest 10
foreach ($event in $events) {
$eventData = @{
Time = $event.TimeGenerated
Type = $event.EntryType
Source = $event.Source
Message = $event.Message
}
# Conversion en JSON pour l'envoi
$jsonData = ConvertTo-Json $eventData
Send-ZabbixMetric -HostName "SRV-WIN01" -Key "event.system" -Value $jsonData
}
}
Script de Maintenance Automatique
# Script de maintenance système
function Start-SystemMaintenance {
# Nettoyage des fichiers temporaires
Remove-Item -Path "C:\Windows\Temp\*" -Recurse -Force
Remove-Item -Path "$env:USERPROFILE\AppData\Local\Temp\*" -Recurse -Force
# Nettoyage des logs
Get-ChildItem "C:\Windows\Logs" -Filter "*.log" |
Where-Object {$_.LastWriteTime -lt (Get-Date).AddDays(-30)} |
Remove-Item -Force
# Vérification de l'intégrité du système
sfc /scannow
# Nettoyage de la corbeille
Clear-RecycleBin -Force
# Envoi des résultats à Zabbix
Send-ZabbixMetric -HostName "SRV-WIN01" -Key "maintenance.last_run" -Value (Get-Date -Format "yyyy-MM-dd HH:mm:ss")
}