2013-07-20 2 views
2

Кажется, что у 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; 
} 

ответ

3

Пытаться установить структуру Доверительный управляющий таким образом. Меня устраивает.

ea.Trustee.TrusteeForm = TRUSTEE_IS_NAME; 
ea.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP; 
ea.Trustee.ptstrName = L"ALL APPLICATION PACKAGES"; 
2

Точное разрешение мне нужно назначить являются «Read & Выполнить», «Список папок Содержание» и «Чтение» Так что вам нужно

ea.grfAccessPermissions = GENERIC_READ | GENERIC_EXECUTE; 

вместо

ea.grfAccessPermissions = STANDARD_RIGHTS_READ; 

Также это probab LY не будет работать, если имя группы локализованы:

ea.Trustee.TrusteeForm = TRUSTEE_IS_NAME; 
ea.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP; 
ea.Trustee.ptstrName = L"ALL APPLICATION PACKAGES"; 

Эта часть будет:

// Allocate enough memory for the largest possible SID. 
PSID TheSID = NULL; 
DWORD SidSize = SECURITY_MAX_SID_SIZE; 
if (!(TheSID = LocalAlloc(LMEM_FIXED, SidSize))) 
    goto Cleanup; 

// Create a SID for the Everyone group on the local computer. 
if (!CreateWellKnownSid(WinBuiltinAnyPackageSid, NULL, TheSID, &SidSize)) 
    goto Cleanup; 

// Initialize an EXPLICIT_ACCESS structure for the new ACE. 
ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS)); 
ea.grfAccessPermissions = GENERIC_READ | GENERIC_EXECUTE; 
ea.grfAccessMode = SET_ACCESS; 
ea.grfInheritance = SUB_CONTAINERS_AND_OBJECTS_INHERIT; 
ea.Trustee.TrusteeForm = TRUSTEE_IS_SID; 
ea.Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP; 
ea.Trustee.ptstrName = (LPWSTR)TheSID;