PSECURITY_DESCRIPTOR初始化
时间: 2023-09-06 11:07:03 浏览: 71
在 Windows 操作系统中,安全描述符(Security Descriptor,简称 SD)是一种用于描述系统对象(如文件、文件夹、注册表项等)安全属性的数据结构。它包括了许多信息,如所有者、组、访问控制列表(Access Control List,简称 ACL)等。在使用 SD 时,需要先初始化一个 PSECURITY_DESCRIPTOR 结构体。
下面是一个 PSECURITY_DESCRIPTOR 结构体的定义:
```c
typedef struct _SECURITY_DESCRIPTOR {
UCHAR Revision;
UCHAR Sbz1;
SECURITY_DESCRIPTOR_CONTROL Control;
PSID Owner;
PSID Group;
PACL Sacl;
PACL Dacl;
} SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR;
```
其中,`Revision` 字段用于指定 SECURITY_DESCRIPTOR 结构体的版本号;`Control` 字段包含了一些标志位,例如是否启用了自相交的 ACL 等;`Owner` 和 `Group` 字段分别指定了对象的所有者和所属组;`Sacl` 和 `Dacl` 字段分别指定了系统访问控制列表和离散访问控制列表。
初始化一个 PSECURITY_DESCRIPTOR 结构体可以通过以下步骤:
1. 调用 `InitializeSecurityDescriptor` 函数初始化结构体:
```c
PSECURITY_DESCRIPTOR pSD = (PSECURITY_DESCRIPTOR)LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH);
InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION);
```
`InitializeSecurityDescriptor` 函数会初始化一个空的 SECURITY_DESCRIPTOR 结构体,其中 `SECURITY_DESCRIPTOR_REVISION` 是版本号。
2. 指定所有者和所属组。可以使用 `AllocateAndInitializeSid` 函数创建一个新的 SID 对象,并将其分配给所有者和所属组:
```c
PSID pSidOwner = NULL;
PSID pSidGroup = NULL;
SID_IDENTIFIER_AUTHORITY sidAuth = SECURITY_NT_AUTHORITY;
if (!AllocateAndInitializeSid(&sidAuth, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &pSidOwner) ||
!AllocateAndInitializeSid(&sidAuth, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_USERS, 0, 0, 0, 0, 0, 0, &pSidGroup))
{
LocalFree(pSD);
return FALSE;
}
SetSecurityDescriptorOwner(pSD, pSidOwner, FALSE);
SetSecurityDescriptorGroup(pSD, pSidGroup, FALSE);
```
首先,使用 `AllocateAndInitializeSid` 函数创建了两个 SID,一个是管理员组的 SID,另一个是用户组的 SID。然后使用 `SetSecurityDescriptorOwner` 和 `SetSecurityDescriptorGroup` 分别将它们赋值给 SECURITY_DESCRIPTOR 结构体的 `Owner` 和 `Group` 字段。
3. 添加 ACL。可以使用 `InitializeAcl` 函数初始化 ACL,再使用 `AddAccessAllowedAce` 函数向 ACL 中添加 ACE:
```c
PACL pAcl = NULL;
EXPLICIT_ACCESS ea;
DWORD dwRes = 0;
if (AllocateAndInitializeSid(&sidAuth, 1, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_GUESTS, 0, 0, 0, 0, 0, 0, &ea.Trustee.ptstrName))
{
ea.grfAccessPermissions = FILE_GENERIC_READ | FILE_GENERIC_WRITE;
ea.grfAccessMode = SET_ACCESS;
ea.grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT;
ea.Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea.Trustee.TrusteeType = TRUSTEE_IS_GROUP;
dwRes = SetEntriesInAcl(1, &ea, NULL, &pAcl);
if (dwRes != ERROR_SUCCESS)
{
LocalFree(pSD);
FreeSid(pSidOwner);
FreeSid(pSidGroup);
return FALSE;
}
SetSecurityDescriptorDacl(pSD, TRUE, pAcl, FALSE);
FreeSid(ea.Trustee.ptstrName);
}
```
这里使用了一个 `EXPLICIT_ACCESS` 结构体来描述 ACE。`Trustee` 字段是一个 TRUSTEE 结构体,用于指定 ACE 的主体。这里将它设置为了访客组的 SID。`grfAccessPermissions` 字段指定了 ACE 的访问权限,这里设置了读写权限。`grfAccessMode` 字段指定了 ACL 的修改方式,这里设置为了 SET_ACCESS,表示覆盖原有 ACE。`grfInheritance` 字段指定了 ACE 是否应该被继承到子对象。最后,使用 `SetEntriesInAcl` 函数将 ACE 添加到 ACL 中,然后使用 `SetSecurityDescriptorDacl` 函数将 ACL 赋值给 SECURITY_DESCRIPTOR 结构体的 `Dacl` 字段。
4. 释放资源。完成后需要释放先前分配的资源:
```c
LocalFree(pSD);
FreeSid(pSidOwner);
FreeSid(pSidGroup);
```
这里使用了 `LocalFree` 函数释放 SECURITY_DESCRIPTOR 对象,和 `FreeSid` 函数释放所有者、所属组和 ACE 的 SID。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![application/x-rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![application/x-zip](https://img-home.csdnimg.cn/images/20210720083736.png)