ПРИМЕЧАНИЕ. Это полное переписывание этого вопроса. Ранее я связывал некоторые проблемы ACL с проблемой, на которую я охотюсь, поэтому, вероятно, не было ответов.
У меня есть служба Windows, которая использует стандартные процедуры открытия / закрытия / записи для записи файла журнала (он читает данные из канала и вставляет их в журнал). Новый файл журнала открывается каждый день в полночь. Система Windows XP Embedded.
Служба работает как служба локальной системы (CreateService с NULL для пользователя).
Когда служба изначально запускается, она создает файл журнала и записывает в него без проблем. На данный момент все в порядке, и вы можете перезапустить службу (или компьютер) без проблем.
Однако в полночь (когда меняется день) служба создает новый файл журнала и записывает в него. Самое смешное, что у этого нового файла журнала установлен флаг «только для чтения». Это проблема, потому что если служба (или компьютер) перезапускается, служба больше не может открыть файл для записи.
Вот соответствующая информация из системы с уже возникшей проблемой:
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 (да, я знаю, он настолько устарел, что это не смешно. Пока вы не поймете, что мы только что перешли на XPE с NT 3.51).