TLDAPSearch - Exemples

TLDAPEntryList = class (TObject)Interface de TLDAPEntryListExemples de TLDAPEntryList
TLDAPSearch = class (TObject)Interface de TLDAPSearchExemples de TLDAPSearch

Exemple de programme permettant de mettre à jour la liste des utilisateurs à partir des données contenues dans le LDAP.
Dans cet exemple, les utilisateurs sont créés si ils n'existent pas dans Qubes

var ldapSearch : TLDAPSearch;
var ldapEntryList : TLDAPEntryList;
var ldapEntry : TLDAPEntry;
var i : Integer;
var userLogin, userFirstName, userLastName : String;
var user : TUser;

// Connection au LDAP de l'entreprise
ldapSearch:=TLDAPSearch.connect('zeus',389, 'CN=Qubes Account,CN=Users,DC=CIT,DC=local', 'shaka');
ldapEntryList:=TLDAPEntryList.Create;

// Recherche dans le LDAP de l'entreprise des utilisateurs (objectClass=person)
ldapSearch.Search(ldapEntryList, 'OU=CIT,DC=cit,DC=local', '(objectClass=person)');

for i:=0 to ldapEntryList.Count-1 do begin
   ldapEntry := ldapEntryList.GetITEM(i);
   userLogin:=ldapEntry.AttributeValueByName('sAMAccountName', 0);
   userFirstName:=ldapEntry.AttributeValueByName('givenName', 0);
   userLastName:=ldapEntry.AttributeValueByName('sn', 0);
   if not UserExists(userLogin) then begin
      // Création d'un nouvel utilisateur (LOGIN doit être inférieur à 12 caractères)
      if Length(userLogin)<=12 then
         user:=TUser.CreateNew(userLogin, userLastName, userFirstName)
      else begin
         // LOGIN trop long, ignoré
         continue;
      end;
   end else begin
      // Mise à jour de l'utilisateur
      user:=TUser.Connect(userLogin);
      user.FirstName:=userFirstName;
      user.LastName:=userLastName;
   end;

   user.ContractType:='CDI'; //CDI,CDD,Intérimaire,Prestataire,Contrat de Qualification,Stagiaire
   user.ManagerLogin:='pr';
   user.MainSite:='ECL';
   user.MainService:='COM';

   // Ajout d'une fonction existante dans le LDAP non renseignée dans Qubes
   if not user.HasSiteServiceFunction('ECL', 'COM', 'IC') then
      user.AddFunction('IC', 'ECL', 'COM');
   // Suppression d'une fonction renseignée dans Qubes qui n'existe pas dans le LDAP
   if user.HasSiteServiceFunction('ECL', 'COM', 'SEC') then
      user.RemoveFunction('SEC', 'ECL', 'COM');
   user.SetTypeMessagerie('SMTP'); // SMTP,QUBES
   user.SetSMTPMail(userFirstName+'.'+userLastName+'@acme.net');
   user.SetLDAPLogin(userLogin);
   user.SetUseLDAPAuth(True);
   user.SetADSPath('-');
end;

Cet exemple permet de consulter la liste des informations contenues dans le LDAP pour les utilisateurs du domaine CIT.

var lds : TLDAPSearch;
var lst : TLDAPEntryList;
var ent : TLDAPEntry;
var s : TStrings;
var i, j  : Integer;

s := TStrings.create;
lds := TLDAPSearch.connect('zeus',389, 'CN=Qubes Account,CN=Users,DC=CIT,DC=local', '*****'); // Remplacer ***** par le mot de passe de l'utilisateur

lst := TLDAPEntryList.create;
lds.Search(lst, 'OU=CIT,DC=cit,DC=local', '(objectClass=*)');

for i := 0 to lst.count-1 do begin
   ent := lst.GetITEM(i);
   s.Add('*****************');
   s.add(ent.getDN);
   for j := 0 to ent.AttributesCount-1 do begin
      s.add(ent.AttributeName(j)+'='+ent.AttributeValueByIndex(j,0));
   end;
   s.Add('*****************');
end;

Print(s.text);

Exemple de données que l'on peut ainsi retrouver en interrogeant l'annuaire LDAP (Attention, l'utilisation de certains champs peut varier d'un annuaire LDAP à l'autre) :

objectClass=top
cn=Georges DUPONT
sn=DUPONT
givenName=Georges
distinguishedName=CN=Georges DUPONT,OU=CIT,DC=CIT,DC=local
instanceType=4
whenCreated=20080905134118.0Z
whenChanged=20090717074759.0Z
displayName=Georges DUPONT
uSNCreated=1333892
memberOf=CN=CIT,OU=CIT,DC=CIT,DC=local
uSNChanged=1530937
name=Georges DUPONT
userAccountControl=512
badPwdCount=0
codePage=0
countryCode=0
badPasswordTime=0
lastLogoff=0
lastLogon=0
pwdLastSet=128650956794218750
primaryGroupID=513
accountExpires=9223372036854775807
logonCount=0
sAMAccountName=gdupont
sAMAccountType=805306368
[email protected]
objectCategory=CN=Person,CN=Schema,CN=Configuration,DC=CIT,DC=local
dSCorePropagationData=20090528103736.0Z
lastLogonTimestamp=128922904791875000

La fonction suivante permet de décoder les champs active directory suivant : pwdLastSet, accountExpires, LastLogon, LastLogonTimestamp and LastPwdSet

function ConvertADLDAPDate(aMSLDAPdate : integer) : Float;
var epoch : integer;
begin
   epoch := (aMSLDAPdate div 10000000) - 11644473600;
   result :=   (epoch/86400)+25569;
end;