2

LocalSystemアカウントを使用する標準のWindowsサービスを作成しました。ログファイルの場合、テキストライターを使用して、C:\ Users\useraccountディレクトリ内の指定されたファイルに書き込みます。問題は、LocalSystemでサービスとして実行しているときに、ファイルを作成したり、ファイルに書き込んだりすることをまったく望まないことです。

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

ご覧のとおり、ディレクトリはハードコーディングされているため、LocalSystemがSystem32またはそのような性質で起動するため、ベースディレクトリの競合は発生しません。フォルダーのアクセス許可により、システムアカウントはフォルダーに完全にアクセスできます(Windows 7)。なぜそのファイルを作成/書き込みできないのですか?

ご入力いただきありがとうございます。

編集:

どうやら、ロギングプログラムスレッドはLocalSystemとしても実行されているようですが、実際に標準ユーザーとして実行する必要がある場合です。では、サービスからスレッド化されたプロセスを実行して、LocalSystemではなくローカルユーザーアカウントで実行するにはどうすればよいですか。

Thread.new(process)を使用します。ここで、processは追加のプログラムです。プロセスプログラムは、何かを書き込む前に入力を受け取る必要がありますが、アカウントが間違っているため、入力を受け取っていません。これをどのように修正しますか?

4

3 に答える 3

1

と同じトリックを行う必要がありますが、using(...)試しましたか?

sw.Close();

それがないと、空のファイルがありますが、例外はスローされません。

于 2012-01-19T08:56:56.713 に答える
0

このコードを試して、どの例外レポートを確認してください。

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

注:インターフェースをusing(...)実装するすべてのクラスで使用することをお勧めしIDisposableます。これにより、ブロックを終了するときに確実に解放されます。

于 2012-01-19T08:17:16.530 に答える
0

まず第一に、正当な理由がない限り、独自のロギング メカニズムを展開する代わりにLog4Netを使用します。このようにして、必要なログ ファイルを作成できますが、(構成またはコードを介して) Windows イベント ログなどのログ アペンダーを追加することもできます。次に、すべての例外をログに記録するようにします。あなたは例外がスローされていないと言いますが、「バブリング」していないロギングスレッドで例外がスローされていると予想されるので、それをキャッチしてログに記録します(Log.Error(ex))。イベント ログ アペンダーを構成している場合は、これらの例外をイベント ログで確認できます。

最後に、ログオンしているユーザーのセキュリティ コンテキストをどのように想定するのかわかりません。ユーザーに資格情報を入力するように求めるものを作成するか、ユーザーのセキュリティコンテキストを偽装/想定する権利をプロセスに付与しない限り、それは大きなセキュリティホールのように聞こえます..おそらくそれが答えです、サービスはユーザーに応答しますこの権利を付与するようにユーザーに促すことによってログオンします。この点に対するより良い答えを探してみます。

于 2012-01-19T09:17:13.633 に答える