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)