调试时暂时更改manifest requestedExecutionLevel

时间:2013-08-07 18:43:38

标签: .net visual-studio-2010 debugging permissions manifest

我正在Visual Studio中开发一个应用程序,它在用户系统上安装后需要管理员权限。我添加了一个适当的应用程序清单文件,以确保发生这种情况:

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

但是现在如果我想在Visual Studio中调试程序,我需要以管理员身份运行Visual Studio。没有bueno。最令人讨厌的部分是程序在调试期间并不真正需要管理员权限。只有在用户系统上正确安装后才需要这些权限。

是否有一种干净,简单的方法来“抛出一个开关”,在开发过程中禁用管理员要求,然后在我发布应用程序时重新启用它?

编辑:

当我向用户发布应用程序时,我运行了一个使用MSBuild的构建脚本。我要做的是让Visual Studio在Release配置中构建一个解决方案,而不用管理员清单。然后,当我运行构建脚本时,我想让MSBuild包含管理员清单,同时保持相同的版本配置。

2 个答案:

答案 0 :(得分:3)

您可以使用预构建事件Project -> Options -> Build Events

执行此操作

制作预制品事件,例如:

del "$(ProjectDir)app.manifest"

if "$(ConfigurationName)"=="Debug" (
  copy "$(ProjectDir)app.debug.manifest" "$(ProjectDir)app.manifest"
) else (
  copy "$(ProjectDir)app.release.manifest" "$(ProjectDir)app.manifest"
)

这里我们假设您的清单名为app.manifest并且位于项目的根目录中 - 显然可以根据需要进行修改。

在任何情况下,制作清单文件的两个副本并调用一个app.debug.manifest和一个app.release.manifest,对其进行适当配置,这将使用适当的版本替换活动的app.manifest每个版本。

编辑:

如果您希望MSBuild使用相同的配置但使用与Visual Studio不同的清单,您也可以尝试将上述预构建事件调整为:

del "$(ProjectDir)app.manifest"

if "$(AdminManifest)"=="true" (
  copy "$(ProjectDir)app.release.manifest" "$(ProjectDir)app.manifest"
) else (
  copy "$(ProjectDir)app.debug.manifest" "$(ProjectDir)app.manifest"
)

现在,当您运行MSBuild时,您可以这样做:

MSBuild.exe MySolution.sln /p:Configuration=WhateverYouWant /p:AdminManifest=true

另见:

https://stackoverflow.com/a/938888/327083

https://stackoverflow.com/a/1732478/327083

答案 1 :(得分:0)

这是几年后我最终这样做的方式(可能对csproj文件和MSBuild进行了许多更改):

<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
  <ApplicationManifest>app.debug.manifest</ApplicationManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
  <ApplicationManifest>app.manifest</ApplicationManifest>
</PropertyGroup>