在 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 Operators”用户组中的任何用户身份登录,并且能够读取/写入磁盘。
我遇到的唯一问题是系统关闭后对 DACL 的更改不会持续存在。重新启动后,DACL 被设置回我运行上述代码之前的状态(我使用 GetNamedSecurityInfoA 进行了检查)。这里有没有人知道为什么这些变化没有持续存在?