Кажется, что у Win 8 появилась новая группа пользователей «ВСЕ ПРИЛОЖЕНИЯ ПАКЕТЫ». По умолчанию эта группа имеет разрешения на чтение во всех папках. Однако мое требование - установить некоторые определенные списки управления доступом в созданной мной папке. В настоящее время у этой группы нет разрешений на мою папку, и я написал код для добавления разрешений на чтение для «ВСЕ ПАКЕТОВ ПРИЛОЖЕНИЙ». Я использую VS 2010, а ниже - отредактированный фрагмент кода.Назначение прав доступа к папке «ВСЕ ПРИКЛАДНЫЕ ПАКЕТЫ»
SID для «ВСЕХ ПРИЛОЖЕНИЙ ПАКЕТ», как указано в http://msdn.microsoft.com/en-us/library/cc980032.aspx, является ALL_APP_PACKAGES (S-1-15-2-1).
Но независимо от того, как и какое значение я передаю в качестве доверительного управляющего. Название кода ниже не работает. Например, в коде, приведенном ниже, SetNamedSecurityInfo() не работает с ERROR_INVALID_ACL. Однако, если я использую учетную запись «Администраторы» или «Все», она работает.
Точное разрешение мне нужно назначить являются «Read & Выполнить», «Список содержимого папки» и «Чтение»
#include "stdafx.h"
#include "windows.h"
#include "sddl.h"
#include "Aclapi.h"
int _tmain(int argc, _TCHAR* argv[])
{
TCHAR pszObjName[MAX_PATH] = L"C:\\Program Files\\Common Files\\Test\\";
PACL pOldDACL = NULL, pNewDACL = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
EXPLICIT_ACCESS ea;
SECURITY_INFORMATION si = DACL_SECURITY_INFORMATION;
// Get a pointer to the existing DACL (Conditionaly).
DWORD dwRes = GetNamedSecurityInfo(pszObjName, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, &pOldDACL, NULL, &pSD);
// Initialize an EXPLICIT_ACCESS structure for the new ACE.
ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
ea.grfAccessPermissions = STANDARD_RIGHTS_READ;
ea.grfAccessMode = SET_ACCESS;
ea.grfInheritance= SUB_CONTAINERS_AND_OBJECTS_INHERIT;
ea.Trustee.TrusteeForm = TRUSTEE_IS_SID;
// ea.Trustee.TrusteeType = TRUSTEE_IS_GROUP;
// Should I be using SID (S-1-15-2-1) (SetEntriesInAcl() fails) or "ALL_APP_PACKAGES" (SetEntriesInAcl() passes but SetNamedSecurityInfo() fails)
//If I use "Administrators" or "Everyone" as Trustee Name then it works fine but not with "ALL APPLICATION PACKAGES"
ea.Trustee.ptstrName = _T(" ALL_APP_PACKAGES");
// Create a new ACL that merges the new ACE into the existing DACL.
dwRes = SetEntriesInAcl(1, &ea, pOldDACL, &pNewDACL);
if(ERROR_SUCCESS != dwRes)
goto Cleanup;
// Attach the new ACL as the object's DACL.
dwRes = SetNamedSecurityInfo(pszObjName, SE_FILE_OBJECT, si, NULL, NULL, pNewDACL, NULL);
if(ERROR_SUCCESS != dwRes)
goto Cleanup;
Cleanup:
if(pSD != NULL)
LocalFree((HLOCAL) pSD);
if(pNewDACL != NULL)
LocalFree((HLOCAL) pNewDACL);
return dwRes;
}