Thema: Delphi LDAP SID ermitteln

Einzelnen Beitrag anzeigen

hsg

Registriert seit: 24. Apr 2006
Ort: Wustermark
354 Beiträge
 
Delphi 10.3 Rio
 
#19

AW: LDAP SID ermitteln

  Alt 14. Jul 2011, 06:17
Hi,

auch wenn dieses Thema bereits älter ist, klinke ich mich mal hier ein. Ich hatte in den letzten Tagen genau das selbe Problem. Nach langen Forschen und experimentieren habe ich die folgende Lösung gefunden. Ich poste sie mal hier, damit andere vielleicht schneller voran kommen

Ein Teil der Lösung stammt aus entsprechenden Funktionen, die ich auf der Webseite selfADSI gefunden habe (wenn ich das richtig gesehen habe, stehen die Funktionen auch im MSDN, habe aber die Quelle nicht mehr dazu). Dort stehen sie als Funktionen für das Windows Scripting (WSH) zur Verfügung, ich habe sie nach Delphi transformiert und dabei versucht, sie so original wie möglich zu lassen Gerade bei den Funktionen Byte4ToLong und Byte6ToLong ist damit natürlich noch Optimierungs-Potential vorhanden.

Delphi-Quellcode:
//-----------------------------------------------------------------------------------------------
// Funktionen aus selfADSI.de: http://www.selfadsi.org/deep-inside/microsoft-sid-attributes.htm
// Autor: ??? übersetzt von Jo.Hoyer
// Datum: 14.07.2011 06:38:17
//----------------------------------------------------------------------------------------------
Function Byte4ToLong(b1, b2, b3, b4 : Byte) : Cardinal;
begin
  //'converts 4 bytes to the according lang integer value
  Result := b1;
  Result := Result * 256 + b2;
  Result := Result * 256 + b3;
  Result := Result * 256 + b4;
End;


Function Byte6ToLong(b1, b2, b3, b4, b5, b6 : Byte) : Cardinal;
begin
  // converts 6 bytes to the according lang integer value
    Result := b1;
    Result := Result * 256 + b2;
    Result := Result * 256 + b3;
    Result := Result * 256 + b4;
    Result := Result * 256 + b5;
    Result := Result * 256 + b6;
End;

Function HexStrToSID(strSid : WideString) : string;
var
  i : Integer;
  data : Array of Byte;
  offset : Integer;
  blockCount : Integer;
  nLen : Integer;
begin
  //converts a raw SID hex string to the according SID string (SDDL)
  nLen := Length(strSid);
  nLen := nLen div 2 - 1;
  SetLength(data,nLen);
  For i := 0 To Length(data) do begin
    data[i] := StrToInt('$' + Copy(strSid, 2*i + 1, 2));
  end;
  Result := 'S-' + IntToStr(data[0]) + '-' + IntToStr(Byte6ToLong(data[2], data[3], data[4], data[5], data[6], data[7]));

  blockCount := data[1];
  For i := 0 To blockCount - 1 do begin
    offset := 8 + 4 * i;
    Result := Result + '-' + IntToStr(Byte4ToLong(data[offset+3], data[offset+2], data[offset+1], data[offset]));
  end;
End;

//------------------------------------------------------------------------------------------------
// Übersetze SID aus LDAP-Verzeichnis
// Autor: jo.hoyer
// Datum: 08.07.2011 09:10:26
//------------------------------------------------------------------------------------------------
function GetSIDString(aObjectSID : OleVariant): WideString;
var
  i : Integer;
  nMin : Integer;
  nMax : Integer;
  nDim : Integer;
  cWStr : WideString;
begin
  nDim := VarArrayDimCount(aObjectSID);
  nMin := VarArrayLowBound(aObjectSID, nDim);
  nMax := VarArrayHighBound(aObjectSID,nDim);
  cWStr := '';
  for i := nMin to nMax do begin
    cWStr := cWStr + IntToHex(VarArrayGet(aObjectSID, i),2);
  end;
  Result := HexStrToSID(cWStr);
end;
  Mit Zitat antworten Zitat