Automatiser GLPI avec PowerShell : Guide Complet (avec Scripts)

Introduction

GLPI (Gestionnaire Libre de Parc Informatique) est un outil ITSM très populaire dans les entreprises pour gérer le parc informatique, les tickets, et bien plus. Grâce à son API REST, il est possible d’interagir automatiquement avec GLPI depuis d’autres systèmes, comme PowerShell.

Dans ce guide, vous apprendrez à automatiser des tâches simples avec GLPI et PowerShell. Chaque exemple est expliqué pas à pas, avec les scripts complets.

Prérequis

Avant de commencer :

  1. GLPI configuré avec l’API activée
  2. Un App Token et un User Token (générés dans GLPI)
  3. PowerShell installé (Windows 10+ ou Windows Server)
  4. Si besoin, le module ActiveDirectory si vous utilisez l’AD

1. Initialiser la connexion à l’API GLPI

Avant chaque script, il faut créer une session d’API pour s’authentifier.

# Configuration
$AppToken = "VOTRE_APP_TOKEN"
$UserToken = "VOTRE_USER_TOKEN"
$AppURL = "https://votre-glpi.fr/apirest.php"

# Headers d'authentification
$Headers = @{
    "App-Token"  = $AppToken
    "Authorization" = "user_token $UserToken"
}

# Initier la session
$InitSession = Invoke-RestMethod -Uri "$AppURL/initSession" -Method GET -Headers $Headers
$SessionToken = $InitSession.session_token

# Ajouter le token de session aux entêtes
$Headers["Session-Token"] = $SessionToken

2. Synchroniser la description des ordinateurs depuis Active Directory

Objectif :

Mettre à jour la fiche des ordinateurs GLPI avec la description présente dans Active Directory.

Script :

Import-Module ActiveDirectory

# Lister les ordinateurs AD
$Computers = Get-ADComputer -Filter * -Property Name, Description

foreach ($Computer in $Computers) {
    $GLPIName = $Computer.Name
    $Description = $Computer.Description

    # Chercher la machine dans GLPI
    $Search = Invoke-RestMethod -Uri "$AppURL/Computer/?searchText=$GLPIName" -Method GET -Headers $Headers

    if ($Search.Count -gt 0) {
        $ComputerID = $Search[0].id

        # Mise à jour de la description
        $UpdateData = @{
            input = @{
                id = $ComputerID
                comment = $Description
            }
        } | ConvertTo-Json -Depth 3

        Invoke-RestMethod -Uri "$AppURL/Computer/$ComputerID" -Method PUT -Headers $Headers -Body $UpdateData -ContentType "application/json"
        Write-Host "Mise à jour : $GLPIName"
    }
}

3. Créer un ticket automatiquement depuis un outil de supervision

Objectif :

Créer un ticket GLPI automatiquement dès qu’une alerte est détectée.

Script :

# === Données venant de la supervision ===
$NomServeur = "SRV-01"
$TagClient = "ClientX"   # Le tag/nom de l'entité GLPI
$RequestTypeID = 5        # ID du type de demande 'Supervision' dans GLPI

# === Récupérer l'ID de l'entité GLPI en fonction du nom ===
$EntitySearch = Invoke-RestMethod -Uri "$AppURL/Entity?searchText=$TagClient" -Method GET -Headers $Headers

if ($EntitySearch.Count -eq 0) {
    Write-Error "Entité '$TagClient' introuvable dans GLPI."
    exit
}

$EntityID = $EntitySearch[0].id  # On prend le premier résultat correspondant

# === Création du ticket dans l'entité trouvée avec source Supervision ===
$TicketData = @{
    input = @{
        name = "Alerte serveur - $NomServeur"
        content = "Le serveur $NomServeur a déclenché une alerte critique. (Client : $TagClient)"
        urgency = 3
        impact = 2
        priority = 4
        status = 1
        type = 1
        requesttypes_id = $RequestTypeID  # Source : Supervision
        entities_id = $EntityID
    }
} | ConvertTo-Json -Depth 3

Invoke-RestMethod -Uri "$AppURL/Ticket" -Method POST -Headers $Headers -Body $TicketData -ContentType "application/json"

# === Fermer la session ===
Invoke-RestMethod -Uri "$AppURL/killSession" -Method GET -Headers $Headers

4. Lister les tickets ouverts d’un utilisateur

Objectif :

Afficher tous les tickets non résolus d’un utilisateur précis.

Script :

$UserID = 123  # Remplacez par l'ID utilisateur GLPI

$Response = Invoke-RestMethod -Uri "$AppURL/Ticket?criteria[0][field]=users_id_recipient&criteria[0][value]=$UserID&criteria[1][link]=AND&criteria[1][field]=status&criteria[1][searchtype]=notcontains&criteria[1][value]=closed" -Method GET -Headers $Headers

foreach ($Ticket in $Response) {
    Write-Host "Ticket: $($Ticket.id) - $($Ticket.name)"
}

5. Affecter automatiquement un ticket à un technicien selon la catégorie

Objectif :

Affecter le ticket à la bonne personne selon son type.

Script :

$TicketID = 456      # ID du ticket
$TechnicianID = 78   # ID GLPI du technicien

$AssignData = @{
    input = @{
        id = $TicketID
        users_id_assign = $TechnicianID
    }
} | ConvertTo-Json -Depth 3

Invoke-RestMethod -Uri "$AppURL/Ticket/$TicketID" -Method PUT -Headers $Headers -Body $AssignData -ContentType "application/json"

6. Créer une fiche ordinateur automatiquement via un script

Objectif :

Ajouter une nouvelle fiche ordinateur dans GLPI quand une nouvelle machine est déployée.

Script :

$NomMachine = "PC-NEW01"
$SerialNumber = "SN12345678"

$ComputerData = @{
    input = @{
        name = $NomMachine
        serial = $SerialNumber
        comment = "Ajout automatique via PowerShell"
        entities_id = 0
    }
} | ConvertTo-Json -Depth 3

Invoke-RestMethod -Uri "$AppURL/Computer" -Method POST -Headers $Headers -Body $ComputerData -ContentType "application/json"

7. Fermer la session GLPI

Toujours penser à fermer proprement la session à la fin d’un script :

Invoke-RestMethod -Uri "$AppURL/killSession" -Method GET -Headers $Headers

Conclusion

Avec ces exemples simples, vous avez toutes les bases pour automatiser GLPI avec PowerShell. Vous pouvez aller plus loin en ajoutant :

  • Des logs d’exécution
  • Des interfaces Web internes
  • Des automatisations planifiées

N’hésitez pas à adapter ces scripts à vos besoins réels. C’est un excellent point de départ pour industrialiser vos opérations IT.