Почему файлы становятся помещенными в “C:\Users\<username>AppData\Local\VirtualStore\Program Files (x86)”?

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

Какова эта область папки для и как/когда файлы становятся перемещенными в эту область? Как мы предотвращаем его? Я надеюсь теперь, когда мое приложение использует a .manifest этого не произойдет снова. Файлы становились помещенными там, прежде чем декларация использовалась, когда приложение помещалось в Виртуализацию контроля учётных записей?

35
задан Peter Mortensen 14 January 2013 в 12:26
поделиться

2 ответа

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

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

8
ответ дан 27 November 2019 в 07:19
поделиться

Приложение, не запущенное с повышенными привилегиями, не должно иметь доступа к каталогам 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 Overflow. Не стесняйтесь пользоваться поисковой строкой!

37
ответ дан 27 November 2019 в 07:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: