GLPI activer et configurer API et utiliser avec PowerShell
  • 2 mai 2025
  • ComputaSYS
  • 0


I. Présentation

Dans ce tutoriel, nous allons découvrir l’API de GLPI et voir comment nous pouvons utiliser cette API avec un script PowerShell. Grâce à l’API, vous pouvez lire et écrire des données dans GLPI, ce qui ouvre la voie à différents cas d’usage et des intégrations avec des applications tierces…

Il y a quelques années, j’ai créé un script PowerShell permettant d’inscrire l’ID de connexion AnyDesk des ordinateurs Windows directement dans l’inventaire GLPI. Ainsi, sur GLPI, dans chaque fiche d’ordinateur, il y avait l’ID AnyDesk en tant qu’information supplémentaire (celle-ci n’étant pas remontée automatiquement).

Dans le cadre de ce tutoriel, nous verrons un autre scénario d’utilisation : pousser la valeur de l’attribut description des objets ordinateurs de l’Active Directory vers les ordinateurs présents dans GLPI. Nous ciblerons le champ “Usager numéro” sur l’interface de GLPI, mais nous pourrions choisir un autre champ. Je n’ai volontairement pas spécifié le champ “Usager” car il est alimenté automatiquement par l’agent en fonction du dernier utilisateur connecté.

Le champ “description” de l’AD étant fréquemment utilisé pour saisir des informations additionnelles sur un PC, comme le nom de l’utilisateur à qui il est attribué, j’ai trouvé l’idée pertinente. L’idée de cet article étant aussi de vous montrer la mécanique et vous permettre d’adapter le code à vos besoins.

Voici un aperçu du résultat obtenu grâce à ce script PowerShell :

Parmi les actions possibles au travers de l’API de GLPI :

Rechercher des éléments

Mettre à jour, ajouter ou supprimer des éléments

Obtenir la configuration de GLPI

Demander la réinitialisation d’un mot de passe

Etc…

Si vous avez besoin d’aide pour installer GLPI ou déployer l’agent GLPI, voici nos tutoriels :

II. Configurer l’API de GLPI

Nous devons commencer par activer et configurer l’API REST de GLPI, sinon les connexions seront refusées. Il sera également nécessaire de générer un jeton d’application et un jeton au niveau d’un utilisateur (qui sera utilisé pour agir auprès de GLPI).

À partir de l’interface de GLPI, cliquez sur : Configuration, Générale, API. Ensuite, basculez l’option “Activer l’API Rest” sur “Oui”, puis sauvegardez avec le bouton prévu à cet effet.

Profitez-en pour récupérer l’URL d’accès à l’API, qui est l’endpoint sur lequel il faudra se connecter. Pour ma part, il s’agit de cette URL :

https://support.it-connect.tech/apirest.php/

Toujours sur cette même page, cliquez sur le bouton “Ajouter un client de l’API”. Configurez ce nouveau client en indiquant un nom, par exemple “Script_PowerShell” et vous pouvez aussi filtrer les accès à l’API. Dans l’exemple ci-dessous, seule la machine ayant l’adresse IP 192.168.10.200 pourra solliciter l’API. Cochez l’option “Regénérer” et cliquez sur “Ajouter”.

Copiez le jeton qui a été généré. Il s’agit de votre jeton d’application et il sera nécessaire de l’associer au paramètre app_token lors des échanges avec l’API.

Sur le même principe, vous devez générer une clé d’API pour l’utilisateur que vous allez utiliser pour contacter l’API. Suivez le chemin suivant : Administration, Utilisateurs, choisissez votre utilisateur, puis dans l’onglet “Utilisateur”, regénérez un jeton d’API. Copiez la valeur obtenue.

Voilà, la configuration est terminée.

III. Se connecter à l’API GLPI avec PowerShell

Que ce soit avec PowerShell, un autre langage ou un outil comme Curl, cela n’a pas d’importance. Ce qui est essentiel, c’est de construire les requêtes dans le format attendu par l’API de GLPI.

La première action à effectuer, c’est d’initier une session auprès de l’API, en utilisant les jetons d’application et d’utilisateur. Pour cela, vous devez cibler le point de terminaison /apirest.php/initSession à l’aide de la commande PowerShell Invoke-RestMethod. Si la connexion réussie, un jeton de session sera retourné dans la console.

$GLPIServer = “https://support.it-connect.tech”
$GLPIAppToken = “Cbnpe8EuH4N3giGgdX440xxxxxxxxxxxxxxxxxxxxx”
$GLPIUserToken = “7T1DfhhOLPl9duAaExlbbfxxxxxxxxxxxxxxxxxxxxx”

# Open a session and get the session token
$initHeaders = @{
“Authorization” = “user_token $GLPIUserToken”
“App-Token” = $GLPIAppToken
}
$initUri = “$GLPIServer/apirest.php/initSession”

Invoke-RestMethod -Method GET -Headers $initHeaders -Uri $initUri -Body “” `
-ContentType $ContentType -SkipCertificateCheck

Après, d’autres appels sont possibles vers l’API pour récupérer des informations ou effectuer des écritures.

Rechercher un ordinateur dans GLPI dont le nom correspond à la variable $ComputerName

“$GLPIServer/apirest.php/search/Computer?criteria[0]https://www.it-connect.fr/glpi-utiliser-api-avec-un-script-powershell/=AND&criteria[0][itemtype]=Computer&criteria[0][field]=1&criteria[0][searchtype]=contains&criteria[0][value]=$ComputerName&forcedisplay[0]=2”

Cibler un ordinateur dans GLPI pour actualiser ses informations ($ComputerID étant l’identifiant récupéré via la requête précédente)

“$GLPIServer/apirest.php/Computer/$ComputerID”

Le mieux étant de consulter la documentation de l’API. Elle est accessible directement via l’adresse du point de terminaison de votre serveur. Par exemple, pour ma part, c’est à cette adresse :

https://support.it-connect.tech/apirest.php/

IV. Synchroniser la description des machines Active Directory avec GLPI

Ce script récupère une liste d’ordinateurs dans Active Directory et met à jour leurs descriptions dans GLPI en utilisant l’API REST de l’application. Ici, nous prenons en considération toutes les machines situées dans l’OU suivante (et sous-OU éventuelles) : OU=PC,OU=IT-Connect,DC=it-connect,DC=local. Il est important de comprendre qu’il s’agit d’un push de l’AD vers GLPI, et non une synchronisation bidirectionnelle.

# Description: This script retrieves a list of computers from Active Directory and updates their descriptions in GLPI using the GLPI REST API.
# Variables
$GLPIServer = “https://support.it-connect.tech”
$GLPIAppToken = “Cbnpe8EuH4N3giGgdX4xxxxxxxxxxxxxxxxx”
$GLPIUserToken = “7T1DfhhOLPl9duAaExlbbxxxxxxxxxxxxx”
$ADSearchBase = “OU=PC,OU=IT-Connect,DC=it-connect,DC=local”

# Function to invoke GLPI REST API with error handling.
function Invoke-GLPIRequest {
param(
[Parameter(Mandatory)]
[string]$Method,
[Parameter(Mandatory)]
[string]$Uri,
[Parameter(Mandatory)]
[hashtable]$Headers,
$Body = $null
)
$ContentType = “application/json”
try {
if ($Body) {
$BodyJson = $Body | ConvertTo-Json -Depth 5
} else {
$BodyJson = $null
}
$result = Invoke-RestMethod -Method $Method -Headers $Headers -Uri $Uri -Body $BodyJson `
-ContentType $ContentType -SkipCertificateCheck -ErrorAction Stop
return $result
}
catch {
Write-Host “ERROR – GLPI API : Request [$Method] $Uri failed. $_” -ForegroundColor Red
return $null
}
}

if ($GLPIServer) {
Write-Host “INFO – GLPI API : Initializing a session with the remote server…” -ForegroundColor Green

# Open a session and get the session token
$initHeaders = @{
“Authorization” = “user_token $GLPIUserToken”
“App-Token” = $GLPIAppToken
}
$initUri = “$GLPIServer/apirest.php/initSession”
$initResult = Invoke-GLPIRequest -Method “GET” -Uri $initUri -Headers $initHeaders

if ($initResult -and $initResult.session_token) {
$session_token = $initResult.session_token
Write-Host “INFO – GLPI API : Session token is $session_token” -ForegroundColor Green

Write-Host “INFO – Retrieving computer list from Active Directory…” -ForegroundColor Green
$ComputerList = Get-ADComputer -Filter * -SearchBase $ADSearchBase -Properties Description | Select-Object Name, Description

foreach ($Computer in $ComputerList) {
$ComputerName = $Computer.Name
$ComputerDesc = $Computer.Description

if ($ComputerDesc) {
Write-Host “INFO – GLPI API : Computer ‘$ComputerName’ has a description to update in GLPI.” -ForegroundColor Green
Write-Host “INFO – Searching for the computer ‘$ComputerName’ in GLPI…” -ForegroundColor Green

$searchHeaders = @{
“Session-Token” = $session_token
“App-Token” = $GLPIAppToken
}
$searchUri = “$GLPIServer/apirest.php/search/Computer?criteria[0]https://www.it-connect.fr/glpi-utiliser-api-avec-un-script-powershell/=AND&criteria[0][itemtype]=Computer&criteria[0][field]=1&criteria[0][searchtype]=contains&criteria[0][value]=$ComputerName&forcedisplay[0]=2”
$searchResult = Invoke-GLPIRequest -Method “GET” -Uri $searchUri -Headers $searchHeaders

if ($searchResult) {
$NumberOfResult = $searchResult.totalcount
if ($NumberOfResult -eq 1) {
Write-Host “INFO – GLPI API : One computer found for ‘$ComputerName’.” -ForegroundColor Green

# Retrieve the computer ID (assumed to be contained in the first element of data)
$ComputerID = $searchResult.data.2
if (-not $ComputerID) {
Write-Host “ERROR – GLPI API : Computer ID not found for ‘$ComputerName’.” -ForegroundColor Red
continue
}

$updateHeaders = @{
“Session-Token” = $session_token
“App-Token” = $GLPIAppToken
}
$updateUri = “$GLPIServer/apirest.php/Computer/$ComputerID”
$body = @{
input = @{
contact_num = $ComputerDesc
}
}
$updateResult = Invoke-GLPIRequest -Method “PUT” -Uri $updateUri -Headers $updateHeaders -Body $body
if ($updateResult) {
Write-Host “INFO – GLPI API : Updated computer ‘$ComputerName’ in GLPI.” -ForegroundColor Green
}
else {
Write-Host “ERROR – GLPI API : Failed to update computer ‘$ComputerName’.” -ForegroundColor Red
}
}
elseif ($NumberOfResult -gt 1) {
Write-Host “ERROR – GLPI API : Multiple ($NumberOfResult) computers found for ‘$ComputerName’.” -ForegroundColor Red
}
else {
Write-Host “ERROR – GLPI API : No computer found for ‘$ComputerName’.” -ForegroundColor Red
}
}
else {
Write-Host “ERROR – GLPI API : An error occurred during the search for ‘$ComputerName’.” -ForegroundColor Red
}
}
}

# Kill the GLPI session
$killHeaders = @{
“Session-Token” = $session_token
“App-Token” = $GLPIAppToken
}
$killUri = “$GLPIServer/apirest.php/killSession”
Invoke-GLPIRequest -Method “GET” -Uri $killUri -Headers $killHeaders | Out-Null
Write-Host “INFO – GLPI API : Session ($session_token) terminated.” -ForegroundColor Green
}
else {
Write-Host “ERROR – GLPI API : Unable to open a session and retrieve a token.” -ForegroundColor Red
}
}

Pour éviter les appels inutiles vers l’API, seules les machines dont la description n’est pas vide dans l’AD seront synchronisées avec GLPI. La valeur dans GLPI est directement écrasée, nous ne cherchons pas à faire une comparaison, car cela ferait des requêtes API supplémentaires (et ce n’est pas forcément justifié sur du push). De plus, il est intéressant de noter que le script se termine par un appel sur $GLPIServer/apirest.php/killSession pour tuer la session vers l’API GLPI.

Note : le paramètre -SkipCertificateCheck spécifié avec Invoke-WebRequest sert à outrepasser la vérification du certificat. Ceci est utile, car dans mon lab, j’utilise un certificat auto-signé. Attention, ce paramètre n’est pas pris en charge par Windows PowerShell 5.1 : supprimez-le si besoin ou installez la bonne version de PowerShell.

Voici un exemple de sortie lorsqu’il n’y a qu’un seul ordinateur à synchroniser.

En complément, je vous remets le résultat obtenu (déjà présenté en début d’article) :

Libre à vous de réadapter cet extrait de code pour pousser d’autres informations vers GLPI, en fonction de vos besoins. Disons que l’API fait sauter certaines limites natives lorsque l’on a besoin d’une information, mais qu’elle n’est pas remontée nativement.

V. Conclusion

En suivant ce tutoriel, vous devriez être en mesure de solliciter l’API de GLPI à l’aide d’un script PowerShell ! Vous pouvez aussi seulement utiliser la première partie de l’article dédiée à la configuration si vous désirez utiliser un autre langage ou plutôt utiliser une intégration avec une application tierce.

Qu’en pensez-vous ?

Ingénieur système et réseau, cofondateur d’IT-Connect et Microsoft MVP “Cloud and Datacenter Management”. Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.



Source link

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *