SetNamedSecurityInfo:为对象设置DACL,但在系统重新启动后不会保留

时间:2015-07-22 21:21:03

标签: c++ windows dacl

在Windows 7中,我尝试为用户组提供对通过SCSI连接的特定磁盘的读/写访问权限,以便他们可以运行读取/写入该磁盘的实用程序。我试图通过使用C ++使用SetNamedSecurityInfo修改磁盘对象的DACL来实现此目的。

    string devicePath = "\\?\scsi#disk&ven_wsi&prod_drs1100p#6&383ae3b6&0&000300#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}";
    PSID ppsidOwner, ppsidGroup;
    PACL ppDacl = NULL, ppSacl = NULL;
    PSECURITY_DESCRIPTOR ppSecurityDescriptor = NULL;
    char objName[200];
    strcpy(objName, devicePath.c_str());

    // Get SecurityInfo
    GetNamedSecurityInfoA(objName, 1, DACL_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION, &ppsidOwner, &ppsidGroup, &ppDacl, NULL, &ppSecurityDescriptor);

    // Build ACE
    EXPLICIT_ACCESS str_ACE;
    DWORD rightsMask = STANDARD_RIGHTS_ALL | GENERIC_ALL | GENERIC_WRITE | GENERIC_READ;
    BuildExplicitAccessWithNameA(&str_ACE, "DRS Operators", rightsMask, GRANT_ACCESS, NO_INHERITANCE);
    PACL newPACL;

    // Set ACE then Set SecurityInfo
    SetEntriesInAclA(1, &str_ACE, ppDacl, &newPACL);
    SetNamedSecurityInfoA(objName, 1, DACL_SECURITY_INFORMATION, NULL, NULL, newPACL, NULL);

我写的代码似乎有用,我在更改DACL之前和之后使用GetNamedSecurityInfoA确认了对象,然后将收到的SecurityDescriptors传递给ConvertSecurityDescriptorToStringSecurityDescriptorA,并确保它们已更改。运行此代码后,我能够以" DRS操作员"中的任何用户身份登录。用户组,能够读/写磁盘。

我遇到的唯一问题是系统关闭后DACL的更改不会持续存在。重新启动后,DACL将恢复到我运行上面代码之前的状态(我使用GetNamedSecurityInfoA检查)。这里有没有人知道为什么这些变化不会持续存在?

0 个答案:

没有答案