Почему файлы размещаются в «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?

Я предполагаю, что ваш манифест говорит 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, были рассмотрены в нескольких предыдущих вопросах переполнения стека. Не стесняйтесь использовать окно поиска!

  • Windows Vista застряла
  • IPCONFIG только для одного сетевого адаптера
  • Обновление Windows в Windows Vista
  • Windows Vista не загружается после удаления раздела
  • Unistalled C ++ Redistributables в Windows Vista
  • Как автоматически заставить компьютер спать и просыпаться?
  • Для чего нужны файлы desktop.ini?
  • Что такое простое домашнее программное обеспечение для резервного копирования, которое работает с различными ОС?
  • Использование ЦП достигает 50% и остается там до тех пор, пока не будет приостановлено
  • Как разблокировать Windows-спящий диск?
  • BSOD - невозможно проверить временную метку для ntoskrnl.exe
  • Давайте будем гением компьютера.