Code source
Code source

  Présentation
  Unités exemple gratuites
  Unités commercialisées
  Conditions d'utilisation
  Comment acheter
  Vendez vos codes
Unités commercialisées

  LRJ_DosDevice
  LRJ_FileMapped
  LRJ_ModifDateTime
  LRJ_ShellUtils
  LRJ_TokenAPI
  LRJ_WinACL
  LRJ_WinBrowseDialog
  LRJ_WinCreateProcess
  LRJ_WinDesktop
  LRJ_WinDirectories
  LRJ_WinDocRecents
  LRJ_WinDrives
  LRJ_WinFavorisWeb
  LRJ_WinFiles
  LRJ_WinIconNotifArea
  LRJ_WinInternetShortcut
  LRJ_WinMenuFolder
  LRJ_WinModule
  LRJ_WinNetApi
  LRJ_WinNetLocalGroups
  LRJ_WinNetUsers
  LRJ_WinPrivileges
  LRJ_WinProcess
  LRJ_WinRecycleBin
  LRJ_WinRegion
  LRJ_WinRegAppPath
  LRJ_WinShellLink
  LRJ_WinShellUI
  LRJ_WinSID
  LRJ_WinStation
  LRJ_WinTokenGroups
  LRJ_WinTrackChangeDir
  LRJ_WinVolumes
  LRJ_WinWorkingSet

   Accueil | GlobalDesk | Code source Delphi | Développements | Votre compte | Contact   

Code source : unité LRJ_WinSID




      
Description : cette unité contient l'objet LRJ_TWinSID qui permet de charger un SID de différentes façons, de réaliser des tests sur ce SID, d'en extraire différentes informations ou de le convertir en sa représentation texte. D'un point de vue de la sécurité Windows, le SID peut être extrait d'un objet, modifié puis réinséré dans l'objet.

L'unité est livrée avec une application de démonstration ( voir description plus loin ) qui utilise des fonctionnalités de l'objet LRJ_TWinSID. Les codes de l'application sont livrés avec l'unité pour illustrer comment utiliser l'objet LRJ_TWinSID. L'application de démonstration utilise les unités LRJ_GridsPlus et LRJ_WindowsPlus non livrées avec l'application mais téléchargeables gratuitement sur ce site.


L'unité LRJ_WinSID met en oeuvre les fonctions de Windows suivantes :
             AllocateAndInitializeSid
CreateWellKnownSid
EqualDomainSid
EqualPrefixSid
EqualSid
FreeSid
GetLengthSid
GetNamedSecurityInfo
GetSecurityInfo
GetSidIdentifierAuthority
GetSidSubAuthority
GetSidSubAuthorityCount
GetWindowsAccountDomainSid
IsValidSid
IsWellKnownSid
LookupAccountName
LookupAccountSid
SetNamedSecurityInfo
SetSecurityInfo

Déclarations publiques de l'unité  I  Télécharger l'application de démonstration  I  Exemples d'utilisations

Utilise les unités : Windows et SysUtils.

Version : 1.5 du 10.05.2009
Auteur : Laurent Hède
Copyright : LorenJo

Nombre de lignes : 1222

Réalisée sous : Delphi 6

Systèmes compatibles : NT4, 2000, XP, Vista, serveurs

Prix : 234.00 € H.T.


Déclarations publiques de l'unité :

unit LRJ_WinSID;
   ......
interface
                      uses
                      Windows,
                      SysUtils;


function LRJ_ConvertSidToStringSid(const ASID: PSID): string; // à partir win 2000
function LRJ_ConvertStringSidToSid(const AStringSID: string): PSID; // à partir win 2000, Détruire le PSID par LocalFree
                                                                                              //après utilisation
function LRJ_GetWindowsAccountDomainSid(const pSid: PSID ; const ppDomainSid: PSID; var cbSid: DWORD ): BOOL; // à partir win 2000
function LRJ_EqualDomainSid(const pSid1: PSID ; const pSid2: PSID ; var pfEqual: BOOL): BOOL; // à partir win 2000

   ......

function LRJ_GetSIDFromNamedObject(const ObjectName: string; const ObjectType: LRJ_SE_OBJECT_TYPE; const ppSID: LRJ_PPSID;
             const ATypeSID: LRJ_TTypeSIDLoad; var ppSecurityDescriptor: LRJ_PRelativeSecurityDescriptor): DWORD; //use localfree to
                                                                                            //release ppSecurityDescriptor
function LRJ_GetSIDFromHandleObject(const handle: THandle; const ObjectType: LRJ_SE_OBJECT_TYPE; const ppSID: LRJ_PPSID;
             const ATypeSID: LRJ_TTypeSIDLoad; var ppSecurityDescriptor: LRJ_PRelativeSecurityDescriptor): DWORD; //use localfree to
                                                                                            //release ppSecurityDescriptor
function LRJ_SetSIDToHandleObject(const handle: THandle; const ObjectType: LRJ_SE_OBJECT_TYPE; const ASID: PSID;
             const ATypeSID: LRJ_TTypeSIDLoad): DWORD;
function LRJ_SetSIDToNamedObject(const AObjectName: string; const ObjectType: LRJ_SE_OBJECT_TYPE; const ASID: PSID;
             const ATypeSID: LRJ_TTypeSIDLoad): DWORD;
   .....

function LRJ_IsWellKnownSid(const pSid: PSID ; const WellKnownSidType : WELL_KNOWN_SID_TYPE): BOOL; // à partir win 2000
function LRJ_CreateWellKnownSid(const WellKnownSidType : WELL_KNOWN_SID_TYPE; const DomainSid : PSID ; const pSid: PSID ;
                                             var cbSid: DWORD ): BOOL; // à partir win 2000

   ......

function LRJ_GroupAttributesIntToStr(const AGroupAttributes: DWORD): string;

   ......

function LRJ_GetNameUseString(const ATypeNameUse: LRJ_TTypeSIDNameUse): string; overload;
function LRJ_GetNameUseString(const ATypeNameUse: SID_NAME_USE): string; overload;

type

   //------------OBJET----------------------------
LRJ_TWinSID = class(TObject)
   private //-----------PRIVATE--------------------------
   ......
   procedure FreeSid;
   function IfAssigned: boolean;
   function IfValid: boolean;
   function IfEqualSID(const ASID: PSID): boolean;
   function IfEqualPrefixSID(const ASID: PSID): boolean;
   function GetStringSID: string;
   function GetNameUseTyped: LRJ_TTypeSIDNameUse;
   function GetNameUseString(const ATypeNameUse: LRJ_TTypeSIDNameUse): string;
   function GetSize: integer;
   function GetCountSubAuthority: Byte;
   function GetRIDSubAuthority(const AIndex: Byte): DWORD;
   function GetTypeIdentifierAuthority: LRJ_TTypeIdentifierAuthority;
   function IfWellKnownSid(const AWellKnowSideType: WELL_KNOWN_SID_TYPE): boolean; // A partir de XP ou Server 2003, sinon result = false
   function IfEqualDomainSid(const ASID: PSID): boolean; // A partir de XP ou Server 2003, sinon result = false
   function GetDomainSID: LRJ_TWinSID; // A partir d'XP ou Server 2003, sinon GetDomainSID.SID = invalide SID
   function LigneInfoSid: string;
        // différentes function pour charger le SID
   function LoadByName(const ASystemName, ADomainAndName: string): boolean;
   function AssignSID(const ASID: PSID): boolean;
   function CreateSID(const ATypeIdentifierAuthority: LRJ_TTypeIdentifierAuthority;
                      const ACountOfSubAuthority: DWORD;
                      const ATabOfSubAuthority: LRJ_TTabSubAuthority): boolean;
   function CreateByStringSid(const AStringSID: string): boolean;
   function CreateByWellKnownSid(const AWellKnowSideType: WELL_KNOWN_SID_TYPE; const ADomainSID: PSID): boolean; // complet à partir de XP
                                                                                                     //ou Server 2003
   // utilise GetSecurityInfo, voir la doc de cette function pour savoir de quels objets on peut charger
   function LoadFromHandle(const ATypeObject: LRJ_SE_OBJECT_TYPE; const ATypeSID: LRJ_TTypeSIDLoad; const AHandle: THandle): DWORD;
   // utilise GetNamedSecurityInfo, voir la doc de cette function pour savoir de quels objets on peut charger
   function LoadFromObject(const ATypeObject: LRJ_SE_OBJECT_TYPE ; const ATypeSID: LRJ_TTypeSIDLoad; const AObjectName: string) : DWORD;
   //pour mettre le SID dans l'objet d'origine ou un autre 
   function SaveToObject: DWORD; // utilisable si on a chargé le SID avec LoadFromObject ou LoadFromHandle // 0 = true,
                                                                                                    //<> 0 = error (result = error)
   function SaveToHandleObject(const ATypeObject: LRJ_SE_OBJECT_TYPE; const ATypeSID: LRJ_TTypeSIDLoad;
                                                               const AHandle: THandle): DWORD; // 0 = true, <> 0 = error (result = error)
   function SaveToNamedObject(const ATypeObject: LRJ_SE_OBJECT_TYPE; const ATypeSID: LRJ_TTypeSIDLoad;
                                                            const AObjectName: string): DWORD; // 0 = true, <> 0 = error  (result = error)
   //propriétés
   property SID: PSID read MOSID write SetSid;
   property DomainName: string read MODomainName;
   property SystemName: string read MOSystemName write SetSystemName;
   property AccountName: string read MOAccountName; // AccountName = name
   property NameUse: DWORD  read MONameUse;
   end;//-----------FIN--------------------------



Application de démonstration

L'onglet "LookupAccountName" permet de charger un SID à partir d'un nom d'utilisateur ou du nom d'un WellKnowSID. Il faut saisir le nom du système sur lequel le nom va être recherché et le nom éventuellement précédé du domaine sous la forme domaine\nom dans ce cas. Si le nom du système reste vide, la recherche s'effectue sur la machine et le nom du domaine n'est nécessaire que lorsque le nom du système est renseigné. Cliquer ensuite sur "Lookup" et la grille est chargée avec les informations du SID. Cet onglet représente le chargement d'un SID à partir de la fonction LookupAccountName.
L'onglet "LoadByStringSID" permet de charger un SID à partir de sa représentation sous forme de texte. Il faut saisir le SID sous forme de texte puis cliquer sous "Load" et la grille est chargée avec des informations représentables sous forme texte.
L'onglet "CreateWellKnowSID" permet de charger un WellKnowSID à partir de l'énumération WELL_KNOWN_SID_TYPE. Il faut saisir un indice représentant un type de l'énumération WELL_KNOWN_SID_TYPE sous forme de chiffre et cliquer sur "Load" et la grille est chargée avec les informations concernant ce WellKnowSID.
L'onglet "Load from object" permet de charger les SID owner et group d'un objet. Il faut sélectionner le type de l'objet et le nom complet de l'objet puis cliquer sur "Load" pour charger les SID Owner et Group de cet objet. Pour la sémantique du nom de l'objet, voir la documentation de la fonction GetNamedSecurityInfo de Windows.


Exemples d'utilisations

Charger un SID à partir d'un nom d'utilisateur, de groupe, etc sur une machine locale ou un domaine contrôlant la machine
var
  zSID: LRJ_TWinSID;
begin
zSID := LRJ_TWinSID.create;
zSID.LoadByName('', '"Nom de l'utilisateur, du groupe, ..."');
zSID.Free;

Charger un SID à partir d'un nom d'utilisateur, de groupe, etc sur une machine distante hors domaine
var
  zSID: LRJ_TWinSID;
begin
zSID := LRJ_TWinSID.create;
zSID.LoadByName('"Nom de la machine distante"', '"Nom de l'utilisateur, du groupe, ..."');
zSID.Free;

Charger un SID à partir d'un PSID
var
  zSID: LRJ_TWinSID;
begin
zSID := LRJ_TWinSID.create;
zSID.AssignSID(PSID);

Charger un WellKnowSID à partir d'un type WELL_KNOWN_SID_TYPE
var
  zSID: LRJ_TWinSID;
begin
zSID := LRJ_TWinSID.create;
zSID.CreateByWellKnownSid(WinBuiltinAdministratorsSid, nil);//'S-1-5-32-544'

Charger un SID à partir d'un string SID
var
  zSID: LRJ_TWinSID;
begin
zSID := LRJ_TWinSID.create;
zSID.CreateByStringSid('S-1-5-21-299502267-725345543-1801674531-501');

Comparer 1 SID avec un SID chargé
if zWinSID.IfEqualSID(zPSID) then
  begin
  end;

Savoir si un SID chargé correspond à un WellKnowSID
if zWinSID.IfWellKnownSid(WinBuiltinAdministratorsSid) then
  begin
  end;

Connaître la représentation string d'un SID
var
  zSID: LRJ_TWinSID;
begin
zSID := LRJ_TWinSID.create;
zSID.AssignSID(PSID);
Edit1.text := zSID.GetStringSID;

Connaître le nom du domaine associé à un SID
var
  zSID: LRJ_TWinSID;
begin
zSID := LRJ_TWinSID.create;
zSID.AssignSID(PSID);
Edit1.text := zSID.DomainName;

Connaître le nom d'utilisateur, de groupe, d'alias, etc.. associé à un SID
var
  zSID: LRJ_TWinSID;
begin
zSID := LRJ_TWinSID.create;
zSID.AssignSID(PSID);
Edit1.text := zSID.AccountName;

Connaître le type associé à un SID (utilisateur, groupe, WellKnowSID, etc...
var
  zSID: LRJ_TWinSID;
begin
zSID := LRJ_TWinSID.create;
zSID.AssignSID(PSID);
Edit1.text := zSID.GetNameUseString(zSID.GetNameUseTyped);

Savoir si un utilisateur est du même type qu'un autre utilisateur représenté par son SID
var
  zSID: LRJ_TWinSID;
begin
zSID := LRJ_TWinSID.create;
zSID.AssignSID(PSIDpremierUtilisateur);
if zSID.IfEqualPrefixSID(PSIDsecondUtilisateur) then result:= true;

Vous n'avez pas trouvé d'exemple répondant à votre problématique ?
Cliquez sur ce lien.


 Accueil | GlobalDesk | Code source Delphi | Développements | Votre compte | Contact 
Copyright © LorenJo 2000-2009    Notice légale