以下示例从文件中删除自由ACL。如有必要,该文件的所有权将被授予管理员帐户。如果需要,该帐户将启用SE_TAKE_OWNERSHIP_NAME特权。
LPSTR lpszOwnFile = "d:\\ntfs_sample_file";
PSID pSIDAliasAdmins = NULL;
静态SID_IDENTIFIER_AUTHORITY
siaNTAuthority = SECURITY_NT_AUTHORITY;
BOOL FAR PASCAL TakeOwnership()
{
SECURITY_DESCRIPTOR sd;
/*
*初始化一个安全描述符并赋值一个NULL
*自由ACL允许无限制访问。
*将安全描述符分配给文件。
*/
if(!InitializeSecurityDescriptor(& sd,
SECURITY_DESCRIPTOR_REVISION)) {
ErrorHandler("InitializeSecurityDescriptor");
return FALSE;
}
if(!SetSecurityDescriptorDacl(& sd,
TRUE,
(PACL) NULL,
FALSE)) {
ErrorHandler("SetSecurityDescriptorDacl");
return FALSE;
}
如果(SetFileSecurity(lpszOwnFile,id
DACL_SECURITY_INFORMATION,
&sd))
return TRUE;
其他
ErrorHandler("SetFileSecurity1");
/*
*如果上述调用SetFileSecurity失败,请创建
*管理员SID并使用它来设置所有者
*安全描述符。
*/
如果(!AllocateAndInitializeSid( siaNTAuthority,
2,/ * subauthority count * /
/ *第一次授权* /
SECURITY_BUILTIN_DOMAIN_RID,
/ *第二次次授权* /
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
{} PSIDAliasAdmins 989796005)){
ErrorHandler("AllocateAndInitializeSid");
return FALSE;
}
if(!SetSecurityDescriptorOwner(& sd,
pSIDAliasAdmins,
FALSE)) {
ErrorHandler("SetSecurityDescriptorOwner");
FreeSid(pSIDAliasAdmins);
return FALSE;
}
/*
*如果以下调用SetFileSecurity失败,
*在访问令牌中启用SE_TAKE_OWNERSHIP_NAME
*当前进程,再试一次。
*/
如果(!SetFileSecurity(lpszOwnFile,id
OWNER_SECURITY_INFORMATION,
&sd)) {
ErrorHandler("SetFileSecurity2");
if(!AssertTakeOwnership(TRUE)){/ * local * /
MessageBox(NULL,“必须以管理员身份登录”,
"AssertTakeOwnership", MB_OK);
FreeSid(pSIDAliasAdmins);
return FALSE;
}
如果(!SetFileSecurity(lpszOwnFile,id
OWNER_SECURITY_INFORMATION,
&sd)) {
MessageBox(NULL,“必须以管理员身份登录”,
"SetFileSecurity", MB_OK);
FreeSid(pSIDAliasAdmins);
return FALSE;
}
}
/*
*管理员现在是该文件的所有者。
*再次尝试分配NULL ACL。
*/
如果(SetFileSecurity(lpszOwnFile,id
DACL_SECURITY_INFORMATION,
&sd)) {
MessageBox(NULL, "Added NULL DACL; protection removed",
"SetFileSecurity", MB_OK);
AssertTakeOwnership(FALSE);
return TRUE;
}
else {
AssertTakeOwnership(FALSE);
ErrorHandler("SetFileSecurity3");
return FALSE;
}
}
BOOL FAR PASCAL AssertTakeOwnership(BOOL fEnable)
{
HANDLE hToken;
LUID TakeOwnershipValue;
TOKEN_PRIVILEGES tkp;
/ *检索访问令牌的句柄。*/
if(!OpenProcessToken(GetCurrentProcess(),en
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
& hToken)){
ErrorHandler("OpenProcessToken");
return FALSE;
}
/*
*启用SE_TAKE_OWNERSHIP_NAME特权或
*禁用所有权限,具体取决于fEnable
*标志。
*/
if(fEnable){
if(!LookupPrivilegeValue((LPSTR)NULL,
SE_TAKE_OWNERSHIP_NAME,
& TakeOwnershipValue)){
ErrorHandler("LookupPrivilegeValue");
return FALSE;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = TakeOwnershipValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,
FALSE,
{} 989796005现场,
sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES) NULL,
(PDWORD) NULL);
/*
* AdjustTokenPrivileges的返回值不能
*进行测试。
*/
if (GetLastError() != ERROR_SUCCESS) {
ErrorHandler("AdjustTokenPrivileges");
return FALSE;
}
}
else {
AdjustTokenPrivileges(hToken,
TRUE,/ *禁用所有权限* /
(PTOKEN_PRIVILEGES) NULL,
(DWORD) 0,
(PTOKEN_PRIVILEGES) NULL,
(PDWORD) NULL);
/*
* AdjustTokenPrivileges的返回值不能
*进行测试。
*/
if (GetLastError() != ERROR_SUCCESS) {
ErrorHandler("AdjustTokenPrivileges");
return FALSE;
}
}
return TRUE;
}