注: これは、この質問を完全に書き直したものです。私は以前、いくつかの ACL の問題を私が探している問題と混同していました。それがおそらく答えがなかった理由です。
標準のオープン/クローズ/書き込みルーチンを使用してログ ファイルを書き込む Windows サービスがあります (パイプからデータを読み取り、ログに記録します)。毎日午前 0 時に新しいログ ファイルが開かれます。システムは Windows XP Embedded です。
このサービスは、ローカル システム サービス (ユーザーに対して NULL を指定した CreateService) として実行されます。
サービスが最初に起動すると、ログ ファイルが作成され、問題なく書き込まれます。この時点ですべて問題なく、サービス (またはコンピューター) を問題なく再起動できます。
ただし、真夜中 (日が変わるとき) に、サービスは新しいログ ファイルを作成し、それに書き込みます。面白いことに、この新しいログ ファイルには「読み取り専用」フラグが設定されています。サービス (またはコンピューター) が再起動すると、サービスは書き込み用にファイルを開くことができなくなるため、これは問題です。
問題がすでに発生しているシステムからの関連情報は次のとおりです。
Directory of C:\bbbaudit
09/16/2009 12:00 AM <DIR> .
09/16/2009 12:00 AM <DIR> ..
09/16/2009 12:00 AM 437 AU090915.ADX
09/16/2009 12:00 AM 62 AU090916.ADX
attrib c:\bbbaudit\*
A C:\bbbaudit\AU090915.ADX <-- old log file (before midnight)
A R C:\bbbaudit\AU090916.ADX <-- new log file (after midnight)
cacls output:
C:\ BUILTIN\Administrators:(OI)(CI)F
NT AUTHORITY\SYSTEM:(OI)(CI)F
CREATOR OWNER:(OI)(CI)(IO)F
BUILTIN\Users:(OI)(CI)R
BUILTIN\Users:(CI)(special access:)
FILE_APPEND_DATA
BUILTIN\Users:(CI)(IO)(special access:)
FILE_WRITE_DATA
Everyone:R
C:\bbbaudit BUILTIN\Administrators:(OI)(CI)F
NT AUTHORITY\SYSTEM:(OI)(CI)F
CFN3\Administrator:F
CREATOR OWNER:(OI)(CI)(IO)F
ログファイルを開く/作成するために使用するコードは次のとおりです。
static int open_or_create_file(char *fname, bool &alreadyExists)
{
int fdes;
// try to create new file, fail if it already exists
alreadyExists = false;
fdes = open(fname, O_WRONLY | O_APPEND | O_CREAT | O_EXCL);
if (fdes < 0)
{
// try to open existing, don't create new file
alreadyExists = true;
fdes = open(fname, O_WRONLY | O_APPEND);
}
return fdes;
}
ファイルが読み取り専用フラグを取得する方法を理解するのに本当に苦労しています。手がかりや方向性を教えてくれる人は誰でも、大歓迎です。
コンパイラは VC 6 です (ええ、わかっています。時代遅れなので面白くありません。NT 3.51 から XPE にアップグレードしたばかりであることに気付くまでは)。