删除/修改 ACL 中继承的 ACE (Windows)
Remove/Modify an inherited ACE in an ACL (Windows)
我正在尝试修改目录(及其子目录)上的现有ACL以删除内置用户组的写入权限。 目录从其父目录继承此特定权限。 我尝试使用 AtlSetDacl() 设置新的 ACL,但这并没有清除继承的写入权限。 片段:
ATL::CDacl dacl;
ATL::AtlGetDacl(directoryName.c_str(), SE_FILE_OBJECT, &dacl);
UINT aceCount = dacl.GetAceCount();
ATL::CDacl newDacl;
for (UINT i = 0; i < aceCount; ++i)
{
ATL::CSid sid;
ACCESS_MASK mask = 0;
BYTE flags = 0;
dacl.GetAclEntry(i,
&sid,
&mask,
(BYTE*) 0,
&flags);
if (sid != Sids::Users())
newDacl.AddAllowedAce(sid, mask, flags);
}
newDacl.AddAllowedAce(Sids::Users(),FILE_LIST_DIRECTORY | FILE_READ_EA | FILE_EXECUTE | FILE_READ_ATTRIBUTES, CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE);
AtlSetDacl(directoryName.c_str(), SE_FILE_OBJECT, newDacl);
我还尝试了 SetNamedSecurityInfo() 和相关 API 来擦除现有的 ACL 并创建一个新 ACL,但这里也没有运气。 似乎这应该不难。 使用 cacls.exe这是小菜一碟(不幸的是,这对我来说不是一个选择)。 关于如何做到这一点的任何想法?
若要删除继承的 ACE,请调用 SetNamedSecurityInfo 并为 SecurityInfo 参数传递DACL_SECURITY_INFORMATION | PROTECTED_DACL_SECURITY_INFORMATION
。
PROTECTED_DACL_SECURITY_INFORMATION
标志可防止将父级的可继承 ACE 添加到指定的 ACL 中。
如果不需要复制其他继承的权限,但只需指定要使用的特定 ACL,那会更简单。 如果确实需要复制其他继承的权限,则需要在现有代码中保留读取-比较-添加循环,但也应清除 INHERITED_ACE 标志,因为这些现在是显式权限。
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 在Linux for Windows上编译C++代码时出错
- 在Windows上用C++裁剪HBITMAP
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- Windows/Cygwin - 不能使用 pybind11 - 犯错误
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 在Windows中以.exe的形式运行c++
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 无法在windows控制台中为C++程序提供必要的输入
- 在Windows中查找扬声器输出的当前音量级别
- Windows.h与GLFW.h的接口
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 在Linux和C++中的Windows上,散列字符串值会产生不同的输出
- Active Directory:从网络服务帐户下运行的Windows服务调用ADsOpenObject时失败
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 删除/修改 ACL 中继承的 ACE (Windows)