程序启动时如何请求管理员权限?

Posted

技术标签:

【中文标题】程序启动时如何请求管理员权限?【英文标题】:How to request administrator permissions when the program starts? 【发布时间】:2011-12-01 18:11:29 【问题描述】:

我需要我的软件能够在 Windows Vista 上以管理员身份运行(如果有人在没有管理权限的情况下运行它,它会崩溃)。

在启动其他软件时,我看到系统提示“此软件将以管理员身份运行。您要继续吗?”当应用试图获取管理权限时。

在 Windows Vista 上运行 c# 应用时如何请求管理权限?

【问题讨论】:

请不要忘记这样做只会隐藏根本问题,并不能解决问题。即使您的程序确实需要管理员权限,如果没有获得这些权限,它也不应该崩溃。最可能的原因是您未能在系统调用之后检查错误情况。 【参考方案1】:

对于.Net (Visual Studio 2013),包括请求管理员提升的清单文件并使用编译器的/win32manifest 标志,编写并提供请求此提升的清单文件。但是,以下描述了在 Visual Studio 中为项目名称 App.Exe 执行此操作:

    创建一个包含以下内容的文件(为方便起见,您可以将文件作为开发资源添加到 Visual Studio 项目中,方法是确保它的 Build ActionNoneCopy to Output...Do not copy。按照约定清单文件以其输出目标命名,在本例中为 App.Exe.manifest。如果您需要 uiAccess(用户界面),则程序集必须是强命名的。

    <?xml version="1.0" encoding="utf-8" ?>
    <asmv1:assembly manifestVersion="1.0" 
        xmlns="urn:schemas-microsoft-com:asm.v1"
        xmlns:asmv1="urn:schemas-microsoft-com:asm.v1"
        xmlns:asmv2="urn:schemas-microsoft-com:asm.v2"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <assemblyIdentity version="1.0.0.0" name="App" />
      <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
          <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
            <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
          </requestedPrivileges>
        </security>
      </trustInfo>
    </asmv1:assembly>
    

    编辑项目对话框的构建面板Other flags: 输入字段以添加win32manifest 标志并让Visual Studio 相应地调用编译器。例如,在这种情况下,

    /win32manifest:App.Exe.manifest.

注意以下条目:

  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>

【讨论】:

OP 要求使用 C#。【参考方案2】:

将以下内容添加到您的清单文件中:

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

您也可以使用highestAvailable 作为关卡。

看看这里关于嵌入清单文件:

http://msdn.microsoft.com/en-us/library/bb756929.aspx

PS:如果你没有清单文件,你可以很容易地添加一个新的:

在 Visual Studio 中,右键单击项目 -> 添加项目 -> 选择 应用程序清单文件(在 Visual C# 项目的 General 下)

添加的文件已经有了上面的部分,只需将级别从asInvoker改为requireAdministrator

【讨论】:

值得一提的是,如果您以这种方式在 VS 中添加应用程序清单文件,您将获得一个带有许多其他选项的模板(例如,说您的应用程序仅适用于 Windows 10 及更高版本。)经过测试在 VS2017 上。 @PerLundberg - 不值得一提,因为最初的 Ask-er 没有问这个问题——他问的是管理员权限 @Momoro 关于 SO 的问题不仅是针对 OP 的,也是为了社区的更大利益。其他人在寻找其他解决方案时可能会发现这个问题,而不仅仅是 完全 OP 询问的内容。一般来说,教人们“你可以用应用程序清单做这些事情”并没有什么坏处。 我并没有暗示任何粗鲁(对不起,如果我遇到这种情况)我只是在阅读旧的答案/问题,并且有点困惑:D【参考方案3】:

将此 XML 放入名为 yourexename.exe.manifest 的文件中:

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
   <security>
     <requestedPrivileges>
        <requestedExecutionLevel level="highestAvailable" />
     </requestedPrivileges>
   </security>
</trustInfo>
</assembly>

【讨论】:

【参考方案4】:

您需要在清单中使用requestedExecutionLevel 令牌:

http://www.developerfusion.com/code/7987/making-a-net-app-run-on-vista-with-administrator-priviledges/

【讨论】:

以上是关于程序启动时如何请求管理员权限?的主要内容,如果未能解决你的问题,请参考以下文章

在运行时请求管理员权限

如何让程序开机自动启动,并以管理员权限运行

VC如何将自身进程提升至管理员权限

仅在需要时使 Inno Setup 安装程序请求权限提升

如何从具有管理员权限的进程中启动没有管理员权限的新进程?

如何以管理员权限启动应用程序