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

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

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

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

【问题讨论】:

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

标签: c# windows windows-7 windows-vista


【解决方案1】:

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

  1. 创建一个包含以下内容的文件(为方便起见,您可以将文件作为开发资源添加到 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>
    
  2. 编辑项目对话框的构建面板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】:

    【讨论】:

      猜你喜欢
      • 2014-02-08
      • 1970-01-01
      • 2021-07-27
      • 2018-05-01
      • 1970-01-01
      • 2021-07-17
      • 2016-09-29
      • 2011-06-06
      • 2020-07-13
      相关资源
      最近更新 更多