ПРИМЕЧАНИЕ. Это полная перезапись этого вопроса. Раньше я сталкивался с некоторыми проблемами 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).
Спасибо. Это здорово, наконец, получить правильный ответ. Я больше не работаю с этой компанией, поэтому я не могу легко вернуться и проверить этот бит кода, но я явно использовал «open» неправильно, поэтому я уверен, что вы правы. –