Подтвердить что ты не робот

Почему файлы размещаются в "C:\Users\<имя пользователя> AppData\Local\VirtualStore\Program Files (x86)"?

Недавно я обновил приложение Visual Basic 6.0 и теперь включил файл exe.manifest, чтобы предотвратить UAC Виртуализация. После применения этого обновления некоторые пользователи не могут найти свои файлы данных (Access файлы MDB), и после системного поиска они заканчивают поиск в C:\Users\<username>AppData\Local\VirtualStore\Program Files(x86).

Какова область этой папки для и как/когда файлы будут перемещены в эту область? Как мы это предотвращаем? Я надеюсь, что в моем приложении будет .manifest, это не повторится. Были ли файлы размещены там до того, как манифест был использован, когда приложение было помещено в UAC Virtualization?

4b9b3361

Ответ 1

Я предполагаю, что ваш манифест говорит asInvoker и ваше приложение пытается записать в Program Files. Когда пользователи запускали его без манифеста, он писал виртуальному хранилищу для Program Files, это путь, по которому они позже нашли некоторые файлы. Когда они запускались с манифестом, он вообще не писал (с доступом отказался), но либо ваше приложение скрыло от них ошибку, либо они не понимали ошибку, поэтому они не упомянули об этом вам.

Краткосрочное исправить - используйте манифест requireAdministrator. Это будет раздражать пользователей, но записи будут успешными. Более долгосрочное исправление - не записывайте в ProgramFiles. Есть лучшие варианты для каждого пользователя, такие как AppData.

Ответ 2

Приложение, которое не работает с повышенными привилегиями, не должно иметь доступа к каталогам Program Files и Program Files (x86). Это хорошо для безопасности. Кроме того, в большинстве случаев, когда разработчик сообщает своей программе о сохранении данных в папке Program Files, например, настройках программы, он полностью забыл, что настройки программы должны быть для пользователя для каждого пользователя! То есть каждый пользователь на локальном компьютере должен иметь возможность использовать программу, не затрагивая других пользователей. Другими словами, хорошо выполненное приложение должно вместо этого сохранить свои настройки в

C:\Users\<User Name>\AppData\Local\<Manufacturer>\<Product>\<Product Version> 

Каталог.

Например, мое программное обеспечение AlgoSim записывает в

C:\Users\<User Name>\AppData\Local\Rejbrand\AlgoSim\2.0

Конечно,

C:\Users\<User Name>\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, были рассмотрены в нескольких предыдущих вопросах переполнения Stack Не стесняйтесь использовать окно поиска!