usuarios support sirve que preguntas permisos para frecuentes descripcion como colaboradores blog agregar permissions wix installer windows-installer wix-extension

permissions - support - roles y permisos wix



WIX: Dar permisos a una carpeta (5)

Como el elemento <Permission> borra la herencia de los permisos de las carpetas principales, puede intentar usar un solo elemento <Permission> para los usuarios "Todos" o "Administradores" seguido de los elementos <util: PermissionEx> para establecer permisos para los nombres de usuario que son no es compatible con el elemento <Permission>, por ejemplo:

<Permission User="Everyone" GenericRead="no" /> <util:PermissionEx User="Users" Domain="[LOCAL_MACHINE_NAME]" GenericRead="yes" Read="yes" GenericExecute="yes" ChangePermission="yes" />

No es necesario establecer explícitamente el permiso para el SISTEMA, ya que el instalador los agrega automáticamente.

He leído todos los temas relacionados y no he encontrado una respuesta completa a mi problema.

Me gustaría otorgar permisos completos al SISTEMA y los permisos de Lectura y Ejecución al Grupo de Usuarios en una carpeta en Archivos de Programa Nada más y nada menos.

Sé que hay 3 formas de otorgar permisos a una carpeta usando WIX, ninguna de ellas es realmente buena para mí y explicaré por qué:

1) Elemento de permiso regular:

<CreateFolder Directory="Test"> <Permission User="SYSTEM" GenericAll="yes"/> <Permission User="Users" Domain="[LOCAL_MACHINE_NAME]" GenericRead="yes" Read="yes" GenericExecute="yes" ChangePermission="yes"/> </CreateFolder>

Problema: falla en un sistema operativo extranjero ya que no conoce la palabra clave "Usuarios". Lo intenté con SID también. Además, necesito colocar el elemento de Permiso debajo de cada archivo en el directorio de Prueba (pero si este fuera el único caso, lo habría manejado)

2) Elemento WixUtilsExtension PermissionEx:

<CreateFolder Directory="Test"> <util:PermissionEx User="SYSTEM" GenericAll="yes"/> <util:PermissionEx User="Users" Domain="[LOCAL_MACHINE_NAME]" GenericRead="yes" Read="yes" GenericExecute="yes" ChangePermission="yes"/> </CreateFolder>

Problema: la carpeta también mantiene los permisos predeterminados de la carpeta Archivos de programa. No puedo permitir eso.

3) PermissionEx con Sddl:

Problema: este elemento solo está disponible cuando se instala con MSI 5.0. Estoy usando el instalador 3.01.

Estaré encantado de obtener cualquier solución, incluidas las soluciones con acciones personalizadas ...


Otra opción sería tener una CA simple que simplemente traduzca una propiedad msi que contenga el SID al nombre real del grupo desde el sistema operativo localizado. La CA no tiene que ser diferida y no está haciendo el trabajo real de establecer los permisos.

A continuación se muestra un ejemplo de CA que lee el valor de la propiedad msi PROPERTY_TO_BE_TRANSLATED y traduce la propiedad msi indicada por ella. De esta manera puede ejecutar la CA para traducir diferentes propiedades msi.

[CustomAction] public static ActionResult TranslateSidToName(Session session) { var property = session["PROPERTY_TO_BE_TRANSLATED"]; if (String.IsNullOrEmpty(property)) { session.Log("The {0} property that should say what property to translate is empty", translateSidProperty); return ActionResult.Failure; } var sid = session[property]; if (String.IsNullOrEmpty(sid)) { session.Log("The {0} property that should contain the SID to translate is empty", property); return ActionResult.Failure; } try { // convert the user sid to a domain/name var account = new SecurityIdentifier(sid).Translate(typeof(NTAccount)).ToString(); session[property] = account; session.Log("The {0} property translated from {1} SID to {2}", property, sid, account); } catch (Exception e) { session.Log("Exception getting the name for the {0} sid. Message: {1}", sid, e.Message); return ActionResult.Failure; } return ActionResult.Success; }

En WiX usted define las propiedades a traducir usando el SID para las cuentas :

<Property Id="AdminAccount" Value="S-1-5-32-544" /> <Property Id="EveryoneAccount" Value="S-1-1-0" />

Cree la CA que establecerá la propiedad PROPERTY_TO_BE_TRANSLATED y luego llame a la CA que realiza la traducción:

<CustomAction Id="TranslateAdmin_SetProperty" Property="PROPERTY_TO_BE_TRANSLATED" Value="AdminAccount"/> <CustomAction Id="TranslateAdmin" BinaryKey="CommonCustomActions" DllEntry="TranslateSidToName" Impersonate="no" /> <CustomAction Id="TranslateEveryone_SetProperty" Property="PROPERTY_TO_BE_TRANSLATED" Value="EveryoneAccount" /> <CustomAction Id="TranslateEveryone" BinaryKey="CommonCustomActions" DllEntry="TranslateSidToName" Impersonate="no" />

No olvide usar las propiedades msi al configurar los permisos:

<CreateFolder> <Permission GenericAll="yes" User="[AdminAccount]" /> <Permission GenericRead="yes" GenericExecute="yes" User="[EveryoneAccount]" /> </CreateFolder>

Finalmente, programe la CA antes de CreateFolder

<InstallExecuteSequence> <Custom Action=''TranslateAdmin_SetProperty'' Before=''TranslateAdmin'' /> <Custom Action=''TranslateAdmin'' Before=''CreateFolders'' /> <Custom Action=''TranslateEveryone_SetProperty'' Before=''TranslateEveryone'' /> <Custom Action=''TranslateEveryone'' Before=''CreateFolders'' /> </InstallExecuteSequence>

De esta manera, la CA está haciendo solo un trabajo simple, dejando la configuración de permisos para el elemento WiX.


Tuve exactamente el mismo problema y hablé con Rob M. al respecto. Iba a responder a la respuesta de Christian G ( https://.com/a/5296967/18475 ), pero Rob sugirió usar WixQueryOsWellKnownSID ( http://wix.sourceforge.net/manual-wix3/osinfo.htm ) para obtener alrededor de locales no en-EE.UU.

En el archivo .wxs agregas lo siguiente:

<PropertyRef Id="WIX_ACCOUNT_LOCALSYSTEM" /> <PropertyRef Id="WIX_ACCOUNT_USERS" />

Y más abajo en el archivo .wxs donde desea aplicar los permisos, es así:

<Permission GenericAll="yes" User="[WIX_ACCOUNT_LOCALSYSTEM]" /> <Permission GenericRead="yes" GenericExecute="yes" User="[WIX_ACCOUNT_USERS]" />

Ahora cuando ejecuta Light, solo necesita vincular WixUtilExtension .

light -ext WiXUtilExtension ...

NOTA: Dependiendo de su versión de WiX, es posible que esto no sea totalmente compatible. Si no funciona para usted, puede haber otras opciones que puede usar para traducir SID .


Utilice el siguiente código para lograr esto sin una acción personalizada. He verificado que esto funciona (también en carpetas secundarias). También se asigna el usuario Todos en sistemas operativos de Windows localizados.

<CreateFolder> <Permission User="Everyone" GenericAll="yes" ChangePermission="yes"/> </CreateFolder>


necesita implementar una acción personalizada diferida para cambiar los permisos. c # ejemplo de acción personalizada:

[CustomAction] public static ActionResult SetFolderPermission(Session session) { string folder = session.CustomActionData["Folder"].Trim(''/"''); string sid = session.CustomActionData["SID"].Trim(''/"''); System.Security.Principal.SecurityIdentifier sidID = new System.Security.Principal.SecurityIdentifier(sid); System.Security.AccessControl.DirectorySecurity ds = System.IO.Directory.GetAccessControl(folder); ds.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule(sidID , System.Security.AccessControl.FileSystemRights.Write , System.Security.AccessControl.InheritanceFlags.ObjectInherit , System.Security.AccessControl.PropagationFlags.NoPropagateInherit , System.Security.AccessControl.AccessControlType.Allow)); System.IO.Directory.SetAccessControl(folder , ds); return ActionResult.Success; }

puede transferir que en C ++, la acción personalizada debe ser diferida, por lo que debe acceder a las propiedades de su sesión mediante CustomActionData