第三贴 删除NTFS格式下目录继承的权限

vabug 2006-04-21 11:27:17
BOOL bRetval = FALSE;

HANDLE hToken = NULL;
PSID pSIDAdmin = NULL;
PSID pSIDEveryone = NULL;
PACL pACL = NULL;
SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY;
const int NUM_ACES = 1;
EXPLICIT_ACCESS ea[NUM_ACES];
DWORD dwRes;

// Specify the DACL to use.
// Create a SID for the Everyone group.
/* if (!AllocateAndInitializeSid(&SIDAuthWorld, 1,
SECURITY_WORLD_RID,
0,
0, 0, 0, 0, 0, 0,
&pSIDEveryone))
{
printf("AllocateAndInitializeSid (Everyone) error %u\n", GetLastError());
goto Cleanup;
}*/

pSIDEveryone = GetSid(L"EveryOne", 0);

// Create a SID for the BUILTIN\Administrators group.
/* if (!AllocateAndInitializeSid(&SIDAuthNT, 2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&pSIDAdmin))
{
printf("AllocateAndInitializeSid (Admin) error %u\n", GetLastError());
goto Cleanup;
}*/

ZeroMemory(&ea, NUM_ACES * sizeof(EXPLICIT_ACCESS));

// Set read access for Everyone.
ea[0].grfAccessPermissions = GENERIC_ALL;
ea[0].grfAccessMode = REVOKE_ACCESS;
ea[0].grfInheritance = INHERITED_ACE;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_INVALID;
ea[0].Trustee.ptstrName = (LPTSTR) pSIDEveryone;


if (ERROR_SUCCESS != SetEntriesInAcl(NUM_ACES,
ea,
NULL,
&pACL))
{
printf("Failed SetEntriesInAcl\n");
goto Cleanup;
}

// Try to modify the object's DACL.
dwRes = SetNamedSecurityInfo(
lpszOwnFile, // name of the object
SE_FILE_OBJECT, // type of object
DACL_SECURITY_INFORMATION, // change only the object's DACL
NULL, NULL, // do not change owner or group
pACL, // DACL specified
NULL); // do not change SACL

if (ERROR_SUCCESS == dwRes)
{
printf("Successfully changed DACL\n");
bRetval = TRUE;
// No more processing needed.
goto Cleanup;
}
if (dwRes != ERROR_ACCESS_DENIED)
{
printf("First SetNamedSecurityInfo call failed: %u\n", dwRes);
goto Cleanup;
}

// If the preceding call failed because access was denied,
// enable the SE_TAKE_OWNERSHIP_NAME privilege, create a SID for
// the Administrators group, take ownership of the object, and
// disable the privilege. Then try again to set the object's DACL.

// Open a handle to the access token for the calling process.
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES,
&hToken))
{
printf("OpenProcessToken failed: %u\n", GetLastError());
goto Cleanup;
}

// Enable the SE_TAKE_OWNERSHIP_NAME privilege.
if (!SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, TRUE))
{
printf("You must be logged on as Administrator.\n");
goto Cleanup;
}

// Set the owner in the object's security descriptor.
dwRes = SetNamedSecurityInfo(
lpszOwnFile, // name of the object
SE_FILE_OBJECT, // type of object
OWNER_SECURITY_INFORMATION, // change only the object's owner
pSIDAdmin, // SID of Administrator group
NULL,
NULL,
NULL);

if (dwRes != ERROR_SUCCESS)
{
printf("Could not set owner. Error: %u\n", dwRes);
goto Cleanup;
}

// Disable the SE_TAKE_OWNERSHIP_NAME privilege.
if (!SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, FALSE))
{
printf("Failed SetPrivilege call unexpectedly.\n");
goto Cleanup;
}

// Try again to modify the object's DACL, now that we are the owner.
dwRes = SetNamedSecurityInfo(
lpszOwnFile, // name of the object
SE_FILE_OBJECT, // type of object
DACL_SECURITY_INFORMATION, // change only the object's DACL
NULL, NULL, // do not change owner or group
pACL, // DACL specified
NULL); // do not change SACL

if (dwRes == ERROR_SUCCESS)
{
printf("Successfully changed DACL\n");
bRetval = TRUE;
}
else
{
printf("Second SetNamedSecurityInfo call failed: %u\n", dwRes);
}

Cleanup:

if (pSIDAdmin)
FreeSid(pSIDAdmin);

/* if (pSIDEveryone)
FreeSid(pSIDEveryone);*/

if (pACL)
LocalFree(pACL);

if (hToken)
CloseHandle(hToken);

上述方法只能删除自己添加的权限,不能删除从父目录继承过来的权限
该如何实现不从父目录继承权限呢????
...全文
381 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
vabug 2006-04-22
  • 打赏
  • 举报
回复
ATL 7.0增加了权限类 简单多了
谢谢jiangsheng(蒋晟.Net[MVP])
vabug 2006-04-22
  • 打赏
  • 举报
回复
CSid sidDenied;
sidDenied.LoadAccount(L"ADMINISTRATORS");
CDacl dacl;
CSecurityDesc desc;
dacl.RemoveAces(sidDenied);
desc.SetDacl(dacl);
desc.SetControl(SE_OWNER_DEFAULTED|
SE_GROUP_DEFAULTED|
SE_DACL_DEFAULTED|
SE_SACL_PRESENT|
SE_SACL_DEFAULTED|
SE_DACL_AUTO_INHERIT_REQ|
SE_SACL_AUTO_INHERIT_REQ|
SE_SELF_RELATIVE, SE_DACL_PROTECTED);
SetFileSecurity(lpszOwnFile,DACL_SECURITY_INFORMATION|GROUP_SECURITY_INFORMATION,&desc);
dch4890164 2006-04-22
  • 打赏
  • 举报
回复
不会吧
猩猩大哥,你这么短就可以搞定了。
蒋晟 2006-04-22
  • 打赏
  • 举报
回复
if you do not want to inherit permissions from the parent
directory, you need to use the SE_DACL_PROTECTED flag.

if you want to save a lot of code, you can use SDDL (security
descriptor description language). The security descriptor creation
code can be replaced by a single call:

ConvertStringSecurityDescriptorToSecurityDescriptor(
L"O:COD:(A;;FA;;;WD)",
SDDL_REVISION_1,
&pSD,
&dwSize
);
SDDL is documented in MSDN.

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧