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..

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 7 von 9   « Erste     567 89   
Benutzerbild von Remko
Remko

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

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

  Alt 24. Feb 2010, 15:11
You are doing something VERY wrong!
First you declare ptrResult as THandle:
  ptrResult: THandle; Later on you cast it to a pointer:
hr := search.ExecuteSearch(LPCWSTR(searchfilter), @AttrArray[0], dwCount, Pointer(ptrResult)); You are actually lucky that it works because a pointer is actually a dword therefore it works but the correct way would IMO be:
ptrHandle: PHandle;

hr := search.ExecuteSearch(LPCWSTR(searchfilter), @AttrArray[0], dwCount, ptrResult); If you need to pass it as handle later on use ptrHandle^ to derefence the pointer.

/Edit just a remark: I know this is just test code but if you change a variable type ALWAYS change it's name as well as you WILL confuse yourself later on ( or DelphiPraxis members reading your code )
Also when you post example code, please take the effort of cleaning it up as much as possible.
See my blog blog
See our Jedi blog
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

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

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

  Alt 24. Feb 2010, 15:27
Danke nochmals für dein Engagement. Leider ändert sich auch dann nichts. Auch wenn ich "ptrResult: Pointer;" habe.
Komisch ist, dass "hr := search.ExecuteSearch(LPCWSTR(searchfilter), @AttrArray[0], dwCount, ptrResult);" = S_OK ist, aber die Zeile weiter unten:
"hr := search.GetNextRow(Pointer(ptrResult)); " in einer Zugriffsverletzung endet.

Hast du viellecht ein funktionierendes Beispiel, das wäre wohl das einfachste. Ansonsten probiere ich mir hier einen ab.
Danke schon mal.
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
 
#63

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

  Alt 24. Feb 2010, 15:30
First you use ptrResult in ExecuteSearch and then you use Pointer(ptrResult) in search.GetNextRow ??
I suggest you do a good cleanup of your code and post that, stating what is and what is not working.
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
 
#64

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

  Alt 24. Feb 2010, 15:36
Vllt. braucht man GetFirstResult zuerst?
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
 
#65

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

  Alt 24. Feb 2010, 15:57
Versuche zunächst mal ganz klein anzufangen:

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
const
  ColCount = 3;
  ColNames : array[0..ColCount-1] of PWideChar = ('Name','Description','ADsPath');
var
  search: IDirectorySearch;
  ptrResult: Pointer;
  hr : HRESULT;
begin
  if SUCCEEDED(ADsGetObject(PWideChar('LDAP://DC=thun,DC=lan'), IDirectorySearch, Pointer(search))) then
  begin
    if SUCCEEDED(search.ExecuteSearch('(objectClass=organizationalUnit)',@ColNames,ColCount,ptrResult)) then
    begin
      hr := search.GetNextRow(ptrResult); // Zugriffsverletzung
    end;
  end;
end;
Und auch ...

Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
const
  ColCount = 3;
  ColNames : array[0..ColCount-1] of PWideChar = ('Name','Description','ADsPath');
var
  search: IDirectorySearch;
  ptrResult: Pointer;
  hr : HRESULT;
begin
  if SUCCEEDED(ADsGetObject(PWideChar('LDAP://DC=thun,DC=lan'), IDirectorySearch, Pointer(search))) then
  begin
    if SUCCEEDED(search.ExecuteSearch('(objectClass=organizationalUnit)',@ColNames,ColCount,ptrResult)) then
    begin
      hr := search.GetFirstRow(ptrResult); // Zugriffsverletzung
    end;
  end;
end;
Was mach ich denn falsch?
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
934 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#66

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

  Alt 24. Feb 2010, 16:00
Hallo

In diesem Beitrag habe ich damals schon auf ein paar Unstimmigkeiten hingewiesen.

Das mit der nicht geschriebenen Mail tut mir leid.
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

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

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

  Alt 24. Feb 2010, 16:17
Zitat von Alter Mann:
Hallo

In diesem Beitrag habe ich damals schon auf ein paar Unstimmigkeiten hingewiesen.

Das mit der nicht geschriebenen Mail tut mir leid.
Du meinst das mit Pointer und THandle nehm ich an?! Nun, da ich ja jetzt die JEDI units verwende verwende ich auch jwaADsTLB, und ich weiss nicht ob ich da einfach das IDirectoryInterface ändern soll?!
Zudem habe ich das Testhalber kurz gemacht und es klappte trotzdem nicht... > Zugriffsverletzung an derselben Stelle!
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
 
#68

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

  Alt 24. Feb 2010, 16:36
I have seen the problem: delphi creates garbage when importing the TypeLib for Active Directory. I reimported the typelib from c:\windows\system32\activeds.tlb with Delphi 2010 and it's still the same mess. The declaration of IDirectorySearch is totally wrong (and the one in AdsHlp.pas is wrong as well).

This works fine for me:

Delphi-Quellcode:
type
  ADS_SEARCH_HANDLE = THandle;
  PADS_SEARCH_HANDLE = ^ADS_SEARCH_HANDLE;
// *********************************************************************//
// Interface: IDirectorySearch
// Flags: (0)
// GUID: {109BA8EC-92F0-11D0-A790-00C04FD8D5A8}
// *********************************************************************//
  IDirectorySearch = interface(IUnknown)
    ['{109BA8EC-92F0-11D0-A790-00C04FD8D5A8}']
    function SetSearchPreference(var pSearchPrefs: ads_searchpref_info; dwNumPrefs: LongWord): HResult; stdcall;
    function ExecuteSearch(pszSearchFilter: PWideChar; pAttributeNames: PWideChar;
                            dwNumberAttributes: LongWord; var phSearchResult: ADS_SEARCH_HANDLE): HResult; stdcall;
    function AbandonSearch(phSearchResult: ADS_SEARCH_HANDLE): HResult; stdcall;
    function GetFirstRow(hSearchResult: ADS_SEARCH_HANDLE): HResult; stdcall;
    function GetNextRow(hSearchResult: ADS_SEARCH_HANDLE): HResult; stdcall;
    function GetPreviousRow(hSearchResult: ADS_SEARCH_HANDLE): HResult; stdcall;
    function GetNextColumnName(hSearchHandle: ADS_SEARCH_HANDLE; out ppszColumnName: PWideChar): HResult; stdcall;
    function GetColumn(hSearchResult: ADS_SEARCH_HANDLE; szColumnName: PWideChar;
                        out pSearchColumn: ads_search_column): HResult; stdcall;
    function FreeColumn(var pSearchColumn: ads_search_column): HResult; stdcall;
    function CloseSearchHandle(hSearchResult: ADS_SEARCH_HANDLE): HResult; stdcall;
  end;

procedure TMainForm.Button1Click(Sender: TObject);
var
  ColCount: DWORD;
  ColNames: array of PWideChar;
  DirSearch: IDirectorySearch;
  SearchHandle: ADS_SEARCH_HANDLE;
  hr : HRESULT;
begin
  ColCount := 1;
  SetLength(ColNames, 3);
  ColNames[0] := 'name';
  ColNames[1] := 'description';
  ColNames[2] := 'adspath';

  hr := ADsGetObject(PWideChar('LDAP://DC=rmi,DC=local'), IID_IDirectorySearch, Pointer(DirSearch));

  if failed(hr) then
    Exit;

  SearchHandle := 0;
  hr := DirSearch.ExecuteSearch('(objectClass=organizationalUnit)', @ColNames[0], Length(ColNames), SearchHandle);
  if failed(hr) then
    Exit;

  while DirSearch.GetNextRow(SearchHandle) <> S_ADS_NOMORE_ROWS do
  begin
    // Do something with result
  end;
  DirSearch.CloseSearchHandle(SearchHandle);
  DirSearch := nil;
end;
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
 
#69

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

  Alt 24. Feb 2010, 16:56
Some more observations: the attribute names in pAttributeNames MUST BE lowerCASE or you will get empty results.
I made some more corrections to the declaration:
Delphi-Quellcode:
type
  ADS_SEARCH_HANDLE = THandle;
  PADS_SEARCH_HANDLE = ^ADS_SEARCH_HANDLE;
  PADS_SEARCH_COLUMN = ^ads_search_column;
// *********************************************************************//
// Interface: IDirectorySearch
// Flags: (0)
// GUID: {109BA8EC-92F0-11D0-A790-00C04FD8D5A8}
// *********************************************************************//
  IDirectorySearch = interface(IUnknown)
    ['{109BA8EC-92F0-11D0-A790-00C04FD8D5A8}']
    function SetSearchPreference(var pSearchPrefs: ads_searchpref_info; dwNumPrefs: LongWord): HResult; stdcall;
    function ExecuteSearch(pszSearchFilter: PWideChar; pAttributeNames: PWideChar;
                            dwNumberAttributes: LongWord; var phSearchResult: ADS_SEARCH_HANDLE): HResult; stdcall;
    function AbandonSearch(phSearchResult: ADS_SEARCH_HANDLE): HResult; stdcall;
    function GetFirstRow(hSearchResult: ADS_SEARCH_HANDLE): HResult; stdcall;
    function GetNextRow(hSearchResult: ADS_SEARCH_HANDLE): HResult; stdcall;
    function GetPreviousRow(hSearchResult: ADS_SEARCH_HANDLE): HResult; stdcall;
    function GetNextColumnName(hSearchHandle: ADS_SEARCH_HANDLE; out ppszColumnName: PWideChar): HResult; stdcall;
    function GetColumn(hSearchResult: ADS_SEARCH_HANDLE; szColumnName: PWideChar;
                        var pSearchColumn: ads_search_column): HResult; stdcall;
    function FreeColumn(var pSearchColumn: ads_search_column): HResult; stdcall;
    function CloseSearchHandle(hSearchResult: ADS_SEARCH_HANDLE): HResult; stdcall;
  end;
Accessing the search results will currently not work because the declaration of ADS_SEARCH_COLUMN is totally wrong in the typelib, so while this code should be correct the results cannot be displayed because of the wrong declaration:
Delphi-Quellcode:
  while DirSearch.GetNextRow(SearchHandle) <> S_ADS_NOMORE_ROWS do
  begin
    for i := 0 to Length(ColNames) - 1 do
    begin
      hr := DirSearch.GetColumn(SearchHandle, ColNames[i], col);
      if succeeded(hr) then
      begin
        // note that the typelib doesn't know the proper typed pointer and the anonymous union in it
        OutputDebugString(col.pADsValues^.__MIDL_0010.CaseIgnoreString);
        DirSearch.FreeColumn(col);
      end;
    end;
    // Do something with result
  end;
See my blog blog
See our Jedi blog
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
934 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#70

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

  Alt 24. Feb 2010, 17:20
Hi

hier mein Änderungen:
Delphi-Quellcode:
// *********************************************************************//
// Schnittstelle: IDirectorySearch
// Flags: (0)
// GUID: {109BA8EC-92F0-11D0-A790-00C04FD8D5A8}
// *********************************************************************//
  IDirectorySearch = interface(IUnknown)
    ['{109BA8EC-92F0-11D0-A790-00C04FD8D5A8}']
    function SetSearchPreference(var pSearchPrefs: ads_searchpref_info; dwNumPrefs: LongWord): HResult; stdcall;
    function ExecuteSearch(pszSearchFilter: PWideChar; pAttributeNames: PWideChar;
                           dwNumberAttributes: LongWord; out phSearchResult: THandle): HResult; stdcall;
    function AbandonSearch(var phSearchResult: THandle): HResult; stdcall;
    function GetFirstRow(var hSearchResult: THandle): HResult; stdcall;
    function GetNextRow(hSearchResult: THandle): HResult; stdcall;
    function GetPreviousRow(var hSearchResult: THandle): HResult; stdcall;
    function GetNextColumnName(var hSearchHandle: THandle; out ppszColumnName: PWideChar): HResult; stdcall;
    function GetColumn(hSearchResult: THandle; szColumnName: PWideChar;
                       out pSearchColumn: ads_search_column): HResult; stdcall;
    function FreeColumn(var pSearchColumn: ads_search_column): HResult; stdcall;
    function CloseSearchHandle(var hSearchResult: THandle): HResult; stdcall;
  end;
Im Anhang der Directorysearcher.

Alter Mann
Angehängte Dateien
Dateityp: zip adsisearch_756.zip (44,4 KB, 34x aufgerufen)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 20:33 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