Scripts PowerShell d’administration

Active Directory, inventaire, tests réseau et contrôle des services.

Avant d'exécuter un script

Exécute PowerShell avec les droits adaptés, lis les variables et teste d'abord sur une OU de laboratoire. Utilise -WhatIf lorsque la cmdlet le permet.

1. Ajouter un utilisateur Active Directory

param(
    [Parameter(Mandatory)] [string]$Prenom,
    [Parameter(Mandatory)] [string]$Nom,
    [Parameter(Mandatory)] [string]$SamAccountName,
    [string]$OU = "OU=Utilisateurs,DC=warx,DC=home",
    [string]$Groupe = "GG_Utilisateurs"
)

Import-Module ActiveDirectory
$MotDePasse = Read-Host "Mot de passe temporaire" -AsSecureString

if (Get-ADUser -Filter "SamAccountName -eq '$SamAccountName'" -ErrorAction SilentlyContinue) {
    Write-Warning "Le compte $SamAccountName existe déjà."
    exit 1
}

New-ADUser `
    -Name "$Prenom $Nom" `
    -GivenName $Prenom `
    -Surname $Nom `
    -SamAccountName $SamAccountName `
    -UserPrincipalName "$SamAccountName@warx.home" `
    -Path $OU `
    -AccountPassword $MotDePasse `
    -Enabled $true `
    -ChangePasswordAtLogon $true

Add-ADGroupMember -Identity $Groupe -Members $SamAccountName
Get-ADUser $SamAccountName -Properties MemberOf

2. Créer des comptes AD depuis un CSV

CSV : Prenom;Nom;Login;OU;Groupe. Le mot de passe est demandé une seule fois ou peut être généré individuellement.

Import-Module ActiveDirectory
$Utilisateurs = Import-Csv .\utilisateurs.csv -Delimiter ';'

foreach ($Utilisateur in $Utilisateurs) {
    if (Get-ADUser -Filter "SamAccountName -eq '$($Utilisateur.Login)'" -ErrorAction SilentlyContinue) {
        Write-Warning "$($Utilisateur.Login) existe déjà"
        continue
    }

    $MotDePasseClair = -join ((48..57)+(65..90)+(97..122) | Get-Random -Count 14 | ForEach-Object {[char]$_})
    $MotDePasse = ConvertTo-SecureString $MotDePasseClair -AsPlainText -Force

    New-ADUser -Name "$($Utilisateur.Prenom) $($Utilisateur.Nom)" `
      -GivenName $Utilisateur.Prenom -Surname $Utilisateur.Nom `
      -SamAccountName $Utilisateur.Login `
      -UserPrincipalName "$($Utilisateur.Login)@warx.home" `
      -Path $Utilisateur.OU -AccountPassword $MotDePasse `
      -Enabled $true -ChangePasswordAtLogon $true

    Add-ADGroupMember -Identity $Utilisateur.Groupe -Members $Utilisateur.Login
    [PSCustomObject]@{ Login=$Utilisateur.Login; MotDePasseTemporaire=$MotDePasseClair }
} | Export-Csv .\mots-de-passe-temporaires.csv -NoTypeInformation -Delimiter ';'
Protège et supprime rapidement le CSV des mots de passe. En production, préfère un coffre-fort ou une remise individuelle sécurisée.

3. Tester plusieurs serveurs

$Serveurs = Get-Content .\serveurs.txt
foreach ($Serveur in $Serveurs) {
    if (Test-Connection -ComputerName $Serveur -Count 1 -Quiet) {
        Write-Host "[OK] $Serveur répond"
    } else {
        Write-Warning "[KO] $Serveur ne répond pas"
    }
}

4. Tester des ports réseau

$Tests = @(
    @{Hote='dc01.warx.home'; Port=53},
    @{Hote='dc01.warx.home'; Port=88},
    @{Hote='dc01.warx.home'; Port=389},
    @{Hote='filesrv.warx.home'; Port=445}
)

foreach ($Test in $Tests) {
    $Resultat = Test-NetConnection -ComputerName $Test.Hote -Port $Test.Port -WarningAction SilentlyContinue
    [PSCustomObject]@{
        Hote = $Test.Hote
        Port = $Test.Port
        Accessible = $Resultat.TcpTestSucceeded
    }
}

5. Inventaire des postes AD

Import-Module ActiveDirectory
Get-ADComputer -Filter * -Properties OperatingSystem,IPv4Address,LastLogonDate |
    Select-Object Name,OperatingSystem,IPv4Address,LastLogonDate |
    Sort-Object Name |
    Export-Csv .\inventaire-postes.csv -NoTypeInformation -Encoding UTF8

6. Vérifier les services critiques

$Services = 'DNS','NTDS','KDC','Netlogon'
foreach ($Nom in $Services) {
    $Service = Get-Service -Name $Nom -ErrorAction SilentlyContinue
    if (-not $Service) {
        Write-Warning "$Nom absent"
    } elseif ($Service.Status -ne 'Running') {
        Write-Warning "$Nom est $($Service.Status)"
        Start-Service -Name $Nom
    } else {
        Write-Host "[OK] $Nom"
    }
}

7. Rapport réseau Windows

$Rapport = ".\rapport-reseau-$env:COMPUTERNAME-$(Get-Date -Format yyyyMMdd-HHmm).txt"
@(
    "=== Configuration IP ==="
    (Get-NetIPConfiguration | Format-List | Out-String)
    "=== Routes ==="
    (Get-NetRoute | Sort-Object DestinationPrefix | Format-Table | Out-String)
    "=== DNS ==="
    (Get-DnsClientServerAddress | Format-Table | Out-String)
    "=== Connexions TCP ==="
    (Get-NetTCPConnection | Format-Table | Out-String)
) | Set-Content $Rapport
Write-Host "Rapport créé : $Rapport"