2009-02-11 5 views
5

Tengo una aplicación utilizable por todos los usuarios (admin o limitada) en .NET (C# específicamente).C# La aplicación no puede leer/escribir archivos creados por el administrador cuando se ejecuta en una cuenta de usuario limitada XP

Cuando la aplicación se inicia por primera vez, crea algunos archivos que necesita en C: \ Documents and Settings \ All Users \ Documents \ para todos los lanzamientos posteriores.

Si el usuario limitado en XP es el PRIMER usuario en iniciar la aplicación, crea los archivos correctamente y tanto el usuario limitado como los administradores pueden ejecutar correctamente.

Sin embargo, si el administrador (o supongo que un usuario diferente diferente) es el primero en iniciar la aplicación, entonces el usuario limitado NO podrá ejecutar la aplicación.

Los dos archivos que NO puede leer/escribir si los ha creado un administrador son un archivo de registro Log4Net y un archivo SQLite db.

El archivo de base de datos SQLite se está creando con un archivo .NET File.Copy (sourcepath, destinationpath). Sourcepath es un archivo de base de datos de semillas instalado con la aplicación, por lo que en la primera ejecución copia eso de C: \ Program Files \ app install \ seed.db

¿Hay alguna manera de establecer los permisos en el archivo cuando ¿cópialo? File.SetAccessControl() tal vez? No tengo claro cómo funciona eso.

El otro problema es que el apilador de archivos rodantes log4Net no hará rodar el archivo anterior y creará uno nuevo ya que el usuario administrador creó el archivo anterior cuando lo ejecutó.

¿Alguna idea? Irónicamente, todo esto funciona perfectamente en Vista con cuentas limitadas/de administrador, esto SOLAMENTE sucede en XP con cuentas de administrador/limitadas.

+0

¿Por qué está compartiendo archivos entre múltiples usuarios en la misma PC? esto casi nunca es una buena decisión. ¿Por qué no simplemente colocar los archivos en la carpeta de aplicación de cada usuario individual según sea necesario? –

Respuesta

2

Sí, es el método SetAccessControl bien, hay un buen ejemplo here (el puesto de satankidneypie)

Buena suerte

+0

Gracias - ese enlace es exactamente lo que necesitaba (especialmente con la capacidad de obtener el usuario 'Todos' de una manera independiente de la cultura) – jonathanq

6

Creo SetAccessControl es el camino a seguir. Tal vez algo como esto:

// get the existing access controls 
FileSecurity fs = File.GetAccessControl(yourFilename); 

// add the new rule to the existing settings 
fs.AddAccessRule(new FileSystemAccessRule(
    @"DOMAIN\Users", // or "BUILTIN\Users", "COMPUTER\AccountName" etc 
    FileSystemRights.Modify, 
    AccessControlType.Allow)); 

// set the updated access controls 
File.SetAccessControl(yourFilename, fs); 

Nota: Es importante que obtenga la lista de control de acceso existente desde el archivo y luego añadir la nueva regla a eso. Si acaba de crear una nueva lista de control de acceso desde cero, sobrescribirá los permisos existentes por completo.

Cuestiones relacionadas