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)