Einzelnen Beitrag anzeigen

Markus
(Gast)

n/a Beiträge
 
#1

Mächtiges Problem mit ADSI...

  Alt 9. Sep 2004, 23:41
Hallo,

ich benutze folgende Procedures um Benutzer zu erstellen:

Delphi-Quellcode:
function createuser(Nachname,Vorname,Login,Passwort,Anmeldescript, Organisationeinheit: string; pwdLastSet: boolean): boolean;
var Container : IADsContainer;
    NewObject : IADs;
    User : IADsUser;
    hr : HREsult;
    res: boolean;
    varpwd: OleVariant;

begin
result:=true;

createou(Organisationeinheit);

try
  hr := ADsGetObject('LDAP://'+formatOU(Organisationeinheit,0,0)+'DC='+dom1+',DC='+dom2,IADsContainer,Container);
  if Failed(hr) then Exit;

  NewObject := Container.Create('User','CN='+Nachname+' '+Vorname) as IADs;

  NewObject.QueryInterface(IID_IADsUser, User);

  user.Put('Name',Nachname+' '+Vorname);
  user.Put('sAMAccountName',Login);
  user.Put('userPrincipalName',Login+'@'+dom1+'.'+dom2);
  user.Put('Firstname',Vorname);
  user.Put('LastName', Nachname);
  user.Put('FullName', Vorname+' '+Nachname);
  user.Put('LoginScript',Anmeldescript);
 except on e: exception do messagedlg('Benutzer: '+e.Message,mterror,[mbok],0);
 end;

 res:=true;
 try
 User.SetInfo;
 except
  result:=false;
  res:=false;
 end;

 if res=true then begin
    User.SetPassword(passwort);
    user.AccountDisabled:=false;
    try
      User.SetInfo;
    except on e: exception do result:=false;
    end;

    if pwdLastSet then begin
      varpwd:=0;
      user.Put('pwdLastSet',varpwd);
      try
        user.SetInfo;
      except
      end;
    end;
  end;

end;

function createOU(organisationsinheit: string): boolean;
var container: IADsContainer;
     ou: IADsOU;
     i: integer;
begin
result:=true;
for i:=0 to numou(organisationsinheit)-1 do begin
  try
    adsgetobject('LDAP://'+formatOU(organisationsinheit,1,i)+'DC='+dom1+',DC='+dom2, IADsContainer, Container);
    ou:=container.Create('organizationalUnit',formatOU(organisationsinheit,2,i)) as IADsOU;
  except
  on e: exception do showmessage('Fehler beim Erstellen der Organisationseinheit: '+e.Message);
  end;

  try
    ou.setinfo;
  except
    result:=false;
  end;
end;

end;
Die Funktion "FormatOU" ist nur eine Hilfsfunktion, die "Test1\Test2\" in "OU=Test2, OU=Test1, " umwandelt, so dass es ADSI-Konform ist.

Außerdem verwende ich die Units im Anhang.

Wenn ich nun folgendes mache:
Delphi-Quellcode:
for i:=0 to 10 do begin
   nachname:=grid.cells[1,i];
   ... //füllen der restlichen Variablen wie oben
   createuser(nachname,vorname,login,passwort,anmeldescript,organisationseinheit,true);
end;
dann klappt das nur bei 1. Druchlauf. Danach hat i einen wert in 9stelliger Höhe und wenn ich wieder auf grid zugreifen will, kommt ein Zugriffsfehler (EDIT: auch wenn ich im Watcher "grid.cells[1,1] drin hab steht da: Zugriffsverletzung)

Kann mit jemand helfen? Ich finde einfach den Fehler nicht. Der Benutzer wird ja ordnungsgemäß erzeugt, nur eben nur der 1.
Angehängte Dateien
Dateityp: pas adshlp.pas (5,5 KB, 22x aufgerufen)
Dateityp: pas activeds_tlb.pas (331,3 KB, 11x aufgerufen)
  Mit Zitat antworten Zitat