AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Zugriffsverletzung ADSI, so was komisches hab ich noch nie..
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriffsverletzung ADSI, so was komisches hab ich noch nie..

Offene Frage von "Dezipaitor"
Ein Thema von cherry · begonnen am 21. Jan 2010 · letzter Beitrag vom 21. Jul 2010
Antwort Antwort
Seite 6 von 9   « Erste     456 78     Letzte »    
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#51

Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n

  Alt 24. Feb 2010, 10:30
Zitat von Dezipaitor:
Ich kann mich nur schon wieder aufregen, dass jeder glaubt so einfach von C nach Delphi WinAPI Header Dateien konvertieren zu können. Der Thread hier ist ein großes Beispiel, dass es oftmals nicht funktioniert.
Ich vermute noch viel mehr Fehler in diesen Units.
Ich hab nie gesagt, dass es einfach ist und es auch nie geglaubt. Aber was willst du damit eigentlich sagen?
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#52

Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n

  Alt 24. Feb 2010, 10:47
Ich hab nicht direkt dich damit gemeint. Aber schön, dass du dich angesprochen fühlst.
Nur meine ich, dass man genau deshalb solche offziellen Bibliotheken, wie die JEDI API verwenden sollte. Und wenn dort ein Fehler drin ist, dann schreibt man eine Mail mit der Vermutung. Wir schauen dann nach und sehen es dann meist auch schon (jahrelange Erfahrung).
Aber wenn jemand die Konvertierung selbst macht, dann ist es meist so, dass diese/r nur seinen/ihren Quelltext postet (wenn überhaupt) und man garnicht mitbekommt, dass er/sie die Übersetzung selbst gemacht hat. Das war reiner Zufall, dass ich Remko diesen Thread gezeigt habe und er aus Interesse die Übersetzungen angeschaut hat, da er selbst an einer AD Klasse für JWSCL arbeitet.

Aber er/sie hätte sich soviel Arbeit und Zeit erspart, indem er einfach schon die (richtige) Vorlage genommen hätte.

Zitat von cherry:
Ich hab nie gesagt, dass es einfach ist und es auch nie geglaubt.
Hast du geschrieben, dass du die Übersetzung selbst gemacht oder irgendwoher kopiert hast?
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#53

Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n

  Alt 24. Feb 2010, 11:09
Zitat von Dezipaitor:
Hast du geschrieben, dass du die Übersetzung selbst gemacht oder irgendwoher kopiert hast?
Ich habe den Wrapper von Agnisoft, da ich mir Anfangs nicht bewusst war, dass eine JEDI version existierte.

Ok. Ich verwende jetzt die jedi Units und es funktioniert soweit super. Nur habe ich immer noch das Problem, dass ich mit den HRESULT nicht klar komme...

Ich nehme nochmals das Besipiel (AdsGetObject)

Mit untenstehendem Code ergibt sich folgendes:
#1: Ich verwende einen Falschen Benutzername und Passwort -> result = 16 >> S_ADS_ERRORSOCCURRED
#2: Ich will auf ein Objekt zugreiffen das nicht existiert -> result = 0 >> Keine Übereinstimmung

Delphi-Quellcode:
 
    result := '0';
    if (hr and E_ADS_BAD_PATHNAME) = 0 then
      result := '1'
    else if (hr and E_ADS_INVALID_DOMAIN_OBJECT) = 0 then
      result := '2'
    else if (hr and E_ADS_INVALID_USER_OBJECT) = 0 then
      result := '3'
    else if (hr and E_ADS_UNKNOWN_OBJECT) = 0 then
      result := '4'
    else if (hr and E_ADS_PROPERTY_NOT_SET) = 0 then
      result := '5'
    else if (hr and E_ADS_PROPERTY_NOT_SUPPORTED) = 0 then
      result := '6'
    else if (hr and E_ADS_PROPERTY_INVALID) = 0 then
      result := '7'
    else if (hr and E_ADS_OBJECT_UNBOUND) = 0 then
      result := '8'
    else if (hr and E_ADS_PROPERTY_NOT_MODIFIED) = 0 then
      result := '9'
    else if (hr and E_ADS_PROPERTY_MODIFIED) = 0 then
      result := '10'
    else if (hr and E_ADS_CANT_CONVERT_DATATYPE) = 0 then
      result := '11'
    else if (hr and E_ADS_PROPERTY_NOT_FOUND) = 0 then
      result := '12'
    else if (hr and E_ADS_OBJECT_EXISTS) = 0 then
      result := '13'
    else if (hr and E_ADS_SCHEMA_VIOLATION) = 0 then
      result := '14'
    else if (hr and E_ADS_COLUMN_NOT_SET) = 0 then
      result := '15'
    else if (hr and S_ADS_ERRORSOCCURRED) = 0 then
      result := '16'
    else if (hr and S_ADS_NOMORE_ROWS) = 0 then
      result := '17'
    else if (hr and S_ADS_NOMORE_COLUMNS) = 0 then
      result := '18'
    else if (hr and E_ADS_INVALID_FILTER) = 0 then
      result := '19';
Nun mache ich das Selbe, verwende aber die Vergleichsweise die mir Corpsman unterbreitet hat:
#1: Ich verwende einen Falschen Benutzername und Passwort -> result = 0 >> Keine Übereinstimmung
#2: Ich will auf ein Objekt zugreiffen das nicht existiert -> result = 0 >> Keine Übereinstimmung

Delphi-Quellcode:
 
    result := '0';
    if ((hr and E_ADS_BAD_PATHNAME) = E_ADS_BAD_PATHNAME) then
      result := '1'
    else if ((hr and E_ADS_INVALID_DOMAIN_OBJECT) = E_ADS_INVALID_DOMAIN_OBJECT) then
      result := '2'
    else if ((hr and E_ADS_INVALID_USER_OBJECT) = E_ADS_INVALID_USER_OBJECT) then
      result := '3'
    else if ((hr and E_ADS_UNKNOWN_OBJECT) = E_ADS_UNKNOWN_OBJECT) then
      result := '4'
    else if ((hr and E_ADS_PROPERTY_NOT_SET) = E_ADS_PROPERTY_NOT_SET) then
      result := '5'
    else if ((hr and E_ADS_PROPERTY_NOT_SUPPORTED) = E_ADS_PROPERTY_NOT_SUPPORTED) then
      result := '6'
    else if ((hr and E_ADS_PROPERTY_INVALID) = E_ADS_PROPERTY_INVALID) then
      result := '7'
    else if ((hr and E_ADS_OBJECT_UNBOUND) = E_ADS_OBJECT_UNBOUND) then
      result := '8'
    else if ((hr and E_ADS_PROPERTY_NOT_MODIFIED) = E_ADS_PROPERTY_NOT_MODIFIED) then
      result := '9'
    else if ((hr and E_ADS_PROPERTY_MODIFIED) = E_ADS_PROPERTY_MODIFIED) then
      result := '10'
    else if ((hr and E_ADS_CANT_CONVERT_DATATYPE) = E_ADS_CANT_CONVERT_DATATYPE) then
      result := '11'
    else if ((hr and E_ADS_PROPERTY_NOT_FOUND) = E_ADS_PROPERTY_NOT_FOUND) then
      result := '12'
    else if ((hr and E_ADS_OBJECT_EXISTS) = E_ADS_OBJECT_EXISTS) then
      result := '13'
    else if ((hr and E_ADS_SCHEMA_VIOLATION) = E_ADS_SCHEMA_VIOLATION) then
      result := '14'
    else if ((hr and E_ADS_COLUMN_NOT_SET) = E_ADS_COLUMN_NOT_SET) then
      result := '15'
    else if ((hr and S_ADS_ERRORSOCCURRED) = S_ADS_ERRORSOCCURRED) then
      result := '16'
    else if ((hr and S_ADS_NOMORE_ROWS) = S_ADS_NOMORE_ROWS) then
      result := '17'
    else if ((hr and S_ADS_NOMORE_COLUMNS) = S_ADS_NOMORE_COLUMNS) then
      result := '18'
    else if ((hr and E_ADS_INVALID_FILTER) = E_ADS_INVALID_FILTER) then
      result := '19';
Ich habe das Ganze Spielchen auch noch mit Case hr of E_ADS_BAD_PATHNAME: usw ... gemacht,
auch hier ergab sich:

#1: Ich verwende einen Falschen Benutzername und Passwort -> result = 0 >> Keine Übereinstimmung
#2: Ich will auf ein Objekt zugreiffen das nicht existiert -> result = 0 >> Keine Übereinstimmung

Ich scheine ja wohl grundsätzlich was falsch zu machen, aber was?
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#54

Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n

  Alt 24. Feb 2010, 11:27
D.h. einfach, dass entweder hr = 0 oder ein Wert ist, den du nicht abfängst.
Nimm OleCheck(ADBla()); ,um eine FehlerException zu bekommen.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#55

Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n

  Alt 24. Feb 2010, 11:42
Zitat von Dezipaitor:
D.h. einfach, dass entweder hr = 0 oder ein Wert ist, den du nicht abfängst.
Nimm OleCheck(ADBla()); ,um eine FehlerException zu bekommen.
Danke.
Und noch das letzte mal das ich eure Nerven in diesem Thread strapaziere bevor ich ihn dann schliesse...

Da die Deklaration von ADsGetObject nun einen Pointer erwartet als out Parameter, habe ichs folgendermassen gelöst:

Delphi-Quellcode:

function TForm1.AccessObject(const PathName: string; const riid:TGUID; out ppObject: Pointer): HRESULT;
var
  e: EOleSysError;
begin
  if (EdUsername.Text <> '') and (EdPassword.Text <> '') then
    result := ADsOpenObject(LPCWSTR(PathName), LPCWSTR(EdUsername.Text), LPCWSTR(EdPassword.Text), ADS_USE_ENCRYPTION, riid, ppObject)
  else
    result := ADsGetObject(LPCWSTR(PathName), riid, ppObject);

  if not Succeeded(result) then
  begin
    e := EOleSysError.Create('', result, 0);
    MessageDlg(e.Message, mtError, [mbOK], 0);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  usr: Pointer;
begin
  ClearFields;
  ShowUser(EdLDAP.Text, CBShowUser);
  sEditedFields.Clear;
  sOldObjectPath := EdLDAP.Text;

  if SUCCEEDED(AccessObject(EdLDAP.Text, IADsUser, usr)) then
    EnumGroupsOfUser(IADsUser(usr), ListBox1.Items);
end;
Ist das grundsätzlich richtig? oder würde man das anders machen?
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Benutzerbild von Remko
Remko

Registriert seit: 10. Okt 2006
Ort: 's-Hertogenbosch, Die Niederlande
222 Beiträge
 
RAD-Studio 2010 Arc
 
#56

Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n

  Alt 24. Feb 2010, 13:12
Just cast the interface to pointer when passing it to AdsGetObject
See my blog blog
See our Jedi blog
  Mit Zitat antworten Zitat
Benutzerbild von Remko
Remko

Registriert seit: 10. Okt 2006
Ort: 's-Hertogenbosch, Die Niederlande
222 Beiträge
 
RAD-Studio 2010 Arc
 
#57

Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n

  Alt 24. Feb 2010, 13:14
btw: here is a link to the Win32 error codes for Adsi: http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx
See my blog blog
See our Jedi blog
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#58

Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n

  Alt 24. Feb 2010, 14:21
Delphi-Quellcode:
if not Succeeded(result) then
  begin
    e := EOleSysError.Create('', result, 0);
    MessageDlg(e.Message, mtError, [mbOK], 0);
  end;
???????? Was ist das?
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#59

Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n

  Alt 24. Feb 2010, 14:39
Zitat von Dezipaitor:
Delphi-Quellcode:
if not Succeeded(result) then
  begin
    e := EOleSysError.Create('', result, 0);
    MessageDlg(e.Message, mtError, [mbOK], 0);
  end;
???????? Was ist das?
Das war nur ein Test. OleCheck gibt gleich eine Fehlermeldung raus, ich möchte aber später die Fehlermeldung in meinen AdsManager speichern und diese dann nur bei bedarf durch AdsManager.getLastError aufrufen. Also würde dann

Delphi-Quellcode:
if not Succeeded(result) then
  begin
    e := EOleSysError.Create('', result, 0);
    SetLastError(e.Message);
  end;
daraus, oder so in der Art.


Ok, jetzt drängt sich aber doch noch was auf:
und zwar ExecuteSearch, hast du da vielleicht ein Beispiel dazu... Meine Variante funktioniert natürlich so nicht mehr. Und ich weiss noch wie lange ich damals hatte um die Funktion hinzubekommen. Konkret gibts ne Zugriffsverletzung beim Aufruf von: "hr := search.GetNextRow(Pointer(ptrResult));"

Letztes mal, weiss ich noch, wars so, das ich das ganze IDirectorySearch geändert habe. Sprich alle Pointer auf THandle geändert, dann hats geklappt. Nun verwende ich ja aber JwaAdsTLB und da sind die Pointer wieder und ich denke die JEDIS haben das schon richtig gemacht?!

Meine Suchfunktion ist etwas "speziell", ich Poste sie trotzdem mal... Wäre jedoch um ein einfaches Beispiel (das mit den JEDI Units funktioniert) sehr dankbar.

Delphi-Quellcode:
{******************************************************************************}
// OBJECT: THIS FUNCTION EXECUTES A SEARCH.
// EXPECTED PARAMETERS: searchfilter eg. = (&(|(objectClass=user)(objectClass=group)(objectClass=organizationalUnit))(|(Name=*'+EdSearch.Text+'*)(sAMAccountName=*'+EdSearch.Text+'*)))
// CallBackFunction interface: TCallBackResultArray = procedure(data: TResultArray) of object; -> TResultArray is an 2dimensional array of string
// OPTIONAL PARAMETERS: Attributes: eg: 'Name;AdsPath;Class;' -> A delimited String to pass which defines the attributes you want to get. default: Name;AdsPath;
// LDAPBeginingPath: eg: OU=example,OU=this,DC=domain1,DC=lan -> means the search will be executed on this path. default: search whole AD
{******************************************************************************}
procedure TEADSObject.DirectorySearch(searchfilter: string; CallBackFunction: TCallBackResultArray; Attributes: string = 'Name;AdsPath;'; LDAPBeginingPath: string = 'ROOTDSE');
var
  search: IDirectorySearch;
  ptrResult: THandle;
  opt: ads_searchpref_info;
  dwCount: DWORD;
  hr: HResult;
  col: ads_search_column;

  dwErr: DWord;
  szErr : array[0..255] of WideChar;
  szName : array[0..255] of WideChar;
  I: Integer;

  ArrResult: TStringArray2;
  ArrResCnt: Integer;
  AttrArray: array of PWideChar;
  Attribute: string;
  empty: Boolean;
begin

  // create an attributes array from the attributes passed by a delimitted string
  for I := 1 to Length(Attributes) do
  begin
    if Attributes[I] = ';then
    begin
      SetLength(AttrArray, Length(AttrArray)+1);
      getmem(AttrArray[Length(AttrArray)-1], 256);
      StringToWideChar(Attribute, AttrArray[Length(AttrArray)-1], 256);
      Attribute := '';
    end
    else
      Attribute := Attribute + Attributes[I]
  end;

  // for faster search set a LDAPBeginingPath to execute the search within this container
  if LDAPBeginingPath = 'ROOTDSEthen
    LDAPBeginingPath := AdsMgr.ADSController.LDAPPATH;

  // get the search object
  if SUCCEEDED(AccessObject(LDAPBeginingPath, IDirectorySearch, search)) then
  begin
    try
      // set parameters
      opt.dwSearchPref := ADS_SEARCHPREF_SEARCH_SCOPE OR ADS_SEARCHPREF_SORT_ON;
      opt.vValue.dwType := ADSTYPE_INTEGER;
      opt.vValue.__MIDL_0010.Integer := ADS_SCOPE_SUBTREE;
      // setting search preferences
      if not SUCCEEDED(search.SetSearchPreference(opt, 1)) then
      begin
        ADsGetLastError(dwErr, @szErr[0], 254, @szName[0], 254);
        ShowMessage(WideCharToString(szErr));
        Exit;
      end;
      // prepare
      dwCount := Length(AttrArray);
      ArrResCnt := 1;
      // execute the search
      hr := search.ExecuteSearch(LPCWSTR(searchfilter), @AttrArray[0], dwCount, Pointer(ptrResult));
      // handle the result if hr is S_OK
      if SUCCEEDED(hr) then
      begin
        // get first row
        hr := search.GetNextRow(Pointer(ptrResult)); // <<<<<<<<<< ACCESS VIOLATION
        // repeat until no more rows
        while (hr = S_OK) do // (S_NOMORE_ROWS) < JEDI scheints nicht zu kennen
        begin

          // redim result array
          SetLength(ArrResult, ArrResCnt);
          empty := true;

          // for each attribute you want to get (defined in AttrArray)
          for I := 0 to dwCount -1 do
          begin
            // get column
            if Succeeded(search.GetColumn(Pointer(ptrResult), @AttrArray[I], col)) then
            begin
              if col.pADsValues <> nil then
              begin
                // redim result array (2 dimensional string array)
                SetLength(ArrResult[ArrResCnt-1], I+1);
                // fill values into the result array
                ArrResult[ArrResCnt-1,I] := col.pADsValues^.__MIDL_0010.DNString;
                //ArrResult[ArrResCnt-1,I] := col.pADsValues^.__MIDL_0010.BackLink.ObjectName; [AHAAA]
                empty := false;
              end;
              search.FreeColumn(col);
            end;
          end;
          hr := search.GetNextRow(Pointer(ptrResult));

          // only redim the result array next time, if there was a value found
          // we dont want empty fields in the result array.
          if not empty then
            Inc(ArrResCnt);

        end;
      end;
      //search.CloseSearchHandle(ptrResult);
    except
      //search._Release;
      on e: EOleException do
        AdsMgr.SetLastError(e.Message);
    end;
  end;
  if Length(ArrResult) > 0 then
    CallBackFunction(ArrResult);
end;
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#60

Re: Zugriffsverletzung ADSI, so was komisches hab ich noch n

  Alt 24. Feb 2010, 15:10
Zitat:
Das war nur ein Test. OleCheck gibt gleich eine Fehlermeldung raus, ich möchte aber später die Fehlermeldung in meinen AdsManager speichern und diese dann nur bei bedarf durch AdsManager.getLastError aufrufen. Also würde dann
Du wirst es mir vllt. nicht glauben, aber jemand anderes würde den Quelltext ohne zu zucken einfach kopieren und verwenden. Kenne so manchen falschen Quellcode, der im Internet damit verbreitet wurde ("Checking if a user is an administrator").
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 6 von 9   « Erste     456 78     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz