2014-05-15 3 views
2

J'ai un programme qui permet de se connecter en utilisant les fenêtres les informations de connexion, et je suis en train d'obtenir les groupes de fenêtres membres lorsque l'utilisateur d'entrer son mot de passe, j'ai écrit une petite fonction similaire à mon code:ADSI ne peut pas ouvrir l'objet à l'aide de ADsOpenObject. Delphi

procedure ShowADSPath(UserName, Password: widestring); 
var Group : IADs; 
begin 
    try 
     OleCheck(ADsOpenObject('WinNT://Server/Group1', 
     UserName, 
     Password, ADS_SECURE_AUTHENTICATION, IADs, Group)); 
     if (Group <> nil) and (Group.Class_ = 'Group') then 
     ShowMessage(Group.ADsPath); 
     Group.release; 
     Group:= nil; 
    except 
    ShowMessage('NOT ACCESSDE'); 
    end; 
end; 

Ainsi, lorsque le nom d'utilisateur et le mot de passe saisis sont corrects, le programme renvoie le chemin du groupe lorsque le message 'NON ACCES' s'affiche.

la fonction fonctionne bien si je saisis le bon nom d'utilisateur et mot de passe pour la première fois, ou si j'entre un mauvais nom d'utilisateur et mot de passe, cela fonctionne bien aussi.

le problème est quand je l'appelle la fonction deuxième fois, il ne fonctionne pas comme prévu comme:

quand je lance mon programme et d'abord j'entrer un mot de passe erroné et appeler ma fonction « NON accessed » apparaît comme prévu , mais si je me souviens de la fonction, même avec le bon mot de passe, elle renvoie aussi 'NON ACCES'.

Aussi quand j'exécute mon programme et d'abord j'entre le mot de passe juste et appelez ma fonction le chemin de groupes apparaît comme prévu, mais si je me rappelle la fonction avec le mot de passe incorrect il renvoie également le chemin.

il semble que mes données de connexion aient été sauvegardées, et j'ai besoin de libérer de la mémoire mais je ne sais pas comment.

tout organisme peut vous aider?

Répondre

0

Enfin je pourrais trouver une solution à mon problème, qui ressemble à un problème de l'API Microsoft décrit dans cet article: http://support.microsoft.com/kb/218497

fait la fonction API ADsOpenObject ouvre une connexion avec le serveur en utilisant les informations d'identification passer mais il ne ferme jamais cette connexion, j'ai essayé de le fermer mais il ne s'est pas rapproché de la session, donc j'ai utilisé une autre API pour vérifier l'existence de l'objet, vérifier cela:

procedure ShowADSPath(UserName, Password: widestring); 
    function CheckObject(APath: String): IDispatch; 
    var 
     Moniker: IMoniker; 
     Eaten: integer; 
     BindContext: IBindCtx; 
     Dispatch: IDispatch; 
    begin 
     Result := nil; 
     OleCheck(CreateBindCtx(0, BindContext)); 
     OleCheck(MkParseDisplayName(BindContext, PWideChar(WideString(APath)), 
             Eaten, Moniker)); 
     OleCheck(Moniker.BindToObject(BindContext, nil, IDispatch, Dispatch)); 

     Result := Dispatch; 
    end; 
var Group : IADs; 
begin 
    try 
    if CheckObject('WinNT://Server/Group1,group') <> nil then 
     OleCheck(ADsOpenObject('WinNT://Server/Group1,group', 
      UserName, 
      Password, ADS_SECURE_AUTHENTICATION, IADs, Group)); 
     if (Group <> nil) and (Group.Class_ = 'Group') then 
     begin 
     ShowMessage(Group.ADsPath); 
     Group.release; 
     Group:= nil; 
     end; 
    except 
    ShowMessage('NOT ACCESSDE'); 
    end; 
end; 
Questions connexes