Hi
Mit IDiskQuotaControl und IEnumDiskQuotaUsers ist es möglich Die Quota-Einstellungen aller Benutzer auf einem bestimmten Laufwerk aufzulisten. Nun kann es aber sein, dass einige Namen nicht aufgelöst werden können (da zB. der Benutzer nicht mehr existiert). Nun möchte ich in solchen Fällen die SID anzeigen lassen. Dafür gibt es folgende Funktion:
Code:
HRESULT GetSid(
[out] LPBYTE pbSidBuffer,
[in] DWORD cbSidBuffer
);
von IDiskQuotaUser
Dies gibt mir dann ein array of byte zurück. Aus diesem Array will ich die SID in einen String umwandeln. Dazu habe ich einige Beispiele im Netz gefunden, leider kaum kommentiert oder dokumentiert. Ich habe folgende Implementation versucht in Delphi zu übersetzen:
http://netomatix.com/GetUserSid.aspx
Der Code sieht wie folgt aus, und funktioniert soweit auch. Nur gibt es eine Stelle die ich nicht testen konnte und keine Ahnung habe für was die ist?! Diese fragliche Stelle ist markiert mit "FRAGLICHE STELLE".
Für mich sieht das so aus, als wenn das Byte[2] oder [3] nicht die Zahl 0 enthält, wird statt dem "Identifier Authority" die Bytes [2] - [7] als Hexcode dargestellt.
Nun meine Frage, für was ist das gut und wann könnte ein solcher Fall eintreffen. >> evt. habe ich die String Formatierung (Format() <--> String.Format) aus C# nicht richtig übersetzt?!
Delphi-Quellcode:
{******************************************************************************}
// Convert Byte Array To String SID
{******************************************************************************}
function ConvertByteArrayToSid(byteArray: TSidByteArray): String;
var
subAuthorityCount: ShortInt;
strAuth: string;
iVal: Int64;
idxAuth: Integer;
I: Integer;
iSubAuth: Cardinal;
begin
result := 'S-';
// sid revision
result := result + IntToStr(byteArray[0]);
subAuthorityCount := Int16(byteArray[1]);
// six bytes for SID authority value.
if ((byteArray[2] <> 0) or (byteArray[3] <> 0)) then // FRAGLICHE STELLE
strAuth := Format('%2x%2x%2x%2x%2x%2x',
[byteArray[2],
byteArray[3],
byteArray[4],
byteArray[5],
byteArray[6],
byteArray[7]]) // END DER FRAGLICHEN STELLE
else
begin
iVal := Int32(byteArray[7]) + Int32(byteArray[6] shl 8) + Int32(byteArray[5] shl 16) + Int32(byteArray[4] shl 24);
strAuth := '-'+IntToStr(iVal);
end;
result := result + strAuth;
// sub authority
idxAuth := 0;
for I := 0 to subAuthorityCount - 1 do
begin
idxAuth := 8 + I * 4;
iSubAuth := Int32(byteArray[idxAuth])+Int32(byteArray[idxAuth+1] shl 8)+Int32(byteArray[idxAuth+2] shl 16)+Int32(byteArray[idxAuth+3] shl 24);
result := result + '-' + IntToStr(iSubAuth);
end;
end;