Почему файлы размещаются в «C: \ Users \ AppData \ Local \ VirtualStore \ Program Files (x86)”?
Недавно я обновил приложение Visual Basic 6.0 и теперь включил файл exe.manifest для предотвращения виртуализации UAC . После применения этого обновления некоторые пользователи не могут найти свои файлы данных ( Access MDB-файлы), и после системного поиска они заканчивают поиск в C:\Users\AppData\Local\VirtualStore\Program Files(x86)
.
Какова область этой папки для и как / когда файлы будут перемещены в эту область? Как мы это предотвращаем? Теперь я надеюсь, что мое приложение использует .manifest
это не повторится. Были ли файлы размещены там до того, как манифест был использован, когда приложение было помещено в UAC Virtualization?
- Как установить Windows XP, когда Vista и Win 7 уже установлены на компьютере?
- Как включить режим AHCI после установки Windows Vista в режиме IDE и до / для Windows 7 чистой установки?
- Как выполнить команду в качестве администратора из командной строки Windows?
- Устранение неполадок не удалось выполнить обновление до Windows 7?
- Как я могу заставить VirtualBox хорошо играть с двумя мониторами?
- Скорость соединения снижается с 1 Гбит / с до 10 Мбит / с (Vista 64)
- Как я могу рекурсивно очистить флаг «Скрытый» файл в Windows Vista?
- Скрыть выбранные значки с панели задач навсегда
- Программно предотвратить запуск заставки Windows
- Windows Vista 32-бит для Windows 7 64-битное обновление?
- Как найти все символические ссылки в Windows Vista или 7?
- Сколько раз - в указанную дату - использовался DVD-рекордер?
- Как заставить панель задач Vista охватывать несколько мониторов?
Я предполагаю, что ваш манифест говорит asInvoker и что ваше приложение пытается записать в Program Files. Когда пользователи запускали его без манифеста, он писал виртуальному хранилищу для Program Files, это путь, по которому они позже нашли некоторые файлы. Когда они запускались с манифестом, он вообще не писал (с доступом отказался), но либо ваше приложение скрыло от них ошибку, либо они не понимали ошибки, поэтому они не упоминали об этом вам.
Краткосрочное исправление – используйте манифест requireAdministrator. Это будет раздражать пользователей, но записи будут успешными. Более долгосрочное исправление – не записывайте в ProgramFiles. Есть лучшие варианты для каждого пользователя, такие как AppData.
Приложение, которое не работает с повышенными привилегиями, не должно иметь доступа к каталогам Program Files
и Program Files (x86)
. Это хорошо для безопасности. Кроме того, в большинстве случаев, когда разработчик сообщает своей программе о сохранении данных в папке Program Files
, например, настройках программы, он полностью забыл, что настройки программы должны быть для пользователя для каждого пользователя! То есть каждый пользователь на локальном компьютере должен иметь возможность использовать программу, не затрагивая других пользователей. Другими словами, хорошо выполненное приложение должно вместо этого сохранить свои настройки в
C:\Users\\AppData\Local\\\
каталог.
Например, мое программное обеспечение AlgoSim записывает
C:\Users\\AppData\Local\Rejbrand\AlgoSim\2.0
Конечно,
C:\Users\\AppData\Local\
путь должен выполняться динамически во время выполнения. использование
SHGetFolderPath(0, CSIDL_LOCAL_APPDATA, 0, SHGFP_TYPE_CURRENT, @path);
для этого.
С тех пор, как Windows Vista, приложения, которые не работают с повышенными привилегиями, которые пытаются записать в папку Program Files
(или Program Files (x86)
), фактически будут записываться в папку VirtualStore, не зная. Microsoft считала, что это будет лучше, чем сбой программы (вызванный ограничением доступа). И действительно, благодаря этому большинство старых программ, которые сохраняют свои настройки в папке Program Files
будут продолжать работать с Windows Vista +, и каждый пользователь получит свои собственные настройки в качестве бонуса, хотя оригинальный производитель программного обеспечения не думал о это.
Вы можете использовать манифест, чтобы сообщить Windows, что ваше приложение знает о VirtualStore, и что Windows не должна изменять какие-либо пути во время выполнения. Но если вы действительно хотите писать в папку Program Files
, то я думаю, что вам нужно запускать приложение с повышенными привилегиями, каждый раз, что нецелесообразно вообще.
Сведения о том, как создавать манифесты, чтобы ваша программа отображала приглашение UAC для каждого выполнения и как отключить VirtualStore, были рассмотрены в нескольких предыдущих вопросах переполнения стека. Не стесняйтесь использовать окно поиска!