Code : MO-AD-001 | Version : 1.1 | Date : 28 mars 2026 | Auteur : C. Legrand
Ce mode opératoire décrit comment administrer les contrôleurs de domaine Active Directory (Windows Server 2022) de l'infrastructure BTS SIO depuis un poste Linux, sans recourir au Bureau à distance (RDP).
L'approche repose sur deux outils complémentaires : le toolkit impacket (protocoles SMB, WMI, RPC, DCOM) et la bibliothèque pywinrm (protocole WinRM). Combinés à smbclient pour le transfert de fichiers, ces outils permettent d'exécuter des commandes à distance, d'interroger l'annuaire Active Directory et de gérer les partages réseau depuis un terminal Linux.
| Public concerné | Enseignants BTS SIO, administrateurs |
| Systèmes cibles | DC1 (10.0.112.2), DC2 (10.0.112.3) — Windows Server 2022 |
| Poste d'administration | Tout poste Linux connecté au réseau BTS SIO |
| Durée estimée | 10 min (installation), 5 min (connexion) |
pip3smbclient installé (apt install smbclient)pywinrm pour l'accès WinRM (pip3 install pywinrm)| Machine | Adresse IP | Rôle | État |
|---|---|---|---|
| DC1 | 10.0.112.2 | Contrôleur de domaine principal, DNS, DHCP | Fonctionnel |
| DC2 | 10.0.112.3 | Contrôleur de domaine secondaire | WMI défaillant |
| Port | Protocole | Usage |
|---|---|---|
| 135 | TCP | RPC Endpoint Mapper (nécessaire pour WMI/DCOM) |
| 445 | TCP | SMB (partages réseau, transferts de fichiers) |
| 5985 | TCP | WinRM HTTP (actif sur DC1 et DC2, cf. section 5.7) |
Note : WMI utilise le port 135 pour la négociation initiale, puis un port dynamique (49152-65535).
pip3 install impacket
Vérifier :
pip3 show impacket
wmiexec.py --help

Si wmiexec.py n'est pas trouvé :
export PATH="$HOME/.local/bin:$PATH"
Syntaxe générale :
wmiexec.py 'DOMAINE/Utilisateur:motdepasse@IP' 'commande'
Test de connexion :
wmiexec.py 'BTS/Administrateur:MOT_DE_PASSE@10.0.112.2' 'hostname'

Attention : Ne jamais stocker les identifiants en clair dans un script. Préfixer la commande d'un espace pour éviter l'historique bash (si
HISTCONTROL=ignorespace).
Préfixer avec powershell -Command :
wmiexec.py 'BTS/Administrateur:MOT_DE_PASSE@10.0.112.2' \
'powershell -Command "(Get-ADUser -Filter *).Count"'

Astuce : Pour les commandes longues, créer un script .ps1 sur le DC (via smbclient) et l'exécuter :
powershell -ExecutionPolicy Bypass -File C:\Scripts\audit-ad.ps1
Sans correction, les accents sont mal affichés (encodage cp850 de cmd.exe). Ajouter -codec cp850 :
wmiexec.py -codec cp850 'BTS/Administrateur:MOT_DE_PASSE@10.0.112.2' 'net user'

Note : cp850 est l'encodage par défaut de cmd.exe en français. Pour PowerShell, l'encodage est généralement UTF-8 et ne nécessite pas cette option.
Lister les partages :
smbclient -L //10.0.112.2 -U 'BTS\Administrateur%MOT_DE_PASSE'

Se connecter à un partage :
smbclient //10.0.112.2/C$ -U 'BTS\Administrateur%MOT_DE_PASSE'
Commandes disponibles :
ls # Lister le contenu
cd Windows\NTDS # Changer de répertoire
get ntds.dit # Télécharger un fichier
put script.ps1 # Envoyer un fichier
exit # Fermer la connexion

DC2 (10.0.112.3) a un service WMI défaillant. Alternatives impacket :
smbexec.py (via le gestionnaire de services SCM) :
smbexec.py 'BTS/Administrateur:MOT_DE_PASSE@10.0.112.3'
Alternative la plus fiable quand WMI est défaillant.
psexec.py (upload d'un service temporaire) :
psexec.py 'BTS/Administrateur:MOT_DE_PASSE@10.0.112.3'
atexec.py (via le planificateur de tâches) :
atexec.py 'BTS/Administrateur:MOT_DE_PASSE@10.0.112.3' 'hostname'
Attention : psexec.py dépose un binaire temporaire et crée un service Windows (Event ID 7045). Préférer smbexec.py en situation normale.
WinRM (Windows Remote Management) est le protocole natif de gestion à distance de Windows, basé sur WS-Management. Contrairement à WMI/DCOM, il utilise un seul port TCP (5985) et fonctionne même lorsque WMI est défaillant --- ce qui en fait la méthode privilégiée pour DC2.
Installer pywinrm :
pip3 install pywinrm
Tester la connexion WinRM :
import winrm
s = winrm.Session('10.0.112.3',
auth=('BTS\\Administrateur', 'MOT_DE_PASSE'),
transport='ntlm')
r = s.run_cmd('hostname')
print(r.std_out.decode())

Exécuter des commandes PowerShell via WinRM :
Utiliser run_ps() au lieu de run_cmd() :
import winrm
s = winrm.Session('10.0.112.3',
auth=('BTS\\Administrateur', 'MOT_DE_PASSE'),
transport='ntlm')
r = s.run_ps('Get-Service | Where-Object {$_.Status -eq "Running"} | Select-Object -First 5')
print(r.std_out.decode())

Shell interactif avec la commande bts :
# Connexion directe via WinRM
bts winrm dc2
# Ou bien :
bts dc2 # puis choisir 1) WinRM
WinRM vs WMI --- comparaison :
WMI (impacket) WinRM (pywinrm) Port 135 + dynamique (49152-65535) 5985 uniquement Protocole DCOM/RPC WS-Management (HTTP) Cache creds Oui Non Shell interactif Oui ( wmiexec.py)Oui ( bts winrm)
Quand utiliser WinRM : Privilégier WinRM quand WMI/DCOM est indisponible (cas de DC2), quand le pare-feu ne laisse passer qu'un port unique (5985), ou pour éviter la mise en cache de credentials sur la cible.
wmiexec.py accessible-codec cp850 corrige les accentssmbclient liste les partages de DC1smbexec.pypywinrm est installée (pip3 show pywinrm)bts winrm dc2 puis hostname)| Problème | Solution |
|---|---|
STATUS_LOGON_FAILURE |
Vérifier domaine (BTS), utilisateur et mot de passe |
| Timeout / connection refused | Vérifier connexion réseau BTS SIO ou VPN |
| Erreur DCOM / WMI | Utiliser smbexec.py ou WinRM (cf. sections 5.6 et 5.7) |
| Accents mal affichés | Ajouter -codec cp850 |
| Permission denied sur partage | Vérifier que le compte est Admins du domaine |
wmiexec.py: command not found |
Ajouter ~/.local/bin au PATH |
WinRM : ConnectionError ou ReadTimeout |
Vérifier que le port 5985 est ouvert : timeout 5 bash -c 'echo > /dev/tcp/IP/5985'. Vérifier que le service WinRM est démarré (sc query WinRM). |
WinRM : InvalidCredentialsError |
Vérifier les identifiants. Utiliser le format DOMAINE\\utilisateur. |