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;