Служба Windows не может записать в% LOCALAPPDATA% - PullRequest
6 голосов
/ 31 марта 2012

Я создал приложение, которое работает только тогда, когда не работает как служба Windows.Ну, служба работает, но она не делает то, что должна.Служба использует учетную запись локальной службы.Поэтому, чтобы начать отладку, я решил начать с чего-то простого: создать каталог при запуске:

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

Когда я запустил службу, она почти сразу остановилась, и Windows сообщила об этом.Когда я закомментировал вышеприведенное утверждение, перекомпилировал и переустановил, служба работала без остановки.

Очевидно, что приведенная выше строка вызывает какое-то исключение.У меня нет способа записать ошибку, потому что я не могу записать в файловую систему.Есть идеи, почему локальная служба не может создать каталог в своем собственном% LOCALAPPDATA%?

Ответы [ 3 ]

10 голосов
/ 31 марта 2012

Вы должны использовать GetFolderPath с LocalApplicationData следующим образом:

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

Directory.CreateDirectory(folderName)
4 голосов
/ 31 марта 2012

Я думаю, что это может быть потому, что нет специальной папки. При работе в качестве локальной учетной записи службы вы работаете под этим пользователем, а не вошедшим в систему пользователем. поэтому вы запрашиваете специальную папку, которая, вероятно, не существует, так как я не думаю, что у локальной службы есть профиль. (Я могу ошибаться) - Я был неправ: p

На всякий случай, если кто-нибудь заскочит:

C:\Windows\ServiceProfiles\LocalService

- это локальная папка профиля службы, поэтому она окажется там.

Если вы хотите отладить, окружите эту строку попыткой catch, а затем запишите ошибку в файл:

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

По крайней мере, тогда вы увидите, что вызвало ошибку

Martyn

0 голосов
/ 31 марта 2012

Я предлагаю вам записать информацию об исключении в журнал событий.Все учетные записи пользователей имеют разрешение на запись в журнал событий, если администратор уже создал журнал и имена источников (что можно сделать, просто запустив приложение в качестве самого пользователя).Основная причина ошибки: , возможно , потому что LocalService обычно не получает полный набор папок профиля, созданных по умолчанию.Я не уверен, что это по замыслу, или просто то, что я наблюдал на разных машинах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...