程序启动时如何请求管理员权限?
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 Action
是 None
和 Copy 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/
【讨论】:
以上是关于程序启动时如何请求管理员权限?的主要内容,如果未能解决你的问题,请参考以下文章