> For the complete documentation index, see [llms.txt](https://help.glpi-project.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://help.glpi-project.org/doc-plugins/fr/plugins-glpi/sccm.md).

# SCCM

| Téléchargement                                 | Sources                               |
| ---------------------------------------------- | ------------------------------------- |
| <https://github.com/pluginsGLPI/sccm/releases> | <https://github.com/pluginsGLPI/sccm> |

## Description

Le plugin **SCCM** synchronise les ordinateurs gérés par Microsoft System Center Configuration Manager (SCCM) vers GLPI.

***

## Compatibilité

| Version du plugin | Version de GLPI |
| ----------------- | --------------- |
| 2.7.x             | 12.0.x          |
| 2.5.x et 2.6.x    | 11.0.x          |

***

## Prérequis

### Côté plugin et GLPI

* Une version du plugin compatible avec votre version de GLPI (voir tableau ci-dessus).
* Un serveur Microsoft System Center Configuration Manager (SCCM), accessible en MSSQL depuis le serveur GLPI.
* L'inventaire natif de GLPI activé. Le plugin n'a plus besoin du plugin GLPI Inventory : il génère un fichier XML par ordinateur et l'envoie à l'inventaire natif de GLPI en HTTP(S) via cURL.

### PHP

| Version GLPI | PHP minimum | PHP Recommandé |
| ------------ | ----------- | -------------- |
| 11.0.x       | 8.2         | 8.4            |
| 12.0.X       | 8.3         | 8.5            |

{% hint style="info" %}
Ce plugin est disponible sans souscription [GLPI Network](https://services.glpi-network.com/#offers). Il est également disponible sur [GLPI Cloud](https://glpi-network.cloud).
{% endhint %}

Extensions PHP nécessaires :

* `curl` (envoi des inventaires à GLPI) ;
* `sqlsrv` et `pdo_sqlsrv` (connexion à la base SQL Server de SCCM), avec le pilote Microsoft ODBC pour SQL Server (`msodbcsql18`).

  **Note :** depuis la version 2.5.1, le prérequis sur la fonction `mssql_connect` a été supprimé. Les extensions `sqlsrv` et `pdo_sqlsrv` de Microsoft sont celles à utiliser.

### Installer les extensions `sqlsrv` et `pdo_sqlsrv`

#### **Serveur Ubuntu**

```bash
sudo apt update
sudo apt install -y php-dev php-pear build-essential unixodbc-dev gnupg2 curl

curl -sSL -O https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt update
sudo ACCEPT_EULA=Y apt install -y msodbcsql18 mssql-tools18

sudo pecl install sqlsrv pdo_sqlsrv

PHPVER=$(php -r 'echo PHP_MAJOR_VERSION.".".PHP_MINOR_VERSION;')
echo "extension=sqlsrv.so" | sudo tee /etc/php/$PHPVER/mods-available/sqlsrv.ini
echo "extension=pdo_sqlsrv.so" | sudo tee /etc/php/$PHPVER/mods-available/pdo_sqlsrv.ini
sudo phpenmod -v $PHPVER sqlsrv pdo_sqlsrv

sudo systemctl restart apache2   # ou php$PHPVER-fpm
php -m | grep -i sqlsrv
```

#### **GLPI sous Docker**

L'image officielle `glpi/glpi` ne contient pas ces extensions. Construisez votre propre image à partir de celle-ci. Créez un fichier `Dockerfile` à côté de votre `docker-compose.yml` :

<pre class="language-dockerfile"><code class="lang-dockerfile"><a data-footnote-ref href="#user-content-fn-1">FROM glpi/glpi:latest</a>

USER root

ENV ACCEPT_EULA=Y

RUN . /etc/os-release \
    &#x26;&#x26; apt-get update &#x26;&#x26; apt-get install -y --no-install-recommends \
        $PHPIZE_DEPS curl gnupg2 ca-certificates unixodbc-dev \
    &#x26;&#x26; curl -fsSL -o /tmp/ms.deb "https://packages.microsoft.com/config/debian/${VERSION_ID}/packages-microsoft-prod.deb" \
    &#x26;&#x26; dpkg -i /tmp/ms.deb &#x26;&#x26; rm /tmp/ms.deb \
    &#x26;&#x26; apt-get update \
    &#x26;&#x26; apt-get install -y msodbcsql18 \
    &#x26;&#x26; pecl install sqlsrv pdo_sqlsrv \
    &#x26;&#x26; docker-php-ext-enable sqlsrv pdo_sqlsrv \
    &#x26;&#x26; apt-get purge -y $PHPIZE_DEPS \
    &#x26;&#x26; apt-get autoremove -y &#x26;&#x26; apt-get clean \
    &#x26;&#x26; rm -rf /var/lib/apt/lists/* /tmp/pear

USER www-data
</code></pre>

Puis, dans le `docker-compose.yml`, remplacez la ligne `image: "glpi/glpi:latest"` du service `glpi` par `build: .` :

<pre class="language-dockerfile"><code class="lang-dockerfile">services:
  glpi:
    build: .
    restart: "unless-stopped"
    volumes:
      <a data-footnote-ref href="#user-content-fn-2">- ./storage/glpi:/var/glpi</a>
    env_file: .env
    ports:
      - "80:80"
</code></pre>

Construisez et lancez :

```bash
docker compose build --pull glpi
docker compose up -d
docker compose exec glpi php -m | grep -i sqlsrv
```

Les extensions `pdo_sqlsrv` et `sqlsrv` doivent apparaître. Pour mettre à jour GLPI, relancez `docker compose build --pull glpi` : une image construite localement ne se met pas à jour avec `docker compose pull`.

{% hint style="info" %}
Le pilote ODBC 18 impose le chiffrement TLS. Avec un serveur SQL au certificat auto-signé, la connexion peut être refusée : installez un certificat valide ou décochez l'option **Verify SSL certificate** de la configuration (voir ci-dessous).
{% endhint %}

***

## Installation du plugin

1. Télécharger le plugin depuis le marketplace
2. Puis **installez** et **activez** le plugin SCCM.

<div align="left"><figure><img src="https://782257568-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJFKLcURHvFBybgf5dths%2Fuploads%2FgxgbkvVNUFT546Du874d%2Fplugin-sccm.png?alt=media&amp;token=cec5f6f1-04ba-422d-9626-86f7ea811ee7" alt=""><figcaption></figcaption></figure></div>

***

## Configuration

* La configuration s’effectue dans **Configuration > SCCM**.
* Cliquez sur **+** **Ajouter** pour créer une configuration (le plugin gère un élément de configuration par serveur SCCM).

<figure><img src="https://782257568-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJFKLcURHvFBybgf5dths%2Fuploads%2FLnnzVmBBiz7EMFIFSJTa%2Fsccm-configuration.png?alt=media&amp;token=fc88a127-4931-4382-aeb7-0eb91f5fe22d" alt=""><figcaption><p>Formulaire de configuration du plugin SCCM</p></figcaption></figure>

### Identification

| Champ                      | Description                                       |
| -------------------------- | ------------------------------------------------- |
| **Name**                   | Nom de la configuration.                          |
| **Comments**               | Commentaires libres.                              |
| **Enable synchronization** | Active la synchronisation de cette configuration. |

### Connexion à la base SCCM

| Champ                       | Description                                                                            |
| --------------------------- | -------------------------------------------------------------------------------------- |
| **Server hostname (MSSQL)** | Nom ou adresse du serveur SQL Server qui héberge la base de SCCM.                      |
| **Database name**           | Nom de la base de données SCCM.                                                        |
| **Username**                | Compte utilisé pour se connecter à la base. Un compte en lecture seule suffit.         |
| **Password**                | Mot de passe du compte. La case **Clear** permet d'effacer le mot de passe enregistré. |
| **Collection name**         | Nom de la collection SCCM à synchroniser. Laisser vide pour collecter tous les postes. |

#### Envoi vers l'inventaire GLPI

<table data-search="false"><thead><tr><th>Champ</th><th>Description</th></tr></thead><tbody><tr><td><strong>Inventory server base URL</strong></td><td>URL de base de GLPI vers laquelle les fichiers XML sont envoyés, <strong>sans</strong> <code>/front/inventory.php</code> : le plugin ajoute ce chemin lui-même (le texte rouge sous le champ affiche l'URL complète qui sera appelée). Laisser vide pour utiliser l'URL de GLPI (<code>url_base</code>). Cette URL doit être joignable <strong>depuis le serveur GLPI lui-même</strong> (exemple : <code>http://localhost</code>).</td></tr><tr><td><strong>Verify SSL certificate</strong></td><td>Active la vérification des certificats, à la fois pour la connexion à SQL Server et pour l'envoi HTTPS vers GLPI. Cocher l'option uniquement si le serveur SQL a un certificat valide (décocher pour un certificat auto-signé)</td></tr><tr><td><strong>Use NTLM authentication</strong></td><td>Utilise l'authentification NTLM lors de l'envoi vers l'inventaire.</td></tr><tr><td><strong>Send credentials to other hosts too</strong></td><td>Autorise l'envoi des identifiants à d'autres hôtes (option cURL « unrestricted auth »). À n'activer que si nécessaire.</td></tr><tr><td><strong>Use specific authentication information</strong></td><td>Envoie des identifiants lors de l'envoi vers l'inventaire. À cocher dès que l'inventaire de GLPI exige une authentification (voir plus bas).</td></tr><tr><td><strong>Value for specific authentication</strong></td><td>Identifiants au format <code>login:mot_de_passe</code>, transmis tels quels à cURL. Ils doivent correspondre à ceux définis dans la configuration de l'inventaire de GLPI. La case <strong>Clear</strong> permet d'effacer la valeur enregistrée.</td></tr></tbody></table>

### Date d'inventaire

| Champ                                          | Description                                                                      |
| ---------------------------------------------- | -------------------------------------------------------------------------------- |
| **Use LastHWScan as GLPI last inventory date** | Utilise la date `LastHWScan` de SCCM comme date de dernier inventaire dans GLPI. |

Une fois les champs renseignés, cliquez sur **Ajouter**. Sur une configuration existante, le bouton **Test connection** vérifie la connexion à SQL Server (il ne teste pas l'envoi vers l'inventaire).

***

## Activer l'inventaire natif de GLPI

Avant la première synchronisation, dans **`Configuration`** > **`Inventaire`** :

* cochez **Inventaire activé**. Sinon, GLPI répond `403 Forbidden` à tous les envois ;
* **En-tête d'autorisation**

  * **GLPI 11** : valeur par défaut `Aucun` ;
  * **GLPI 12** : aucune valeur par défaut, le champ est obligatoire et les envois sont refusés tant qu'aucune méthode n'est choisie ; les choix sont `OAuth - Client credentials`, `Authentification basique`, `Aucune (non recommandé)`.

  Le plugin **ne gère pas OAuth** : choisissez **Authentification basique** (recommandé) et reporter l'identifiant et le mot de passe dans le plugin, ou `Aucune`(non recommandé).

***

## Fonctionnement

<figure><img src="https://782257568-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJFKLcURHvFBybgf5dths%2Fuploads%2FKFKKzrNrN7WOic0lL1S1%2Fsccm-workflow%201.png?alt=media&amp;token=ffb1a7be-7ba3-4922-89be-c2cc372be7fd" alt=""><figcaption></figcaption></figure>

Schéma du flux de synchronisation entre SCCM et GLPI

1. Le plugin interroge le serveur SCCM avec des requêtes MSSQL.
2. Il génère un fichier XML par ordinateur, au format d'inventaire GLPI.
3. Il envoie ces fichiers à l'inventaire natif de GLPI en HTTP(S) via cURL.

Ces étapes sont exécutées par deux **actions automatiques** du plugin, visibles dans **`Configuration` > `Actions automatiques`** :

| Action          | Rôle                                                    | Planification par défaut           |
| --------------- | ------------------------------------------------------- | ---------------------------------- |
| **SCCMCollect** | Interroge SQL Server et écrit un fichier XML par poste. | Tous les 7 jours, entre 4 h et 5 h |
| **SCCMPush**    | Envoie les fichiers XML à l'inventaire de GLPI.         | Tous les 7 jours, entre 6 h et 7 h |

Ces actions sont en mode **externe** : elles ne se déclenchent pas par l'activité web, mais par le planificateur de GLPI lancé en ligne de commande (`php front/cron.php`, via cron ou, avec l'image Docker officielle, son worker intégré). Pour tester, ouvrez l'action et cliquez sur **Exécuter**, en lançant d'abord SCCMCollect puis SCCMPush . Les journaux sont dans [`files/_log/sccm.log`](#user-content-fn-3)[^3] (lignes `Push OK` / `Push KO`).

{% hint style="info" %}
**`SCCMPush`** relance la requête SQL des postes et n'envoie que ceux encore présents dans SCCM (ou dans la collection)
{% endhint %}

### Flux réseau nécessaires

Tous les échanges sont initiés par le **serveur GLPI**. SCCM n'ouvre aucune connexion vers GLPI, et GLPI n'a pas besoin de joindre les postes.

| # | Source       | Destination                 | Protocole et port                                                           | Rôle                                                                                                                                              |
| - | ------------ | --------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1 | Serveur GLPI | Serveur SQL Server de SCCM  | TCP **1433** par défaut (autre port : `hôte,port` dans **Server hostname**) | Requêtes SQL en lecture sur la base SCCM. Authentification par compte SQL, chiffrement TLS (ODBC 18). SCCMCollect **et** SCCMPush s'y connectent. |
| 2 | Serveur GLPI | Serveur GLPI (lui-même)     | HTTP **80** ou HTTPS **443**, vers `<URL de base>/front/inventory.php`      | Envoi des fichiers XML (`POST`, `Content-Type: text/xml`). Les redirections ne sont **pas** suivies.                                              |
| 3 | Serveur GLPI | Serveur GLPI (disque local) | Système de fichiers                                                         | Les XML sont écrits puis relus dans `files/_plugins/sccm/xml/<id de la configuration>/`.                                                          |
| 4 | Serveur GLPI | Base de données GLPI        | TCP 3306 (MySQL/MariaDB)                                                    | Intégration des postes dans GLPI (flux habituel de GLPI).                                                                                         |

Points d'attention :

* **Flux 1** : si le serveur SQL utilise une instance nommée, le port dynamique est annoncé par le service SQL Server Browser (UDP 1434). Préférez un port fixe. Le compte SQL n'a besoin que de droits de lecture (`SELECT`) sur la base SCCM.
* **Flux 2** : le plugin appelle GLPI **depuis le serveur GLPI**. L'URL de base doit donc être joignable de l'intérieur, ce qui n'est pas toujours le cas de l'URL publique (reverse proxy, port publié par Docker). Dans un conteneur, utilisez par exemple `http://localhost`. Comme les redirections ne sont pas suivies, n'indiquez pas une URL en HTTP qui redirige vers HTTPS : utilisez directement l'URL HTTPS finale.
* **Flux 3** : SCCMCollect et SCCMPush doivent voir le même dossier `files` (même serveur, ou volume partagé). Avec Docker, ce dossier est dans le volume monté sur `/var/glpi`.
* **Aucun autre flux** : le plugin n'utilise ni l'API de la console SCCM, ni SMB, ni WMI, ni accès Internet.

### Données collectées

Selon la disponibilité des données sur le serveur SCCM, le plugin collecte pour chaque ordinateur :

* **Ordinateur :** nom, dernier utilisateur connecté, UUID, nom d'utilisateur, domaine, numéro de série
* **Système d'exploitation :** nom, architecture, version, service pack
* **BIOS :** tag, modèle, type, fabricant, numéro de série, date d'installation, version
* **Processeur (CPU) :** description ou nom, fabricant, fréquence, architecture, nombre de cœurs et de threads
* **Logiciels :** nom, version, éditeur, date d'installation
* **Mémoire (RAM) :** capacité, description, fréquence, type
* **Carte graphique :** nom, chipset, mémoire
* **Carte son :** nom, fabricant
* **Carte réseau :** nom, adresse MAC, adresses IP (v4 et v6)
* **Partitions de disque :** nom, type de montage, taille totale, l'espace libre et le système de fichiers
* **Lecteurs optiques** **CD/DVD** : nom, modèle, fabricant, type

***

## Dépannage

* **`could not find driver` ou extension introuvable :** vérifiez avec `php -m | grep -i sqlsrv` que `sqlsrv` et `pdo_sqlsrv` sont chargés dans le PHP utilisé par GLPI (et non seulement en ligne de commande).
* **Erreur de certificat SSL à la connexion :** avec un certificat auto-signé, décochez **Verify SSL certificate**, ou installez un certificat valide.
* **Mot de passe non conservé :** corrigé dans la version 2.5.1 du plugin. Mettez le plugin à jour.
* **Option « Verify SSL certificate » sans effet :** corrigé dans la version 2.5.1.
* **Codes 401 / 403** : Un envoi n'est compté `Push OK` que sur une réponse HTTP 200 ; sinon `Push KO - <id> -> STATUS: <code>` suivi du corps de la réponse
* En cas d'erreur SQL :
  * Erreur de requête SQL : Collect ERROR: Query error: Array (...), avec le détail SQL Server (inc/sccmdb.class.php:80).
  * Échec de connexion : Cannot connect to SCCM database, précédé de lignes SQLSTATE / Code / Message (FormatErrors, inc/sccmdb.class.php:86).
* En cas d’injoignabilité de GLPI (DNS, TLS, refus de connexion,etc.) le journal affiche `cURL error: <message>, et non Push KO (inc/sccm.class.php:629)`.

[^1]: Pour GLPI 11 :\
    FROM glpi/glpi:11.0

[^2]: A modifier selon votre configuration

[^3]: Pour une installation classique, peut différer de votre installation. Peux se trouver dans `/var/glpi/logs/sccm.log` pour Docker


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://help.glpi-project.org/doc-plugins/fr/plugins-glpi/sccm.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
