Einzelnen Beitrag anzeigen

Benutzerbild von cherry
cherry

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

byte array to String SID

  Alt 8. Nov 2010, 11:03
Delphi-Version: 2009
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;
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat