Pregunta

¡Compañeros antropoides, nenúfares y ruedas de paletas!

Estoy desarrollando una aplicación de escritorio de Windows en C#/.NET/WPF, usando VS 2008.Se requiere que la aplicación se instale y ejecute en máquinas Vista y XP.Estoy trabajando en un proyecto de instalación/instalador de Windows 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 un control de terceros que estoy usando.Estos archivos deben compartirse entre todos los usuarios/inicios de sesión en la PC, y a ninguno de ellos se le puede exigir que sea administrador.Esto significa, por supuesto, que los archivos no pueden ir al propio directorio de instalación del programa (como solía 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 destinadas a este fin. ("\ProgramData" en Vista, "\Documents and Settings\All Users\Application Data" en XP.) La llamada .NET Environment.GetFolderPath(SpecialFolder.CommonApplicationData) existe para encontrar las rutas a estas carpetas en una PC determinada, sí , ¡Sí!

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

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

El proyecto de instalación ofrece una carpeta de "Datos de la aplicación del usuario", pero es una carpeta por usuario, que es exactamente lo que estoy tratando de evitar, ¡sí, sí!

¿Es posible agregar archivos a la carpeta de datos de aplicaciones compartidas de una manera sólida y entre versiones de Windows desde un proyecto de instalación de VS 2008?Alguien me puede decir como?

¿Fue útil?

Solución

He aprendido la respuesta a mi pregunta a través de otras fuentes, ¡sí, sí!Lamentablemente, ¡no solucionó mi problema!¿Qué me convierte eso en alguien que necesita reparaciones?¡Sí Sí!

Para colocar cosas en un subdirectorio de la carpeta Datos comunes de la aplicación desde un proyecto de instalación de VS2008, esto es lo que debe 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 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 la "carpeta de datos de aplicaciones comunes". (Este no es el nombre que se usará para la carpeta resultante, es solo para ayudarlo a mantenerlo recto).

  4. Cambie la propiedad DefaultLocation de la carpeta a "[CommonAppDataFolder][Fabricante]\[ProductName]".Tenga en cuenta la similitud con la propiedad DefaultLocation de la carpeta de la aplicación, incluido el uso extraño de una sola barra invertida.

  5. Maravíllese por un momento ante el hecho ridículo (aunque innegable) de que existe una propiedad de carpeta llamada "Propiedad".

  6. Cambie la propiedad de propiedad de la carpeta a "COMMONAPPDATAFOLDER".

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

Ahora resulta que bajo Vista, los no administradores no tienen 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 programa".Entonces, me pregunto, ¿cuál es el objetivo de la carpeta Datos comunes de la aplicación?

Otros consejos

En lugar de marcar "Habilitar configuración de seguridad de ClickOnce" y seleccionar "Esta es una aplicación de plena confianza", es posible cambiar los permisos de CommonAppDataDirectory de su aplicación con una acción personalizada en la sección "instalar" de un proyecto de instalación.Esto es lo que hice:

  1. Se agregó una acción personalizada para llamar a la aplicación que se está instalando (alternativamente, puede crear un programa/dll separado y llamarlo en su lugar)
  2. Establezca la propiedad Argumentos en "Instalar"
  3. Modificado Main en Program.cs para verificar ese argumento:

    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 mediante programación

    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); } }

Dado que el instalador se ejecuta con derechos de administrador, el programa podrá cambiar los permisos.Leí en alguna parte que "Habilitar seguridad ClickOnce" puede hacer que el usuario vea un mensaje no deseado al iniciar la aplicación.Hacerlo como se describe anteriormente evitará que esto suceda.Espero que esto ayude a alguien.¡Sé que me habría beneficiado ver algo como esto hace unos días!

Lo resolví de esta manera.Mantuve el archivo de 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 del proyecto principal, verifiqué "Habilitar configuración de seguridad de ClickOnce" y seleccioné "Esta es una aplicación de plena confianza", 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 CommonAppDataFolder.

[Carpeta de datos de aplicación común][Fabricante][Nombre del producto]

No sé si 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 "solo para el usuario actual" o "para todos los usuarios:".En consecuencia, el archivo de la base de datos terminaría en la carpeta de datos de la aplicación del usuario actual o en la de Todos los usuarios.La configuración tendría que escribir esta información en algún lugar para que la aplicación pueda recuperarla más tarde cuando acceda a la base de datos.¿De qué otra manera sabría en 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.Por supuesto, me doy cuenta de que dos usuarios no podrían instalar la aplicación en el mismo ordenador sin sobrescribir los datos del otro.Sin embargo, ésta es una posibilidad tan remota que no quiero considerarla.

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 DataSet, abra el nodo Conexión y edite la propiedad ConnectionString para que tenga el siguiente aspecto:

Data Source=|DataDirectory|\YourDatabase.sdf

Luego seguí las instrucciones de Lyman Enders Knowles anteriores sobre cómo agregar la carpeta de datos de la aplicación común al proyecto de instalación y coloqué el archivo de la base de datos en esa carpeta.

Luego seguí la sugerencia de Ove desde arriba, es decir.Verifiqué "Habilitar 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 lectura como para escritura.

Me gusta el concepto de abajo, algunas cosas tomadas de 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 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 la "carpeta de datos de aplicaciones comunes". (Este no es el nombre que se usará para la carpeta resultante, es solo para ayudarlo a mantenerlo recto).

  4. Cambie la propiedad DefaultLocation de la carpeta a "[CommonAppDataFolder][Fabricante][ProductName]".Tenga en cuenta la similitud con la propiedad DefaultLocation de la carpeta de la aplicación, incluido el uso extraño de una sola barra invertida.

  5. Marvel por un momento en el hecho ridículo (pero 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 de propiedad de la carpeta a "COMMONAPPDATAFOLDER".

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

No estoy seguro de 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 registrar en su aplicación.

Si lo que está diciendo es que desea poder instalar en otras carpetas en la máquina, entonces ese es un problema.Esencialmente, 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 lo que está instalando.

Por lo tanto, esto no funcionará si necesita otro directorio.Lo que hace esta solución es permitirle especificar dónde dentro de su aplicación buscar archivos ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top