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")
}