![]() |
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:
von IDiskQuotaUser
HRESULT GetSid(
[out] LPBYTE pbSidBuffer, [in] DWORD cbSidBuffer ); 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: ![]() 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; |
AW: byte array to String SID
![]() |
AW: byte array to String SID
Na super, ich verwende
Code:
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:
ConvertSidToStringSid()
Delphi-Quellcode:
Hmm. Ok, klappt. Danke!
var
cBuffer: Cardinal; pBuffer: PByte; begin if Succeeded(user.GetSid(pBuffer, cBuffer)) then ConvertSidToStringSid(PSid(pBuffer), s); 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 13:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz