2012-01-19 5 views
2

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

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

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

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

Edit:

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

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

+1

Что вы хотите сказать, не можете создать файл? Вы получаете сообщение об ошибке или выполняете этот код без ошибок, но без результата файла? –

+0

выполняется без ошибок, но файл не найден – Goober

+0

Обратите внимание, что без вызова метода Close() в поток ничего не произойдет, поскольку поток буферизует все до тех пор, пока буфер не будет заполнен полностью или Close()/Flush() не будет вызван – codymanix

ответ

0

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

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

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

+0

Этот код может на самом деле это исправить ... Код OP не содержит удаления. Не уверен, что происходит по умолчанию. –

+0

Ну, это проблема на самом деле! Ничего не поймано! Никакое исключение не было ...не может понять, почему он работает без реальной работы – Goober

1

должны сделать тот же трюк, как using(...) но вы попробуете:

sw.Close(); 

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

0

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

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