После некоторых исследований я обнаружил, что причина игнорирования Windows моей настройки совместимости заключалась в том, что теперь в VSLauncher.exe был встроен манифест, который содержал следующий фрагмент:
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false">
</requestedExecutionLevel>
</requestedPrivileges>
Итак, VSLauncher.exe теперь указал, что он всегда хотел запускаться на том же уровне выполнения, что и его вызывающая программа. И, разумеется, программа должна знать лучше, чем пользователь, это заставило Windows игнорировать мои собственные настройки уровня выполнения.
А теперь к решению. Поскольку Windows не позволяла мне переопределять то, что программа сказала, что она хотела, мне нужно было переопределить то, что программа сказала, что она хотела.
Для этого я использовал Manifest Tool, который поставляется с Windows SDK (и, следовательно, с Visual Studio):
mt -inputresource:"VSLauncher.exe" -out:VSLauncher.exe.manifest
Эта команда извлекла манифест из VSLauncher.exe в файл с именем VSLauncher.exe.manifest. Затем я отредактировал манифест для запроса желаемого уровня выполнения:
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false">
</requestedExecutionLevel>
</requestedPrivileges>
Затем я мог бы написать обратно манифест:
mt -outputresource:VSLauncher.exe -manifest VSLauncher.exe.manifest
С желаемым результатом.
Одно предупреждение: пожалуйста, сделайте резервную копию VSLauncher.exe, прежде чем манипулировать манифестом.
И выступать на свой страх и риск.