我是否错误地使用SetNamedSecurityInfo?我的文件的ACL没有';似乎没有被适当地修改

我是否错误地使用SetNamedSecurityInfo?我的文件的ACL没有';似乎没有被适当地修改,security,permissions,file-permissions,dacl,Security,Permissions,File Permissions,Dacl,我正在尝试启用和禁用文件的某些访问权限。我发现要做到这一点,你必须搞乱DACL。我正在使用以下代码修改文件的DACL: void set_DACL_for_object(const char *object, SE_OBJECT_TYPE object_type, int access_perms, int access_mode) { PACL pDACL = NULL, pOldDACL = NULL; PSEC

我正在尝试启用和禁用文件的某些访问权限。我发现要做到这一点,你必须搞乱DACL。我正在使用以下代码修改文件的DACL:

 void set_DACL_for_object(const char *object, SE_OBJECT_TYPE object_type,
                          int access_perms, int access_mode) {

      PACL pDACL = NULL, pOldDACL = NULL;
      PSECURITY_DESCRIPTOR pSD = NULL;
      EXPLICIT_ACCESS ea;

      GetNamedSecurityInfo((LPTSTR)object, object_type,
                            DACL_SECURITY_INFORMATION, NULL, NULL,
                            &pOldDACL, NULL, &pSD);

      ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));

      ea.grfAccessPermissions = access_perms;
      ea.grfAccessMode = access_mode;
      ea.grfInheritance = NO_INHERITANCE;
      ea.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
      ea.Trustee.TrusteeType = TRUSTEE_IS_GROUP;
      ea.Trustee.ptstrName = _T("ADMINISTRATORS");

      SetEntriesInAcl(1, &ea, pOldDACL, &pDACL);

      SetNamedSecurityInfo((LPTSTR)object, object_type,
                            DACL_SECURITY_INFORMATION, NULL, NULL, pDACL, NULL);
 }
因此,首先我使用fopen()创建一个文件,创建一个ACL以授予对Administrators组的所有访问权,然后拒绝对Administrators组的写访问权:

 set_DACL_for_object("C:\\file.txt", SE_FILE_OBJECT, GENERIC_ALL, SET_ACCESS);
 set_DACL_for_object("C:\\file.txt", SE_FILE_OBJECT, GENERIC_WRITE, DENY_ACCESS);
但是,在这些调用之后,我对该文件没有读取权限。如果我不打电话,我就有读/写权限(正如预期的那样)

我应该注意的是,我是在一个管理员帐户下运行的,并且函数返回为成功。我还尝试为特定的受限用户修改ACL,但同样的情况发生了。。。用户被拒绝读访问,而不是我想要的写访问

我尝试了一系列不同的调用组合来为_object()设置_DACL_,比如用REVOKE_ACCESS替换DENY_ACCESS,用GRANT_ACCESS替换set_ACCESS,不进行任何set_ACCESS调用,等等,但似乎都不起作用


我应该注意,大部分代码都是从中提取的,所以我认为它应该可以工作。我到底做错了什么?

我认为
set\u DACL\u for\u object
调用应该指定
FILE\u ALL\u ACCESS
FILE\u GENERIC\u WRITE
,而不是
GENERIC\u ALL
GENERIC\u WRITE
。我用这些更改编译了您的代码片段,它按照您的预期工作

作为旁注,
LPTSTR
cast防止编译器在您将此代码编译为Unicode时检测到此代码是否为Ansi,因此在这种情况下,代码将在运行时失败


您应该改用
\T(“管理员”)

在哪个程序中打开并阅读它?ACL已设置为我所期望的,但文件\u GENERIC\u WRITE对于您的目的来说可能过于通用;看起来这还设置了一个影响读取属性的“特殊”权限

来自winnt.h:

#define FILE_GENERIC_WRITE        (STANDARD_RIGHTS_WRITE    |\
                                   FILE_WRITE_DATA          |\
                                   FILE_WRITE_ATTRIBUTES    |\
                                   FILE_WRITE_EA            |\
                                   FILE_APPEND_DATA         |\
                                   SYNCHRONIZE)
如果我使用一组更有限的标志调用,现在可以打开并读取测试文件,至少在记事本中是这样,但管理员用户无法保存文档:

DWORD dwCustomWrite = FILE_WRITE_DATA       | 
                      FILE_WRITE_ATTRIBUTES | 
                      FILE_WRITE_EA         | 
                      FILE_APPEND_DATA;
set_DACL_for_object(..., SE_FILE_OBJECT, dwCustomWrite, DENY_ACCESS);
在文件的“安全”选项卡的“高级权限”列表中,通过上述调用,只有以下内容被标记为“管理员”组的“拒绝”:

“创建文件/写入数据”、“创建文件夹/追加数据”、“写入属性”、“写入扩展属性”


有了这些知识,您应该能够选择您需要的确切标志集。

谢谢;我试过了,结果还是一样(无法读取文件)。在您的系统上,调用这两个函数(设置文件的访问权限、设置文件的所有访问权限和拒绝文件的一般写入访问权限)可以打开文件并读取它,但不能写入它?谢谢!成功了。在我回答了您的第一个答案后,我启动到安全模式,并检查了我正在为其创建和修改ACL的文件上的安全信息。我注意到写访问确实被拒绝,而读访问被允许。。。但也有一些特殊权限被拒绝。谢谢你给我指出了正确的方向,现在它开始工作了。