![]() |
ADSI-Zugriff führt zu Programmabsturz
Hallo zusammen,
ich stehe gerade völlig auf dem Schlauch und finde den Fehler nicht. Ich versuche in Delphe 2010 mit Hilfe der Unit ADSI (gefunden auf ![]() Um zu prüfen, ob es an meiner Applikation oder an der Verwendung der ADSI-Unit, habe ich die Unit mal in einem ganz einfachen Programm zum Test eingefügt. Dort tritt der selbe Fehler auf, ist also kein Folgefehler andere in meiner eigentliche Applikation verwendeten Codes sonder liegt nur in einer irgendwie falschen Nutzung der ADSI-Unit. Zum Test habe ich folgendes Mini-Programm erzeugt: - neue Dephi VCL-Anwendung - eine Form mit einem Memo und einem Button - im Button folgender Code auf dem Click-Event:
Delphi-Quellcode:
Ich suche jetzt schon Stunden nach dem Fehler (vermutlich irgendein falsch verwendeter Pointer / null-terminiertet String) komme aber nicht weiter.
procedure TForm1.Button1Click(Sender: TObject);
Var aUser: TADSIUserInfo; AD:TADSI; begin ad:=TADSI.Create(self); if ad.GetUser('','', aUser) then // hier könnte man auch Domäne und User übergeben, macht aber keinen Unterschied. Mit Leerstrings wird der aktuell angemeldete User verwendet begin showMessage(aUser.Groups); // --> da stehen die Gruppen korrekt drin memo1.Lines.Add(aUser.Groups) // --> das führt zu end; end; Sobald in der ADSI-Unit die Code-Zeile zum Aufruf von ADsGetObject ausgeführt wird, tritt an einer nicht vorhersehbaren Stelle im weiteren Verlauf der Applikation eine Zugriffsverltezung auf. Im obigen simplen Beispiel ist es der Zugriff auf das TMemo. Nachfolgender Code aus ADSI.pas verkürzt auf die relevanten Zeilen, ADsGetObject() steckt in der in Delphi erzeugten ActiveDs_TLB-Unit:
Delphi-Quellcode:
Hat jemand einen Tipp für mich, wo der Fehler stecken könnte?
...
type TADSIUserInfo = record UID: string; UserName: string; Description: string; Password: TPassword; Disabled: boolean; LockedOut: boolean; Groups: string; //CSV end; ... function TADSI.GetUser(Domain, UserName: string; var ADSIUser: TADSIUserInfo): boolean; var usr : IAdsUser; dom1, uid1: string; begin ... Result:=false; uid1:=FCurrentUser dom1:=FCurrentDomain ... ADsGetObject(PWideChar('WinNT://' + dom1 + '/' + uid1), IADsUser, usr); ... Werden weitere Informationen benötigt? Vielen Dank schon mal Siggi |
AW: ADSI-Zugriff führt zu Programmabsturz
Hallo,
ersetz mal alle Strings in der ADSI -Unit durch Ansistrings. Und Char durch Ansichar. Das Beispiel,war ja für Delphi,7. |
AW: ADSI-Zugriff führt zu Programmabsturz
Hallo Heiko,
gute Idee, aber leider nicht erfolgreich. CHAR durch AnsiChar ersetzten geht nicht. Das ist nur eine Stelle (
Delphi-Quellcode:
) und da kann es nur CHAR sein, ansonsten beschwert sich auch der Compiler bei der Zeile
domainName : array[0..DNLEN] of char;
Delphi-Quellcode:
... beim Domainname.
if LookupAccountName(nil, PChar(FCurrentUser), sid, sidSize, domainName, domainNameSize, sidNameUse) then
String durch AnsiString ersetzten geht fast überall, nur nicht bei dom1, uid1: String; Die kann ich aber auch direkt übergeben, also statt
Delphi-Quellcode:
so
ADsGetObject(PWideChar('WinNT://' + dom1 + '/' + uid1), IADsUser, usr);
Delphi-Quellcode:
Fehler bleibt aber bestehen - der Aufruf gibt die Gruppen zurück und sobald man danach versucht, irgendein Objekt anzusprechen (im Besipile das TMemo) kommt die Zugriffsverletzung. :cry:
ADsGetObject(PWideChar('WinNT://MyDomain/myUser'), IADsUser, usr);
Ich versuche mal, selber direkt über die ActiveDs_TLB zuzugreifen. Die Verwendung der ADSI-Unit sollte ja eigentlich die Artbeit sparen, für die leider etwas komplizierten Zugriffe die Doku zu studieren und das alles "zu Fuß" zu machen. Aber wenn es dann doch zu mehr Probleme führt als dass es Arbeit spart, muss halt doch der eigene Kopf brummen und das Problem lösen :-). Ausleden von Usern bekomme ich damit schon hin, muss noch etwas Doku lesen, dann finde ich auch noch raus, wie man zum aktuellen User die Gruppen auslesen kann... Gruß Siggi |
AW: ADSI-Zugriff führt zu Programmabsturz
Ich glaube ich kann das Thema schließen,
Ich habe diesen alten Thread von 2010 gefunden: ![]() Dort wird unter anderem darauf hingewiesen, dass die (auch von mir verwendeten) Übersetzungen der C#-Bibliotheken nach Delphi (adshlp.pas von agnisoft, von Delphi importierte ActiveDS_TLB) teils feherhaft sind. Es wird empfohlen, die JEDI-Bibliotheken JwaAdsTLB und JwaAdsHlp zu verwenden. ... und siehe da: damit geht es zumindest in den ersten Tests ohne die unerklärlichen Zugriffsverletzungen :-D :thumb:. Gruß Siggi |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz