Перезапись DLL выдает отказ в доступе / ошибка 5 в Windows 7
Я разработал автообновление для своего приложения, которое получает список хэшей MD5 для всех файлов с сервера обновлений и загружает новые файлы в случае несоответствия. На данный момент это происходит только для основного файла DLL, который загружается во время выполнения после (!) Обновления, завершившего свою работу.
Он отлично работает в Windows XP, но некоторые пользователи уже жаловались, что программа обновления выдает ошибку 5 "Доступ запрещен" при попытке перезаписать указанный DLL-файл. Если они запускают его с правами администратора, это работает, но для них досадно всегда соглашаться на привилегии администратора при запуске программы.
Мой вопрос: почему доступ к перезаписи этой DLL запрещен, есть ли способ сделать это без приглашения UAC?
В качестве альтернативы: есть ли способ заставить приложение работать от имени администратора постоянно, так что пользователь просто должен согласиться на это один раз, а не каждый раз, когда оно запускается.
PS: я использую Qt 4.7, особенно метод QFile::open с QFile::WriteOnly | QFile::Truncate и вызов QMessageBox, если открытие завершается неудачно с errorString() и некоторым объяснением.
Спасибо!
1 ответ
Вы убедились, что приложение является "единичным экземпляром", т.е. никогда не запускается дважды?
Если бы не это могло быть объяснение...
Что касается того, чтобы приложение всегда запускалось от имени администратора - вы НИКОГДА не должны делать это...
РЕДАКТИРОВАТЬ:
Что касается Windows 7:
Вы пытаетесь что-то перезаписать в программе напрямую... это мера безопасности ОС, предотвращающая запись туда без прав администратора...
это может помочь в работе с UAC:
http://msdn.microsoft.com/en-us/library/bb756929.aspx
http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/20acb8b9-8b9c-4a85-9416-fccdef579f10/
Windows 7 и Vista UAC - программно запрашивать повышение прав в C#