c# windows wix windows-installer

wix installer c#



System.UnauthorizedAccessException al ejecutar.exe en archivos de programa (3)

A través del instalador de WiX, instalé mi aplicación de Windows y la carpeta se está creando bajo c:/ProgramFiles con .exe y los c:/ProgramFiles DLL necesarios.

Mientras ejecuto el archivo .exe, System.UnauthorizedAccessException la System.UnauthorizedAccessException .

Por favor, hágamelo saber si hay sugerencias útiles.

Por favor, encuentre el siguiente registro de eventos para referencia.

Application: xxxxxxx.exe Framework Version: v1.0.0 Description: The process was terminated due to an unhandled exception. Exception Info: System.UnauthorizedAccessException at System.IO.__Error.WinIOError(Int32, System.String) at System.IO.FileStream.Init(System.String, System.IO.FileMode, System.IO.FileAccess, Int32, Boolean, System.IO.FileShare, Int32, System.IO.FileOptions, SECURITY_ATTRIBUTES, System.String, Boolean, Boolean, Boolean) at System.IO.FileStream..ctor(System.String, System.IO.FileMode, System.IO.FileAccess, System.IO.FileShare, Int32, System.IO.FileOptions, System.String, Boolean, Boolean, Boolean) at System.IO.StreamWriter.CreateFile(System.String, Boolean, Boolean) at System.IO.StreamWriter..ctor(System.String, Boolean, System.Text.Encoding, Int32, Boolean) at System.IO.StreamWriter..ctor(System.String, Boolean) at System.IO.File.AppendText(System.String)


Porque

Esto parece una simple infracción de acceso: intenta obtener acceso de escritura a un archivo para el que no tiene permisos, en el contexto en el que se está ejecutando (los archivos en %ProgramFiles% no se pueden escribir para usuarios normales o administradores no elevados) Para evitar la virtualización de archivos, consulte la sección 9 continuación.

Aquí hay una lista de verificación de error de inicio genérica - probablemente no sea útil ya que básicamente tiene una simple violación de acceso (eso parece). Sin embargo, no estoy seguro de por qué la respuesta vinculada ha sido bajada. Puede que haya arruinado un par de puntos: es solo una lista desordenada con la intención de generar algunas ideas. Incluyendo aquí para su fácil recuperación.

Posibles correcciones sugeridas

Aquí hay una lista de algunos enfoques posibles que puede utilizar para solucionar el problema, solucionar la causa o rediseñar las cosas para evitar el problema. Y hay algunos enfoques que son meramente posibles y rara vez se utilizan.

La siguiente lista no está en orden de preferencia . De hecho, el enfoque número 1 es muy indeseable en mi opinión. El enfoque 6 puede ser efectivo, pero no tan bueno (aunque es mejor que 1 ). Puedo vivir con los otros enfoques (excepto 9 ), y 2 es probablemente el más común de usar.

1. Elevar la aplicación (derechos de administrador) : como otros han sugerido, puede ejecutar su aplicación con derechos de administrador (muy mala práctica en estos días: los derechos de administrador son dominantes, las claves de la ciudad y hacer de su aplicación un objetivo de pirata informático y también hace que el Aplicación más peligrosa si contiene errores de calibre). Aquí hay un breve ejemplo de cómo hacerlo: ¿Cómo puedo forzar mi aplicación .NET para que se ejecute como administrador? .

  • Solo usuarios de administración : ¡Crucialmente, la elevación no funcionará para usuarios normales! (se les pedirá una contraseña de administrador). Sólo los administradores pueden elevar !
  • Contraseña de administrador en blanco : si hay una contraseña de administrador en blanco en el cuadro (PC comunes en el hogar), cualquier usuario puede elevar cualquier conjunto binario para elevar a derechos de administrador a voluntad (usando la cuenta de contraseña en blanco) - mientras está conectado a su propia cuenta restringida (obviamente, también pueden iniciar sesión como administrador con la cuenta de contraseña en blanco y lanzar absolutamente cualquier cosa, por lo que el agujero de seguridad ya está allí con la contraseña en blanco, independientemente de los problemas de elevación, pero ¿por qué permitir la elevación con cuentas de contraseña en blanco? ).
  • UAC : ¿Qué sucede cuando UAC está deshabilitado? Es probable que a los usuarios estándar simplemente no se les solicite una contraseña, ¿y el inicio falla? Todavía no he tenido la oportunidad de intentarlo.
  • Seguridad : en ciertos escenarios, los procesos elevados parecen ser capaces de lanzar otros procesos elevados que pueden durar más que el proceso original (depende de los privilegios de NT del usuario). Locura.

2. Perfil de usuario (Mover archivo) : puede determinar qué archivo está causando la infracción de acceso (¿algún tipo de archivo de configuración?) Y moverlo a una ubicación donde los usuarios tengan derechos de acceso regulares en todos los casos. Generalmente en algún lugar del perfil de usuario (recomendado).

3. Acceso de solo lectura : Muy a menudo puede obtener acceso de solo lectura para los archivos de configuración. Tal vez usted puede hacer cumplir este enfoque en su lugar? Todo depende del diseño de su aplicación. ¿Quizás pueda handle the access denied exception y luego ejecutar solo lectura?

4. Valores predeterminados internos : como un ejemplo del enfoque de solo lectura, puede perder todo el archivo de configuración y confiar en los valores predeterminados internos. Rara vez una opción creo, pero posible.

5. Configuración en línea? : A algunas personas les gusta eliminar los archivos de configuración (o hacerlos de solo lectura) y luego recuperar la "configuración real" de una base de datos en el inicio. Este enfoque puede tener ventajas dramáticas, especialmente para aplicaciones corporativas, administración de configuraciones y control de versiones, eliminación de problemas de roaming de perfiles de usuario, etc. (y desafíos, por supuesto, network issues , firewall , proxy , etc... ).

6. Permisos de ACL : puede aplicar permisos de ACL al archivo en cuestión en la instalación, lo que permite a los usuarios regulares escribir en él. No es un gran diseño en absoluto, pero funcionará . Y, sin duda, es mejor que correr con derechos de administrador (elevados), porque señala el acceso necesario y no solo eleva todo el proceso. No solo establezca el acceso completo a toda la carpeta, solo abra el acceso de escritura para archivos individuales.

7. Servicio de Windows : en ciertos casos, se pueden ejecutar las partes de una aplicación que requieren derechos elevados como servicio de Windows. No es un enfoque que he visto muy a menudo, pero posible. A continuación, instale el servicio para que se ejecute como LocalSystem o una cuenta elevada equivalente ( o utilice cuentas de servicio , consulte la sección " Otros enfoques " o esta respuesta alternativa ). Tal vez también pueda mencionar una scheduled task nunca he intentado usar una tarea programada para tal escenario.

8. Suplantación : supongo que podría suplantar una cuenta con derechos de acceso para escribir en la ubicación en cuestión. No utilizo este enfoque, por lo que no estoy seguro de los detalles técnicos, los aspectos y los desafíos. Solo tildándolo como una opción.

9. Enfoques de virtualización : Solo mencionando esto. Varias formas de virtualización, por ejemplo, políticas que puede habilitar para permitir que las fallas de escritura de archivos y registros sean redirigidas a una ubicación de escritura (más a lo largo de las líneas de redirección de datos ) con toda la confusión que se produce, esto no es una solución ; para eliminar la función en una versión futura de Windows. No estoy seguro del estado en Windows 10. MSDN en la virtualización del registro ). Generalmente no hay problemas resueltos, pero varios problemas no son reconocidos. En general, es seguro que causará confusión, ya que las personas no ven dónde se escriben los datos y los datos no se comparten entre los usuarios, sino que son específicos del usuario. Y hay una virtualización completa / transmisión de datos como App-V y contenedores que permiten un acceso completo. No es mi especialidad, y no es mi preferencia.

No use esta virtualización o redireccionamiento de datos sin sentido (es para que las aplicaciones heredadas no se bloqueen, no para que las nuevas aplicaciones usen). Seguiré agregando un enlace a algunos detalles técnicos sobre cómo funciona realmente la característica (hay una serie de requisitos previos que deben cumplirse antes de que funcione esta redirección): el archivo de registro log4net no está visible en el explorador de Windows en la subcarpeta de instalación de la aplicación (se recommended to show why this feature should never be used ).

La siguiente es una respuesta que se remonta al tema de la implementación de archivos por usuario y cómo se puede hacer en un paquete, junto con algunos enfoques alternativos de red / base de datos / nube .

Puede ser una lectura complicada, pero aquí está: esencialmente proporciona algunas permutaciones más de las posibilidades anteriores :

Algunos enlaces :


No trates de escribir donde las aplicaciones no deberían escribir. Usa otras carpetas como por ejemplo:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

Si no hay una alternativa posible, lo cual dudo seriamente, ejecute el ejecutable con privilegios administrativos.

https://msdn.microsoft.com/en-us/library/bb756929.aspx


También puede aprovechar el concepto de suplantación de .NET, si no hay otra ubicación alternativa que no requiera privilegios administrativos.

Aquí está el enlace para obtener una descripción general de la suplantación de .Net.

¿Cómo se hace la personificación en .NET?