compañeros antropoides y nenúfares 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 Vista y XP máquinas. Estoy trabajando en una instalación/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 de 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, ninguno de los cuales puede ser requerido para ser un administrador. Esto significa, por supuesto, que los archivos no pueden ir en el propio directorio de instalación del programa (como suele suceder antes de la llegada de Vista, ¡sí, sí!).
Esperaba que la solución fuera simple. Vista y XP ambos 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 aplicación compartida como destino en el proyecto de instalación.
El proyecto de instalación ofrece una carpeta "Archivos comunes", pero que 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 aplicación del usuario", pero esa 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 compartidos de la aplicación de una manera robusta, entre versiones de Windows desde un proyecto de instalación de VS 2008? Alguien me puede decir como?
He aprendido la respuesta a mi pregunta a través de otras fuentes, ¡sí, sí! Lamentablemente, ¡no solucionó mi problema! ¿Qué es lo que me convierte en un reparador superior? ¡Sí Sí!
Para poner cosas en un subdirectorio de la carpeta Datos de aplicación común de un proyecto de instalación de VS2008, esto es lo que debe hacer:
Haga clic derecho en su proyecto de configuración en el Explorador de soluciones y seleccione "Ver -> Sistema de archivos".
Haga clic con el botón derecho en "Sistema de archivos en la máquina de destino" y seleccione "Agregar carpeta especial -> Carpeta personalizada".
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 correcto).
Cambie la propiedad DefaultLocation de la carpeta a "[CommonAppDataFolder] [Fabricante]\[ProductName]". Tenga en cuenta la similitud con la propiedad DefaultLocation de la carpeta de aplicaciones, incluido el uso extraño de una barra invertida única.
Maravíllate por un momento ante el hecho ridículo (pero innegable) de que hay una propiedad de carpeta llamada "Propiedad".
Cambie la propiedad de propiedad de la carpeta a "COMMONAPPDATAFOLDER".
Los archivos de datos ubicados en la carpeta "Datos comunes de la aplicación" se copiarán a "\ ProgramData\Manufacturer\ProductName" (en Vista) o "\ Documents and Settings\All Users\Application Data\Manufacturer\ProductName" (en XP) cuando Se ejecuta el instalador.
Ahora resulta que bajo Vista, los no Administradores no obtienen acceso de modificación/escritura a los archivos aquí. Por lo tanto, todos los usuarios pueden leer los archivos, pero también lo obtienen en "\ Archivos de programa". Entonces, ¿cuál es el punto de la carpeta Datos comunes de la aplicación?
En lugar de marcar "Habilitar configuración de seguridad de ClickOnce" y seleccionar "Esta es una aplicación de confianza completa", 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 configuración. Esto es lo que hice:
static void Main(string[] args)
{
if (args != null && args.Length > 0 && args[0] == "Install")
{
ApplicationData.SetPermissions();
}
else
{
// Execute app "normally"
}
}
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 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 describió anteriormente evitará que esto suceda. Espero que esto ayude a alguien. ¡Sé que podría haberme beneficiado de ver algo así hace unos días!
Lo resolví 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 del proyecto principal, verifiqué la opción "Habilitar 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] [Fabricante] [ProductName]
No sé si esto fue un error tipográfico, pero Lyman se refirió al uso extraño de una barra invertida simple, pero esto no parece correcto.
Tuve el mismo problema. El proyecto de configuració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 de Todos los usuarios. tiene que escribir esta información en algún lugar para que la aplicación pueda recuperarla luego, cuando se trata de acceder 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. Me doy cuenta, por supuesto, que dos usuarios no pueden instalar la aplicación en la misma computadora sin sobrescribir los datos del otro. Sin embargo, esta 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 Connection y edite la propiedad ConnectionString para que tenga el siguiente aspecto:
Data Source=|DataDirectory|\YourDatabase.sdf
Luego seguí las instrucciones de Lyman Enders Knowles de arriba sobre 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.
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 confianza completa.
Después de eso, la aplicación se implementó bien en Vista y el archivo de base de datos fue accesible tanto para lecturas como para escrituras.
me gusta el concepto a continuación, algunas cosas tomadas desde arriba
Haga clic derecho en su proyecto de configuración en el Explorador de soluciones y seleccione "Ver -> Sistema de archivos".
Haga clic con el botón derecho en "Sistema de archivos en la máquina de destino" y seleccione "Agregar carpeta especial -> Carpeta personalizada".
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 correcto).
Cambie la propiedad DefaultLocation de la carpeta a "[CommonAppDataFolder] [Fabricante] [ProductName]". Tenga en cuenta la similitud con la propiedad DefaultLocation de la carpeta de aplicaciones, incluido el uso extraño de una barra invertida única.
Maravíllate por un momento ante 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?
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 eso es un problema. Esencialmente, la razón por la que MS ha restringido estas cosas es para mantener el código malicioso fuera de las máquinas donde el usuario no sabe 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 ......