在 C++ 中修改对象的 ACL
以下示例将一个 访问控制项 (ACE) 添加到对象的自由 访问控制列表 (DACL) 。
AccessMode 参数确定新 ACE 的类型,以及新 ACE 如何与指定受托人的任何现有 ACE 相结合。 在 AccessMode 参数中使用GRANT_ACCESS、SET_ACCESS、DENY_ACCESS或REVOKE_ACCESS标志。 有关这些标志的信息,请参阅 ACCESS_MODE。
类似的代码可用于使用 系统访问控制列表 (SACL) 。 在 GetNamedSecurityInfo 和 SetNamedSecurityInfo 函数中指定SACL_SECURITY_INFORMATION来获取和设置对象的 SACL。 在 AccessMode 参数中使用SET_AUDIT_SUCCESS、SET_AUDIT_FAILURE和REVOKE_ACCESS标志。 有关这些标志的信息,请参阅 ACCESS_MODE。
使用此代码将 特定于对象的 ACE 添加到目录服务对象的 DACL。 若要在特定于对象的 ACE 中指定 GUID,请将 TrusteeForm 参数设置为 TRUSTEE_IS_OBJECTS_AND_NAME 或 TRUSTEE_IS_OBJECTS_AND_SID,并将 pszTrustee 参数设置为指向 OBJECTS_AND_NAME 或 OBJECTS_AND_SID 结构的指针。
此示例使用 GetNamedSecurityInfo 函数获取现有 DACL。 然后,它用有关 ACE 的信息填充 EXPLICIT_ACCESS 结构,并使用 SetEntriesInAcl 函数将新 ACE 与 DACL 中的任何现有 ACE 合并。 最后,该示例调用 SetNamedSecurityInfo 函数,以将新的 DACL 附加到对象 的安全描述符 。
#include <windows.h>
#include <stdio.h>
DWORD AddAceToObjectsSecurityDescriptor (
LPTSTR pszObjName, // name of object
SE_OBJECT_TYPE ObjectType, // type of object
LPTSTR pszTrustee, // trustee for new ACE
TRUSTEE_FORM TrusteeForm, // format of trustee structure
DWORD dwAccessRights, // access mask for new ACE
ACCESS_MODE AccessMode, // type of ACE
DWORD dwInheritance // inheritance flags for new ACE
)
{
DWORD dwRes = 0;
PACL pOldDACL = NULL, pNewDACL = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
EXPLICIT_ACCESS ea;
if (NULL == pszObjName)
return ERROR_INVALID_PARAMETER;
// Get a pointer to the existing DACL.
dwRes = GetNamedSecurityInfo(pszObjName, ObjectType,
DACL_SECURITY_INFORMATION,
NULL, NULL, &pOldDACL, NULL, &pSD);
if (ERROR_SUCCESS != dwRes) {
printf( "GetNamedSecurityInfo Error %u\n", dwRes );
goto Cleanup;
}
// Initialize an EXPLICIT_ACCESS structure for the new ACE.
ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
ea.grfAccessPermissions = dwAccessRights;
ea.grfAccessMode = AccessMode;
ea.grfInheritance= dwInheritance;
ea.Trustee.TrusteeForm = TrusteeForm;
ea.Trustee.ptstrName = pszTrustee;
// Create a new ACL that merges the new ACE
// into the existing DACL.
dwRes = SetEntriesInAcl(1, &ea, pOldDACL, &pNewDACL);
if (ERROR_SUCCESS != dwRes) {
printf( "SetEntriesInAcl Error %u\n", dwRes );
goto Cleanup;
}
// Attach the new ACL as the object's DACL.
dwRes = SetNamedSecurityInfo(pszObjName, ObjectType,
DACL_SECURITY_INFORMATION,
NULL, NULL, pNewDACL, NULL);
if (ERROR_SUCCESS != dwRes) {
printf( "SetNamedSecurityInfo Error %u\n", dwRes );
goto Cleanup;
}
Cleanup:
if(pSD != NULL)
LocalFree((HLOCAL) pSD);
if(pNewDACL != NULL)
LocalFree((HLOCAL) pNewDACL);
return dwRes;
}