注意:这是对这个问题的完整重写。我之前将一些 ACL 问题与我正在寻找的问题混为一谈,这可能就是没有答案的原因。
我有一个 Windows 服务,它使用标准的打开/关闭/写入例程来写入日志文件(它从管道中读取内容并将其填充到日志中)。每天午夜打开一个新的日志文件。该系统是 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)。