У меня была похожая проблема, и введение манифеста решило ее.
Я полагался на безопасность реестра, чтобы приложение (Win32) не создавало ключи в HKLM / Software / Wow6432Node при работе от имени обычного пользователя, и был очень удивлен, увидев, что это происходит независимо, но ключ отсутствует и он был создан вместо этого в этой новой области VirtualStore.
Виртуализация реестра отключается, когда обнаруживается, что манифест PE содержит информацию, связанную с безопасностью. Чтобы не требовать повышения прав, мой манифест содержит следующий узел:
<trustInfo xmlns:ms_asmv2="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker">
</requestedExecutionLevel>
</requestedPrivileges>
</security>
</trustInfo>
Чтобы исполняемый файл был совместим с Vista и XP, очевидно, что каждый узел в разделе TrustInfo должен содержать пространство имен:
<ms_asmv2:trustInfo xmlns:ms_asmv2="urn:schemas-microsoft-com:asm.v2">
<ms_asmv2:security>
<ms_asmv2:requestedPrivileges>
<ms_asmv2:requestedExecutionLevel level="asInvoker">
</ms_asmv2:requestedExecutionLevel>
</ms_asmv2:requestedPrivileges>
</ms_asmv2:security>
</ms_asmv2:trustInfo>
Как только манифест был правильно встроен в мой .exe (мне потребовалось несколько попыток, изменив соответствующие свойства проекта), программа, наконец, завершилась сбоем, как я и ожидал.
Для управляемого кода манифест можно включить в качестве шага после сборки, запустив инструмент mt.exe. Например, как сообщается в статье MSDN
mt.exe –manifest YourFile.manifest –outputresource:YourApp.exe;#1
Я предпочитаю использовать манифестный подход, а не изменять флаги узлов реестра с помощью reg.exe, как описано в этой статье , поскольку это делает поведение согласованным на всех машинах.
Надеюсь, это поможет (даже если после прочтения даты первоначальной публикации я почти уверен, что проблема давно решена !!)
Альберто