Salut tout le monde, voici le code que j'utilise pour récupérer la liste des comptes actifs de l'Active Directory :
Et je l'appelle ainsi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 procedure RemplirUserSessionList( aList : TStrings ); var Container : IADsContainer; e : IEnumVARIANT; varArr : OleVariant; lNumElements : ULong; obj : IADs; hr : Integer; NomOrdinateur : string; User : IADsUser; begin // CoInitialize( nil ); Container := nil; NomOrdinateur := GetNomOrdinateur; ADsGetObject( 'WinNT://' + NomOrdinateur, IADsContainer, Container ); Container.Filter := VarArrayOf( [ 'user' ] ); hr := ADsBuildEnumerator( Container, e ); while Succeeded( Hr ) do begin hr := ADsEnumerateNext( e, 1, varArr, lNumElements ); if lNumElements = 0 then Break; IDispatch( varArr ).QueryInterface( IADs, obj ); if obj <> nil then begin ADsGetObject( 'WinNT://' + NomOrdinateur + '/' + obj.Name, IADsUser, User ); if not User.AccountDisabled then // Le compte n'est pas disabled if not User.IsAccountLocked then // Le compte n'est pas locked if ( User.Get( 'userFlags' ) and ADS_UF_PASSWD_CANT_CHANGE ) = 0 then // Le user peut changer son mot de passe aList.Add( obj.Name ); end; varArr := varEmpty; end; // User._Release; // obj._Release; // Container._Release; // CoUninitialize; end;
Lorsque je l'exécute, j'ai un message d'erreur à la ligne ShowMessage( slUser.Commatext ); si j'essaie d'afficher le Count ou autre chose de la slUser, ça met le message d'erreur, d'ailleurs si je n'affiche pas le ShowMessage, j'ai le message d'erreur sur le Free.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 procedure Test; var slUser : TStringList; begin slUser := TStringList.Create; RemplirUserSessionList( slUser ); ShowMessage( slUser.Commatext ); slUser.Free; end;
Le message d'erreur est :
J'ai essayé en rajoutant/supprimant des CoInitialize( nil ); / CoUninitialize;---------------------------
Notification d'erreur du débogueur
---------------------------
Echec du projet C:\Travail\MyReport5\MyReport5.5.0\Data5.exe avec le message : 'violation d'accès à 0x87d03020 : lecture de l'adresse 0x87d03020'. Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer.
---------------------------
OK
---------------------------
En appelant des ._Release; ou pas mais j'ai toujours cette erreur.
Ce qui est bizarre est que ma StringList est bien instanciée, dans le code RemplirUserSessionList, elle est bien instanciée et si j'affiche un commatext, cela fonctionne. Elle perd son instanciation à la sortie de la procédure, comme si un objet se libérait et au lieu de se libérer, il libérait la StringList.
Merci pour votre aide car je ne trouve pas.
Partager