4

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

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

但是现在如果我想在 Visual Studio 中调试程序,我需要以管理员身份运行 Visual Studio。没有布埃诺。最烦人的部分是程序在调试过程中并不需要管理员权限。它仅在正确安装在用户系统上后才需要这些权限。

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

编辑:

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

4

2 回答 2

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

于 2013-08-07T19:15:41.513 回答
3

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

<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
  <ApplicationManifest>app.debug.manifest</ApplicationManifest>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
  <ApplicationManifest>app.manifest</ApplicationManifest>
</PropertyGroup>
于 2019-08-20T09:05:39.390 回答