if (!GetSecurityDescriptorControl(pFileSD, &oldControlBits,
&dwRevision)) {
_tprintf(TEXT("GetSecurityDescriptorControl() failed.")
TEXT("Error %d\n"), GetLastError());
__leave;
}
if (oldControlBits & SE_DACL_AUTO_INHERITED) {
controlBitsOfInterest =
SE_DACL_AUTO_INHERIT_REQ |
SE_DACL_AUTO_INHERITED;
controlBitsToSet = controlBitsOfInterest;
}
else if (oldControlBits & SE_DACL_PROTECTED) {
controlBitsOfInterest = SE_DACL_PROTECTED;
controlBitsToSet = controlBitsOfInterest;
}
if (controlBitsOfInterest) {
if (!_SetSecurityDescriptorControl(&newSD,
controlBitsOfInterest,
controlBitsToSet)) {
_tprintf(TEXT("SetSecurityDescriptorControl() failed.")
TEXT("Error %d\n"), GetLastError());
__leave;
}
}
}
//
// STEP 20: Set the new SD to the File.
//
if (!SetFileSecurity(lpszFileName, secInfo,
&newSD)) {
_tprintf(TEXT("SetFileSecurity() failed. Error %d\n"),
GetLastError());
__leave;
}
fResult = TRUE;
} __finally {
//
// STEP 21: Free allocated memory
//
if (pUserSID)
myheapfree(pUserSID);
if (szDomain)
myheapfree(szDomain);
if (pFileSD)
myheapfree(pFileSD);
if (pNewACL)
myheapfree(pNewACL);
}
return fResult;
}
int _tmain(int argc, TCHAR *argv) {
if (argc < 3) {
_tprintf(TEXT("usage: \"%s\" <FileName> <AccountName>\n"), argv[0]);
return 1;
}
// argv - FileName
// argv - Name of the User or Group account to add access
if (!AddAccessRights(argv, argv, GENERIC_ALL)) {
_tprintf(TEXT("AddAccessRights() failed.\n"));
return 1;
}
else {
_tprintf(TEXT("AddAccessRights() succeeded.\n"));
return 0;
}
}
示例代码中步骤的说明
1. 为用户或组名指定是调用 LookupAccountName 函数以获取安全标识符 (SID)。 LookupAccountName 函数被实际上调用两次, 然后再次以检索帐户信息次以确定需要缓冲区大小,:。 从此获取此 SID 函数用于以后对 AddAccessAllowedACE 函数调用中。 LookupAccountName 函数还提供域位置是找到该用户或组帐户。
注意 如果需要多 SAM 数据库查询来检索所需信息: LookupAccountName 函数会非常昂贵调用。 有关如何获取 SID 的当前用户, 请单击下列文章编号以查看 Microsoft 知识库中相应:
111544 (http://support.microsoft.com/kb/111544/) 如何检索 WindowsNT、 Windows 2000 或 WindowsXP 上当前用户和域名称
有关如何获取已知或内置用户或组, 好的 SID 请单击下列文章编号以查看 Microsoft 知识库中相应:
157234 (http://support.microsoft.com/kb/157234/) 如何处理本地化和重命名用户和组名称
2. GetFileSecurity 函数是用于获取该文件的安全描述符 (SD) 的副本。 实际上调用两次 GetFileSecurity 函数: 次确定需要缓冲区大小, 然后再次以检索 SD.
注意 安全描述符具有两可能格式: 自相关联和绝对。 为自相关联格式, GetFileSecurity 函数返回一个 SD 但 SetFileSecurity 函数期望 SD 以绝对格式。 这是一个原因代码必须创建新 SD 并复制信息, 而不是只修改从 GetFileSecurity 函数 SD 和传递到 SetFileSecurity 函数。 它是可能以调用 MakeAbsoluteSD 函数来执行转换, 但是可能足够空间当前 ACL, 中提到。
3. 通过调用 InitializeSecurityDescriptor 函数初始化新 SD。
4. GetSecurityDescriptorDacl 函数检索到 SD. 中 DACL 指针
5. 调用 GetAclInformation 函数以获取该文件的 DACL 以 ACL_SIZE_INFORMATION 结构的形式大小有关。 当计算新 DACL 的大小以及复制 ACE