|
|
|

| | | | | | | | |  |
 | 
 | 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.
|
|
 |
 | |  |
|
|