2012-03-31 17 views
5

He creado una aplicación que funciona solo cuando no se ejecuta como un servicio de Windows. Bueno, el servicio se ejecuta, pero no hace lo que debería. El servicio usa la cuenta de servicio local. Así que para dar inicio a la depuración, pensé que me gustaría empezar con algo sencillo: haga que crear un directorio cuando se inicia:El servicio de Windows no puede escribir en% LOCALAPPDATA%

Directory.CreateDirectory(
    Environment.SpecialFolder.LocalApplicationData + "\\MyService"); 

Cuando empecé el servicio, se detuvo casi de inmediato y Windows informó de este hecho. Cuando comenté la declaración anterior, recompilada y reinstalada, el servicio se ejecutó sin interrupción.

Obviamente, la línea de arriba arroja una excepción de algún tipo. No tengo forma de registrar el error porque no puedo escribir en el sistema de archivos. ¿Alguna idea de por qué el Servicio local no puede crear un directorio en su propio% LOCALAPPDATA%?

+3

Un poco triste que compila este código :( –

Respuesta

10

Debe utilizar GetFolderPath con LocalApplicationData así:

string folderName = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.LocalApplicationData), 
    "MyService"); 

Directory.CreateDirectory(folderName) 
+1

+ 1 Me pegó a él: 0) – Tung

+1

Me siento tan tonto ahora. Voy a darle un giro ... –

+0

Gracias. Se creó el directorio 'C: \ Windows \ ServiceProfiles \ LocalService \ AppData \ Local \ MyService'. Ahora puedo continuar con el registro. –

0

Le sugiero que escriba los detalles de la excepción en el registro de eventos. Todas las cuentas de usuario tienen permiso para escribir en el registro de eventos, siempre que el administrador y los nombres de inicio de sesión y de origen ya hayan sido creados (lo cual puede hacer simplemente ejecutando primero la aplicación como usted).

En cuanto a la causa raíz del error, es puede ser porque LocalService normalmente no obtiene un conjunto completo de carpetas de perfil creadas de forma predeterminada. No estoy seguro de si esto es por diseño, o simplemente lo que he observado en varias máquinas.

+0

Gracias. Probaré el registro de eventos. Tengo entendido que (al menos en Windows 7) '% LOCALAPPDATA%' para el servicio local es 'C: \ Windows \ ServiceProfiles \ LocalService \ AppData \ Local'. –

4

Creo que esto podría ser debido a que no hay ninguna carpeta especial. Cuando se ejecuta como la cuenta de servicio local, se ejecuta bajo ese usuario, no el usuario que inició sesión. por lo que está solicitando una carpeta especial que probablemente no exista, ya que no creo que el servicio local tenga un perfil. (Puedo estar equivocado) - que estaba equivocado: p

Sólo en caso de que alguien salga por:

C:\Windows\ServiceProfiles\LocalService 

es la carpeta de perfil de servicio local, por lo que va a terminar allí.

Si desea depurar que rodean esa línea con un intento de captura, y luego escribir el error en un archivo:

try 
{ 
    Directory.CreateDirectory(Environment.SpecialFolder.LocalApplicationData + "\\MyService"); 
} 
catch (Exception ex) 
{ 
    System.IO.StreamWriter file = new System.IO.StreamWriter(@"C:\MyServicelog.txt",true); 
    file.WriteLine(ex.Message); 
    file.Close(); 
} 

Al menos así se puede ver cuál está causando el error

Martyn

+0

+1 lo más probable es que no tenga un perfil. –

Cuestiones relacionadas