StreamWriterがWindowsサービスで機能しないのはなぜですか?
-
08-07-2019 - |
質問
テキストファイルにログを記録する簡単なコードがあります:
public static void RecordToFile(string filename, Log log)
{
TextWriter textWriter = new StreamWriter(Constants.APP_PATH +
"\\" + filename, true);
textWriter.WriteLine(log.ToString());
textWriter.Close();
}
これは、Windowsフォームアプリケーションで完全に機能します。ただし、 instsrvおよびsrvany トリックを使用して、これをWindowsサービスにしました。サービスは正常に実行され、データベースにアクセスし、クエリを実行します。このStreamWriterを除きます。ログは必要なだけ更新されません。何かアイデアはありますか?
解決
ほとんどの場合、サービスはそのディレクトリへのアクセス権を持たないユーザー資格情報で実行されています。
したがって、サービスのプロパティダイアログを確認し、[ログオン]タブをチェックして、ログオンするものを確認します。
他のヒント
考えられる理由:
- Constants.APP_PATHはマップされたドライブを指している-サービスはログインしているユーザーと同じ環境では実行されないため、パスが有効ではない可能性があります
- アクセス許可-サービスを実行しているユーザーによっては、WinFormsアプリと同じディレクトリセットへのアクセス権がない場合があります
詳細な情報がなければ、誰も助けられることはあまりありません。どのように、正確に、機能しませんか?例外が発生しますか?黙って失敗するだけですか?
いくつかのヒント...
1)ファイルパスの作成に文字列連結を使用しないでください。代わりに System.IO.Path.Combine
を使用してください。このように:
TextWriter textWriter = new StreamWriter(
System.IO.Path.Combine(Constants.APP_PATH, filename), true);
2)ライターを using()
ブロックで囲みます。そのように:
using(TextWriter textWriter = new StreamWriter(
System.IO.Path.Combine(Constants.APP_PATH, filename), true))
{
textWriter.WriteLine(log.ToString());
}
3)サービスが使用しているアカウントに、そのディレクトリでファイルを作成/上書きするアクセス権があることを確認します。多くの場合、 LOCAL_SYSTEM
や NETWORK_SERVICE
などのサービスアカウントは、ユーザーアカウントと同じ権限を持ちません。これは、サービスとしてではなくユーザーとして機能する理由を説明できます。また、APP_PATH定数が、ネットワーク共有へのドライブマッピングなど、ユーザー固有の何かを指している可能性もあります。ドライブマッピングはユーザーにまたがらないため、これも問題になる可能性があります。
これ以上の情報がなければ、サービスを実行しているアカウントには書き込みのためにファイルを開く権限がありません。