Hide navigation sidebar
Hide table of contents sidebar
Skip to content
SAMBA 4.22
Back to top
View this page
Toggle table of contents sidebar

# 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)