Службам Windows запрещено чтение из% WINDIR% (C: \ Windows)? - PullRequest
0 голосов
/ 10 марта 2011

У меня есть приложение, работающее в качестве службы Windows, которое хочет прочитать файл, указанный в относительном пути.Поскольку служба работает под C: \ Windows \ system32 (на Server 2003 и Windows 7), я полагаю, что она должна читать файл оттуда.Однако чтение файла всегда заканчивается неудачей.

Я собрал простой тестовый код, чтобы попытаться открыть файл для чтения, используя абсолютный путь.Хотя служба работает успешно для файлов, таких как C: \ Temp \ foo.txt , она всегда завершается ошибкой для файлов, таких как C: \ Windows \ foo.txt и C: \Windows \ system32 \ foo.txt .GetLastError() возвращает 2.

Я столкнулся с проблемой доступа?Я не мог найти авторитетную документацию по этому вопросу.Есть ли обходной путь?

Обновление:

Код проверки файла является общим и простым:

std::ofstream out;
//...

std::string fileName("C:\\Windows\\system32\\Foo.txt");

hFile = CreateFile(fileName.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if (hFile == INVALID_HANDLE_VALUE) {
  out << "Could not create file handle! (" << GetLastError() << ")" << std::endl;
}
else {
  out << "Successfully opened file!" << std::endl;
  CloseHandle(hFile);
}

Ответы [ 2 ]

0 голосов
/ 10 марта 2011

Попробуйте запустить службу Windows из учетной записи локальной системы.По умолчанию служба может быть запущена из учетной записи «Сетевая служба».Чтобы изменить настройки, откройте диспетчер служб Windows (Run-> services.msc) и дважды щелкните свой сервис.В окне свойств выберите 2-ю вкладку «Вход в систему» ​​и измените ее на запуск с учетной записью локальной системы.

0 голосов
/ 10 марта 2011

Код ошибки 2 - ERROR_FILE_NOT_FOUND, поэтому вероятнее всего, что указанный вами путь просто не существует или файл не существует по этому пути.Без соответствующих флагов от CreateFile трудно дать вам лучший ответ.

Но обычно - при условиях по умолчанию - службе разрешается читать в этой папке.

Еще одна вещьпришло в голову.Как вы получаете путь (C:\Windows в вашем случае)?Надлежащим способом является использование API (например, GetWindowsDirectory) для этого, а не его жесткое кодирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...