C # Windows Service Textwriter - PullRequest
       60

C # Windows Service Textwriter

2 голосов
/ 19 января 2012

Я создал стандартную службу Windows, которая использует учетную запись LocalSystem.Для файлов журнала я использую textwriter для записи в указанный файл в каталоге C: \ Users \ useraccount.Проблема заключается в том, что при запуске в качестве службы в LocalSystem он вообще не хочет создавать или записывать в файл.

 string dir = @"C:\Users\useraccount\log.txt";
 StreamWriter sw = File.AppendText(dir);

Как видите, каталог жестко закодирован, поэтому нетt любые конфликты базовых каталогов, видимые как LocalSystem, начнутся в System32 или что-то в этом роде.Права доступа к папке позволяют системной учетной записи получить полный доступ к ней (Windows 7), так почему я не могу создать / записать этот файл?

Спасибо за любой ввод!

Редактировать:

Очевидно, что поток программы ведения журнала также работает как LocalSystem, когда мне действительно нужно, чтобы он работал как обычный пользователь.Итак, как мне выполнить многопоточный процесс из службы для запуска под учетной записью локального пользователя, а не под LocalSystem.

Я использую Thread.new (процесс), где процесс - это дополнительная программа.Программа процесса должна получить входные данные, прежде чем что-то записать, и она не получает входные данные, потому что находится на неправильной учетной записи.Как бы это исправить?

Ответы [ 3 ]

1 голос
/ 19 января 2012

Должен выполнить тот же трюк, что и using(...), но вы пытались:

sw.Close();

Без него есть только пустой файл, но он не выдает исключений ..

0 голосов
/ 19 января 2012

Прежде всего, я бы использовал Log4Net вместо того, чтобы использовать свой собственный механизм регистрации, если только нет веской причины не делать этого. Таким образом, вы можете создать нужный файл журнала, а также (через конфигурацию или код) добавить такие приложения, как журнал событий Windows. Тогда я бы обязательно регистрировал все исключения. Вы говорите, что исключение не выдается, я ожидаю, что в потоке ведения журнала возникает исключение, которое не «всплывает», поэтому перехватите его и зарегистрируйте его (Log.Error (ex)). Затем вы можете увидеть эти исключения в журнале событий, если вы настроили приложение для журнала событий.

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

0 голосов
/ 19 января 2012

Попробуйте этот код и проверьте, какие отчеты об исключениях:

try
{
     using (StreamWriter sw = File.AppendText(dir))
     {
          sw.WriteLine("test");
     }
}
catch (Exception ex)
{
     Debug.Print(ex.Message);
}

Замечание: рекомендуется использовать using(...) со всеми классами, реализующими интерфейс IDisposable, поэтому вы можете быть уверены, чтоосвобождается при выходе из блока!

...