La asignación de los permisos de la carpeta «TODOS los PAQUETES de APLICACIONES» grupo de

Parece Win 8 tiene un nuevo grupo de usuarios «TODOS los PAQUETES de APLICACIONES». Este grupo parece tener permisos de Lectura en todas las carpetas por defecto. Sin embargo, mi requisito es establecer algunos específicos de Acl en una carpeta creada por mí. Este grupo no tiene permisos en mi carpeta en la actualidad y escribí algo de código para agregar permisos de Lectura para «TODOS los PAQUETES de APLICACIONES». Estoy usando VS 2010 y la de abajo es la recortada fragmento de código.

El SID para «TODOS los PAQUETES de APLICACIONES» tal y como aparece en http://msdn.microsoft.com/en-us/library/cc980032.aspx es ALL_APP_PACKAGES (S-1-15-2-1).

Pero no importa cómo o qué valor me pase como fiduciario en Nombre de la código de abajo no funciona. Por ejemplo en el código siguiente SetNamedSecurityInfo() falla con ERROR_INVALID_ACL. Sin embargo si uso «Administradores» o «Todo el mundo» cuenta entonces funciona.

Exacta permiso necesito para asignar «Leer & Ejecutar», «Lista de Contenido de la Carpeta», y «Leer»

#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;
}
InformationsquelleAutor md kashif | 2013-07-20

2 Kommentare

  1. 4

    Intenta establecer el Síndico de la estructura de esta manera. A mí me funciona.

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

    Exacta permiso necesito para asignar «Leer & Ejecutar», «Carpeta de la Lista de
    Contenido», y «Leer»
    Por lo que necesita

    ea.grfAccessPermissions = GENERIC_READ | GENERIC_EXECUTE;
    

    lugar de

    ea.grfAccessPermissions = STANDARD_RIGHTS_READ;
    

    También este es probablemente no funcionará si el nombre del grupo se localiza:

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

    Esta pieza:

    //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;
    

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea