Как получить (программно) расположение виртуализированного файла Windows UAC?

У меня есть 32-битное старое приложение Windows (с источником C / Win32), которое создает свой файл данных в той же папке, где находится исполняемый файл.

Поскольку в приложении нет программы установки, и пользователь может разместить исполняемый файл где угодно, в приложении есть диалоговое окно, информирующее пользователя о местонахождении его данных.

Но в Microsoft Vista / Seven, если пользователь помещает приложение в Program Files или любую другую защищенную системой папку, файл данных виртуализируется и перемещается в виртуальное хранилище.

Если в Vista / Seven я все еще хочу сообщить пользователю, где находится файл данных: (без предотвращения виртуализации в файле манифеста)

  1. Как я могу узнать (программно), виртуализирован ли файл данных? Или, если папка, в которой находится исполняемый файл, подразумевает, что файл данных будет виртуализирован?

  2. Предполагая, что я знаю, что файл данных виртуализирован, как я могу узнать (программно) расположение виртуальной папки, чтобы отобразить ее в диалоговом окне информации?

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

Как определить перенаправление файлов в Windows VirtualStore?


person Jose M Balaguer    schedule 30.07.2013    source источник


Ответы (1)


Виртуализация прозрачна для приложения. Единственный способ узнать, виртуализируется ли он, - это спросить ОС в соответствии с ответом в вопросе, с которым вы связались (используйте GetTokenInformation() с флагом TokenVirtualizationEnabled), но нет способа (о котором я знаю) спросить ОС, где виртуализированные элементы фактически сохраняются, поскольку они могут отличаться от одной версии ОС к другой. Вам нужно будет провести некоторое исследование, а затем жестко запрограммировать пути для каждой данной ОС, которые ваше приложение обнаруживает во время выполнения.

Если вы собираетесь обновить свой код для обнаружения виртуализации, вам лучше обновить код, чтобы лучше работать с UAC. Прекратите хранить свои файлы там, где они не принадлежат, и начните хранить их там, где Microsoft хочет, чтобы вы их хранили. В этом случае вместо этого в профиле пользователя. Используйте SHGetFolderPath() или связанную функцию, чтобы найти папку CSIDL_LOCAL_APPDATA пользователя (или SHGetKnownFolderPath() в Vista +, чтобы найти папку FOLDERID_LocalAppData), затем создайте под ней подпапку, в которой ваше приложение будет хранить файлы данных.

person Remy Lebeau    schedule 30.07.2013