AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Prüfung effektiver Berechtigungen eines "Extended Right" auf AD-Objekte?
Thema durchsuchen
Ansicht
Themen-Optionen

Prüfung effektiver Berechtigungen eines "Extended Right" auf AD-Objekte?

Offene Frage von "Dezipaitor"
Ein Thema von ogiesen · begonnen am 22. Dez 2011 · letzter Beitrag vom 15. Jan 2012
 
Benutzerbild von ogiesen
ogiesen

Registriert seit: 25. Okt 2004
Ort: Delmenhorst
43 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: Prüfung effektiver Berechtigungen eines "Extended Right" auf AD-Objekte?

  Alt 2. Jan 2012, 09:51
Moin Dezipaitor! Frohes Neues!

Zitat:
Sag mir mal bitte ganz genau, an welcher Stelle die Exception in JWSCL geworfen wird.
Also, ich hab's jetzt gerade nochmal probiert und bekomme zuerst folgende Exception:

Zitat:
---------------------------
Debugger Exception Notification
---------------------------
Project ADACLQuery.exe raised exception class EJwsclWinCallFailedException with message '

An Exception of type EJwsclWinCallFailedException was raised.
(Data was given by programmer and can vary from actual source.)
Source method....: Create(const SIDString : TJwString)
Source class.....: TJwSecurityId
Source file......: JwsclSid.pas
Source line......: 0
GetLastError.....: 1337 ($539)
GetLastErrorMsg..: The security ID structure is invalid.

Message : Call to ConvertStringSidToSid failed.
'.
Ich bin mir absolut sicher, dass es bei früheren Tests eine EJwsclInvalidSid war, aber ich kann nicht mehr nachvollziehen, was ich seitdem geändert habe. Ich vermute aber mal, dass die Ursache die selbe sein dürfte.

In dem Augenblick, wo die Exception auftritt (in diesem Fall beim 22. Aufruf von GetStringSID), ist das hier der Inhalt des fSID-Feldes, das umgewandelt werden soll:
Code:
Name                   Value
----------------------- ----------------------------
fSID                   $1EE3AE8
+ Revision             3
+ SubAuthorityCount    0
+ IdentifierAuthority  ((0, 0, 154, 255, 248, 240))
| + Value              (0, 0, 154, 255, 248, 240)
+ SubAuthority         (0)
(Das ist natürlich nur exemplarisch, aber ich bekomme den Fehler auch für andere Objekte und dann auch für andere SIDs. Die einzige Gemeinsamkeit, die ich bei den fehlgeschlagenen Versuchen bisher feststellen konnte, war dass dort überall die Revision den Wert 3 hatte.)

Der Callstack sieht zu dem Zeitpunkt so aus:
Code:
JwsclSid.TJwSecurityId.GetStringSID
JwsclSid.TJwSecurityId.Create($42D3628)
JwsclAcl.TJwSecurityAccessControlEntry.Create($42D3620)
JwsclAcl.TJwSecurityAccessControlEntry.CreateACE($42D3620)
JwsclAcl.TJwSecurityAccessControlList.Create($42D33B0)
JwsclAcl.TJwDAccessControlList.Create($42D33B0)
JwsclDescriptor.TJwSecurityDescriptor.InitializeSD($318598)
JwsclDescriptor.TJwSecurityDescriptor.Create($318598)
ADACLQueryFo.TForm19.JwButton1Click($1E57C50)
Setze ich die Ausführung dann fort, gibt es noch eine EInvalidPointer-Exception in TObject.FreeInstance, laut Callstack ausgelöst durch TJwSecurityAccessControlList.Destroy. "Invalid Pointer operation" ist dann auch die Meldung, die ich außerhalb des Debuggers zu sehen bekomme.

Hier ist der aufrufende Code:
Delphi-Quellcode:
var
  lObj: IDirectoryObject;
  lAttrs: array of PWideChar;
  lAttrEntries: PAdsAttrInfoArray;
  lAttrCount: Cardinal;
  lSD: PSECURITY_DESCRIPTOR;
// lSDSize: Cardinal;
  lSID: PSID;
  lAbsSD: PSECURITY_DESCRIPTOR;
  lAbsSDSize: Cardinal;
  lDacl: PACL;
  lDaclSize: Cardinal;
  lSacl: PACL;
  lSaclSize: Cardinal;
  lOwner: PSID;
  lOwnerSize: Cardinal;
  lGroup: PSID;
  lGroupSize: Cardinal;
  lJwSD: TJwSecurityDescriptor;
  lJwSelfSid: TJwSecurityId;
  lJwTypes: TJwObjectTypeArray;
  lJwMapping: TJwSecurityGenericMappingClass;
  lJwPrivSet: TJwPrivilegeSet;
  lJwGrantedAccess: TJwAccessMaskArray;
  lJwStatus: TJwCardinalArray;
  lDesiredAccess: Cardinal;
  lItm: TListItem;
  lTypeGUID: TGUID;
begin
  if Failed(ADsGetObject(PWideChar('LDAP://' + ObjDN_CB.Text),
                         IDirectoryObject,
                         Pointer(lObj))) then Exit;

  SetLength(lAttrs, 2);
  lAttrs[0] := 'nTSecurityDescriptor';
  lAttrs[1] := 'objectSID';

  if Failed(lObj.GetObjectAttributes(@lAttrs[0],
                                     Length(lAttrs),
                                     PADS_ATTR_INFO(lAttrEntries),
                                     lAttrCount)) then Exit;

  lSD := PSECURITY_DESCRIPTOR(lAttrEntries[0].pADsValues.SecurityDescriptor.lpValue);
// lSDSize := lAttrEntries[0].pADsValues.SecurityDescriptor.dwLength;
  lSID := PSID(lAttrEntries[1].pADsValues.OctetString.lpValue);

  lAbsSD := nil; lDacl := nil; lSacl := nil; lOwner := nil; lGroup := nil;

  if not MakeAbsoluteSD(lSD, lAbsSD, lAbsSDSize, lDacl, lDaclSize, lSacl, lSaclSize, lOwner, lOwnerSize, lGroup, lGroupSize) then
    begin
      lAbsSD := PSECURITY_DESCRIPTOR(LocalAlloc(0, lAbsSDSize));
      lDacl := PACL(LocalAlloc(0, lDaclSize));
      lSacl := PACL(LocalAlloc(0, lSaclSize));
      lOwner := PSID(LocalAlloc(0, lOwnerSize));
      lGroup := PSID(LocalAlloc(0, lGroupSize));
      if not MakeAbsoluteSD(lSD, lAbsSD, lAbsSDSize, lDacl, lDaclSize, lSacl, lSaclSize, lOwner, lOwnerSize, lGroup, lGroupSize) then
        begin
          FreeAdsMem(Pointer(lAttrEntries));
          Abort;
        end;
    end;

  lDesiredAccess := ADS_RIGHT_DS_CONTROL_ACCESS; // = $00000100

  lJwSD := TJwSecurityDescriptor.Create(lAbsSD); // <<<--- Exception hier
  try
    lJwSelfSid := TJwSecurityId.Create(lSID);
    try
      SetLength(lJwTypes, 1);
      lTypeGUID := StringToGuid(ObjTypeGuid_CB.Text);
      lJwTypes[0].Level := ACCESS_OBJECT_GUID;
      lJwTypes[0].Sbz := 0;
      lJwTypes[0].ObjectType := @lTypeGUID;

      lJwMapping := TJwSecurityGenericMapping;

      TJwSecureGeneralObject.AccessCheckByTypeResultList(lJwSD, lJwSelfSid, nil, lDesiredAccess, lJwTypes, lJwMapping, lJwPrivSet, lJwGrantedAccess, lJwStatus);
    finally
      lJwSelfSid.Free;
    end;
  finally
    lJwSD.Free;
  end;

end;
Es macht übrigens im Hinblick auf den Fehler keinen Unterschied, wenn ich den MakeAbsolute-Abschnitt weglasse.

Der Client auf dem der Code läuft ist Windows 7 Enterprise. Das AD läuft auf einem Windows Server 2008 R2. Das abgefragte Objekt in dem o.g. Beispiel ist ein mailaktivierter Öffentlicher Ordner auf einem Exchange 2007 SP1.

Sag einfach bescheid, wenn Du noch weitere Infos brauchst.
Oliver Giesen

People assume that time is a strict progression of cause and effect, but *actually* from a non-linear, non-subjective viewpoint - it's more like a big ball of wibbly-wobbly... timey-wimey... stuff.
The Doctor

Geändert von ogiesen ( 2. Jan 2012 um 09:57 Uhr)
  Mit Zitat antworten Zitat
 

 

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 10:20 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-2025 by Thomas Breitkreuz