Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   byte array to String SID (https://www.delphipraxis.net/155783-byte-array-string-sid.html)

cherry 8. Nov 2010 11:03

Delphi-Version: 2009

byte array to String SID
 
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;

Luckie 8. Nov 2010 11:08

AW: byte array to String SID
 
http://www.michael-puff.de/Artikel/SID.shtml Im Demo ist der Code.

cherry 8. Nov 2010 12:52

AW: byte array to String SID
 
Na super, ich verwende
Code:
ConvertSidToStringSid()
bereits in meinem Code (andere Stelle) und die war auch mein erster Gedanke. Ich habe es jedoch nie versucht, weil ich nicht damit gerechnet habe, dass folgender aufruf funktioniert:

Delphi-Quellcode:
var
  cBuffer: Cardinal;
  pBuffer: PByte;
begin

  if Succeeded(user.GetSid(pBuffer, cBuffer)) then
           ConvertSidToStringSid(PSid(pBuffer), s);
Hmm. Ok, klappt. Danke!

Trotzdem hat ja mein Code auch funktioniert. Kannst du mir die Frage beantworten, was an der Stelle gemacht werden sollte???


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz