Почему файлы помещаются в «C: \ Users \ <username>AppData \ Local \ VirtualStore \ Program Files (x86)»? - PullRequest
31 голосов
/ 10 июля 2010

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

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

Ответы [ 2 ]

36 голосов
/ 10 июля 2010

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

7 голосов
/ 11 июля 2010

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

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

...