概要
本文演示如何向文件添加 " 访问 " 允许访问控制项 (ACE)。
更多信息
当访问允许 ACE 添加到文件自由访问控制列表 (DACL), 相应用户或组帐户与 ACE 由系统附带对该文件允许访问。 在大多数情况下, 该文件的 DACL 是不足以添加其他 ACE。 因此, 非常需要创建新的访问控制列表 (ACL) 并复制该文件的现有 DACL 首选顺序中 ACE。 新 DACL 可再替换旧 DACL 文件安全描述符 (SD) 中。 在以下示例代码中详细解释此过程:
对于 WindowsNT 版本 4.0 和更早版本, 的 ACE 首选顺序非常简单。 在 DACL, 所有访问拒绝 ACE 应之前任何访问允许 ACE。 因引入了对象特有 ACE 和自动继承用于 Windows 2000 或更高版本, ACE 的正确顺序是更复杂。
下面描述首选顺序对于 Windows 2000 或更高版本: • 若要确保通过继承 ACE, 非继承 ACE 具有优先级放置所有非继承 ACE 在组之前任何继承 ACE。 非继承访问拒绝 ACE, 无论任何继承 ACE 允许访问实施此排序确保, 例如。
• 非继承 ACE 继承 ACE, 以及组内顺序 ACE 根据 ACE 键入,: 作为下显示 • 访问拒绝 ACE, 适用于对象本身。
• 适用于 subobject 对象, 如属性设置或属性访问拒绝 ACE。
• 允许访问 ACE, 适用于对象本身
• 适用于 subobject 对象访问允许 ACE
用于将 ACE 添加到 DACL 低级访问控制 API 执行不强制首选顺序。 AddAce 函数在 ACL 中指定位置添加 ACE。 AddAccessAllowedAce 函数将 ACE 添加到末尾的 ACL。 因此, 它是呼叫者责任以确保首选顺序中添加 ACE。 有关 DACL, 中 ACE 的顺序请访问 Microsoft Developer Network (MSDN) Web 站点:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthz/security/order_of_aces_in_a_dacl.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthz/security/order_of_aces_in_a_dacl.asp)
示例代码
下列示例代码演示所需要访问允许 ACE 添加到一个文件的 DACL 基本步骤。 注释是代码中步骤 1 - 21 详细末尾本文中讨论。 #include <windows.h>
#include <tchar.h>
#include <stdio.h>
#define myheapalloc(x) (HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, x))
#define myheapfree(x) (HeapFree(GetProcessHeap(), 0, x))
typedef BOOL (WINAPI *SetSecurityDescriptorControlFnPtr)(
IN PSECURITY_DESCRIPTOR pSecurityDescriptor,
IN SECURITY_DESCRIPTOR_CONTROL ControlBitsOfInterest,
IN SECURITY_DESCRIPTOR_CONTROL ControlBitsToSet);
BOOL AddAccessRights(TCHAR *lpszFileName, TCHAR *lpszAccountName,
DWORD dwAccessMask) {
// SID variables.
SID_NAME_USE snuType;
TCHAR * szDomain = NULL;
DWORD cbDomain = 0;
LPVOID pUserSID = NULL;
DWORD cbUserSID = 0;
// File SD variables.
PSECURITY_DESCRIPTOR pFileSD = NULL;
DWORD cbFileSD = 0;
// New SD variables.
SECURITY_DESCRIPTOR newSD;
// ACL variables.
PACL pACL = NULL;
BOOL fDaclPresent;
BOOL fDaclDefaulted;
ACL_SIZE_INFORMATION AclInfo;
// New ACL variables.
PACL pNewACL = NULL;
DWORD cbNewACL = 0;
// Temporary ACE.
LPVOID pTempAce = NULL;
UINT CurrentAceIndex = 0;
UINT newAceIndex = 0;
// Assume function will fail.
BOOL fResult = FALSE;
BOOL fAPISuccess;
SECURITY_INFORMATION secInfo = DACL_SECURITY_INFORMATION;
// New APIs available only in Windows 2000 and above for setting
// SD control
SetSecurityDescriptorControlFnPtr _SetSecurityDescriptorControl = NULL;
__try {
//
// STEP 1: Get SID of the account name specified.
//
fAPISuccess