Proyecto de instalación de VS2008: archivos de datos de aplicación compartidos (por todos los usuarios)?

¡compañeros antropoides y lirios y paletas!

Estoy desarrollando una aplicación de escritorio de Windows en C # /. NET / WPF, usando VS 2008. La aplicación es necesaria para instalar y ejecutar en máquinas Vista y XP. Estoy trabajando en un Setup / Windows Installer Project para instalar la aplicación.

Mi aplicación requiere acceso de lectura / modificación / escritura a un archivo de base de datos SQLCE (.sdf) y algunos otros archivos de tipo base de datos relacionados con el control de un tercero que estoy usando. Estos archivos se deben compartir entre todos los usuarios / inicios de sesión en la PC, ninguno de los cuales puede ser requerido como administrador. Esto significa, por supuesto, que los archivos no pueden ir en el directorio de instalación del progtwig (como suele suceder antes de la llegada de Vista, sí, ¡sí!).

Esperaba que la solución fuera simple. Tanto Vista como XP tienen carpetas de datos de aplicaciones compartidas diseñadas para este fin. (“\ ProgramData” en Vista, “\ Documents and Settings \ All Users \ Application Data” en XP.) Existe la llamada .NET Environment.GetFolderPath (SpecialFolder.CommonApplicationData) para encontrar las rutas a estas carpetas en una PC determinada, sí ¡Sí!

Pero no puedo averiguar cómo especificar la carpeta de datos de aplicación compartida como un objective en el proyecto de instalación.

El proyecto de instalación ofrece una carpeta de “Archivos comunes”, pero destinada a componentes de progtwigs compartidos (no archivos de datos), generalmente se encuentra en “\ Archivos de progtwig” y tiene las mismas restricciones de seguridad que cualquier otra cosa en “Archivos de progtwig”, ¡sí Sí!

El proyecto de instalación ofrece una carpeta de “Datos de la aplicación del usuario”, pero esa es una carpeta por usuario, que es exactamente lo que bash evitar, sí, sí.

¿Es posible agregar archivos a la carpeta de datos de aplicaciones compartidas en una forma robusta, de versiones de Windows cruzadas desde un proyecto de configuración de VS 2008? Alguien me puede decir como?

He aprendido la respuesta a mi pregunta a través de otras fonts, sí, ¡sí! Tristemente, ¡no solucionó mi problema! ¿Qué es eso me hace a mí, un fijador superior? ¡Sí Sí!

Para poner cosas en un subdirectorio de la carpeta Common Application Data de un proyecto de instalación de VS2008, esto es lo que debes hacer:

  1. Haga clic derecho en su proyecto de instalación en el Explorador de soluciones y seleccione “Ver -> Sistema de archivos”.

  2. Haga clic con el botón derecho en “Sistema de archivos en la máquina de destino” y seleccione “Agregar carpeta especial -> Carpeta personalizada”.

  3. Cambie el nombre de la carpeta personalizada a “Carpeta de datos de aplicación común”. (Este no es el nombre que se usará para la carpeta resultante, es solo para ayudarlo a mantenerlo en línea).

  4. Cambie la propiedad DefaultLocation de la carpeta a “[CommonAppDataFolder] [Manufacturer] \ [ProductName]”. Tenga en cuenta la similitud con la propiedad DefaultLocation de la Carpeta de la aplicación, incluido el uso impar de una sola barra invertida.

  5. Maravíllate por un momento ante el hecho ridículo (aunque innegable) de que hay una propiedad de carpeta llamada “Propiedad”.

  6. Cambie la propiedad Propiedad de la carpeta a “COMMONAPPDATAFOLDER”.

Los archivos de datos colocados en la carpeta “Datos comunes de la aplicación” se copiarán en “\ ProgramData \ Manufacturer \ ProductName” (en Vista) o “\ Documents and Settings \ All Users \ Application Data \ Manufacturer \ ProductName” (en XP) cuando el instalador se ejecuta.

Ahora resulta que en Vista, los que no son administradores no obtienen acceso de modificación / escritura a los archivos aquí. Entonces, todos los usuarios pueden leer los archivos, pero también los obtienen en “\ Archivos de progtwig”. Entonces, ¿cuál es, me pregunto, el objective de la carpeta Common Application Data?

En lugar de marcar “Activar la configuración de seguridad de ClickOnce” y seleccionar “Esta es una aplicación de confianza completa”, es posible cambiar los permisos del Directorio de datos comunes de su aplicación con una Acción personalizada en la sección “Instalar” de un proyecto de configuración. Esto es lo que hice:

  1. Se agregó una acción personalizada para llamar a la aplicación que se está instalando (alternativamente se podría crear un progtwig / dll separado y llamarlo en su lugar)
  2. Establezca la propiedad Arguments en “Instalar”
  3. Main modificado en Program.cs para verificar ese arg:

    static void Main(string[] args) { if (args != null && args.Length > 0 && args[0] == "Install") { ApplicationData.SetPermissions(); } else { // Execute app "normally" } }
  4. Escribió la función SetPermissions para cambiar permisos de forma programática
     
    public static void SetPermissions() { String path = GetPath(); try { // Create security idenifier for all users (WorldSid) SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null); DirectoryInfo di = new DirectoryInfo(path); DirectorySecurity ds = di.GetAccessControl(); // add a new file access rule w/ write/modify for all users to the directory security object
    ds.AddAccessRule(new FileSystemAccessRule(sid, FileSystemRights.Write | FileSystemRights.Modify, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, // all sub-dirs to inherit PropagationFlags.None, AccessControlType.Allow)); // Turn write and modify on // Apply the directory security to the directory di.SetAccessControl(ds); } catch (Exception ex) { MessageBox.Show(ex.Message); } }

Como el instalador se ejecuta con derechos de administrador, el progtwig podrá cambiar los permisos. Leí en alguna parte que “Habilitar la seguridad de ClickOnce” puede hacer que el usuario vea un aviso no deseado al inicio de la aplicación. Hacerlo como se describe arriba evitará que esto suceda. Espero que esto ayude a alguien. ¡Sé que podría haberme beneficiado al ver algo así hace unos días!

Lo solucioné de esta manera. Mantuve el archivo de la base de datos (.sdf) en la misma carpeta donde está instalada la aplicación (Carpeta de la aplicación). En la pestaña de seguridad en la ventana de propiedades para el proyecto principal, revisé “Habilitar la configuración de seguridad de ClickOnce” y seleccioné “Esta es una aplicación de confianza completa”, reconstruí y ejecuté la configuración. Después de eso no hay problema de seguridad

Estoy usando Visual Studio 2008 y Windows Vista

Esto funcionó para mí usando VS2005 pero tuve que cambiar la ubicación predeterminada, agregué un ‘\’ para separar el CommonAppDataFolder.

[CommonAppDataFolder] [Manufacturer] [ProductName]

No sé si esto fue un error tipográfico, pero Lyman se refirió al uso extraño de una sola barra invertida, pero esto no parece correcto.

Tuve el mismo problema. El proyecto de instalación le da al usuario la opción de instalar la aplicación “para el usuario actual solamente” o “para todos los usuarios: por consiguiente, el archivo de la base de datos terminaría en la carpeta de datos de la aplicación del usuario actual o de todos los usuarios”. tiene que escribir esta información en alguna parte para que la aplicación pueda recuperarla luego, cuando se trata de acceder a la base de datos. ¿De qué otra forma sabría qué carpeta de datos de la aplicación buscar?

Para evitar este problema, solo quiero instalar la base de datos en la carpeta Todos los usuarios / Datos de la aplicación, independientemente de si la aplicación se instaló para un usuario o para todos los usuarios. Me di cuenta, por supuesto, de que dos usuarios no podían instalar la aplicación en la misma computadora sin sobreescribir los datos de los demás. Esta es una posibilidad tan remota, sin embargo, que no quiero considerarlo.

La primera pieza del rompecabezas que obtuve aquí :

 Form_Load(object sender, EventArgs e) { // Set the db directory to the common app data folder AppDomain.CurrentDomain.SetData("DataDirectory", System.Environment.GetFolderPath (System.Environment.SpecialFolder.CommonApplicationData)); } 

Ahora debemos asegurarnos de que la fuente de datos contenga el marcador de posición DataDirectory. Esta pieza vino de aquí . En el diseñador de DataSet, busque las propiedades del conjunto de datos, abra el nodo de conexión y edite la propiedad ConnectionString para que se vea de la siguiente manera:

 Data Source=|DataDirectory|\YourDatabase.sdf 

Luego seguí las instrucciones de Lyman Enders Knowles de arriba para saber cómo agregar la Carpeta de datos de aplicación común al proyecto de configuración y coloqué el archivo de la base de datos en esa carpeta.

A continuación, seguí la sugerencia de Ove desde arriba, es decir, verifiqué “Habilitar la configuración de seguridad de ClickOnce” y seleccioné “Esta es una aplicación de plena confianza.

Después de eso, la aplicación se implementó correctamente en Vista y se pudo acceder al archivo de la base de datos tanto para lecturas como para escrituras.

me gusta el siguiente concepto, algunas cosas tomadas desde arriba

  1. Haga clic derecho en su proyecto de instalación en el Explorador de soluciones y seleccione “Ver -> Sistema de archivos”.

  2. Haga clic con el botón derecho en “Sistema de archivos en la máquina de destino” y seleccione “Agregar carpeta especial -> Carpeta personalizada”.

  3. Cambie el nombre de la carpeta personalizada a “Carpeta de datos de aplicación común”. (Este no es el nombre que se usará para la carpeta resultante, es solo para ayudarlo a mantenerlo en línea).

  4. Cambie la propiedad DefaultLocation de la carpeta a “[CommonAppDataFolder] [Manufacturer] [ProductName]”. Tenga en cuenta la similitud con la propiedad DefaultLocation de la Carpeta de la aplicación, incluido el uso impar de una sola barra invertida.

  5. Maravíllate por un momento ante el hecho ridículo (aunque innegable) de que hay una propiedad de carpeta llamada “Propiedad”. Bebés llenos de rabia, ¿a quién se le ocurre esta mierda?

  6. Cambie la propiedad Propiedad de la carpeta a “COMMONAPPDATAFOLDER”.

 string userAppData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); string commonAppData = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); 

No estoy seguro si esto ayudará en su caso o no.

Pero si agrega una sección privada al archivo de configuración de su aplicación

Puede especificar carpetas adicionales para verificar su aplicación.

Si lo que está diciendo es que desea poder instalarlo en otras carpetas de la máquina, entonces ese es un problema. Básicamente, la razón por la que MS ha restringido estas cosas es mantener el código malicioso fuera de las máquinas donde el usuario desconoce qué está instalando.

Por lo tanto, esto no funcionará si necesita otro directorio. Lo que hace esta corrección es que le permite especificar en qué parte de su aplicación buscar archivos …