Utiliser Python pour administrer Samba-AD
Vous trouverez la documentation officielle de l’api sur le site de samba.
Note
L’API Python de Samba est basée sur Python 3.6 ou plus.
Importer les librairies Python nécessaires
#!/usr/bin/python
# -*- coding: utf-8 -*-
import getpass
import ldb
from samba.auth import system_session
from samba.credentials import Credentials
from samba.dcerpc import security
from samba.dcerpc.security import dom_sid
from samba.ndr import ndr_pack, ndr_unpack
from samba.param import LoadParm
from samba.samdb import SamDB
Créer les classes Python qui vous seront utiles
Pour l’ouverture d’une connexion en mode LDAP (accès en réseau):
lp = LoadParm() creds = Credentials() creds.guess(lp) creds.set_username('user_account_name') creds.set_password('my_super_password') samdb = SamDB(url='ldap://127.0.0.1:389', session_info=system_session(),credentials=creds, lp=lp)
Pour l’ouverture d’une connection en direct sur la base LDB (accès direct aux fichiers de base LDB):
lp = LoadParm() creds = Credentials() creds.guess(lp) samdb = SamDB(url='/var/lib/samba/private/sam.ldb', session_info=system_session(),credentials=creds, lp=lp)
Agir sur les Unités Organisationnelles
Supprimer une Unité Organisationnelle
def delete_ou(samdb, dn):
samdb.transaction_start()
try:
samdb.delete(dn)
except:
samdb.transaction_cancel()
raise
else:
samdb.transaction_commit()
delete_ou(samdb,'OU=department,OU=city,DC=mydomain,DC=lan')
Créer une Unité Organisationnelle
samdb.create_ou('OU=department,OU=city,DC=mydomain,DC=lan')
Agir sur les utilisateurs
Créer un utilisateur
samdb.newuser(username="test-toto",password='password')
Supprimer un utilisateur
samdb.deleteuser(username="jpdrole")
Définir le mot de passe d’un utilisateur
samdb.setpassword("(sAMAccountName=test-toto)", "123456", force_change_at_next_login=False, username=None)
Déplacer un utilisateur dans une autre Unité Organisationnelle
samdb.rename('CN=test-toto,CN=Users,DC=mydomain,DC=lan','CN=test-toto,OU=tata,OU=tranquilit,DC=mydomain,DC=lan')
Agir sur les groupes
Créer un groupe
samdb.newgroup(groupname='waptselfservice')
Ajouter un utilisateur ou une machine à un groupe
samdb.add_remove_group_members(groupname='waptselfservice', members=['test-toto','dcardon','vcardon'], add_members_operation=True)
Supprimer un utilisateur ou une machine d’un groupe
samdb.add_remove_group_members(groupname='waptselfservice', members=['test-toto','dcardon','vcardon'], add_members_operation=False)
Rechercher des objets dans une forêt Active Directory Samba
Afficher tous les objets user, group, computer
query = "(|(objectclass=user)(objectclass=computer)(objectclass=group))"
result = samdb.search('DC=mydomain,DC=lan', expression=query, scope=ldb.SCOPE_SUBTREE)
for item in result:
if 'sAMAccountName' in item:
print(item['distinguishedName'])
print(item['sAMAccountName'])
Rechercher un objet par son sAMAccountName
query = ("(sAMAccountName=test-toto)")
result = samdb.search('DC=mydomain,DC=lan', expression=query, scope=ldb.SCOPE_SUBTREE)
Agir sur les attributs
Modifier un attribut
Avertissement
Attention à l’indentation. La deuxième ligne de la string LDIF (ici changetype) et toutes les lignes suivantes ne doivent pas être indentées comme on le fait habituellement en Python, car les parsers LDIF n’accepte pas des espaces en début de ligne.
ldif_data = """dn: %s
changetype: modify
replace: mail
mail: test-toto@tranquil.it
""" % dn
samdb.modify_ldif(ldif_data)
Ajouter un attribut
Avertissement
Attention à l’indentation. La deuxième ligne de la string LDIF (ici changetype) et toutes les lignes suivantes ne doivent pas être indentées comme on le fait habituellement en Python, car les parsers LDIF n’accepte pas des espaces en début de ligne.
ldif_data = """dn: CN=test-toto,OU=tata,OU=tranquilit,DC=mydomain,DC=lan
changetype: modify
add: telephoneNumber
telephoneNumber: 0102030405
"""
samdb.modify_ldif(ldif_data)