AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

byte array to String SID

Offene Frage von "cherry"
Ein Thema von cherry · begonnen am 8. Nov 2010 · letzter Beitrag vom 8. Nov 2010
Antwort Antwort
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
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: byte array to String SID

  Alt 8. Nov 2010, 11:08
http://www.michael-puff.de/Artikel/SID.shtml Im Demo ist der Code.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

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

AW: byte array to String SID

  Alt 8. Nov 2010, 12:52
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???
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:09 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