如何在 Visual Studio 2005 中使用 Manifest 文件以管理员权限运行应用程序?
Posted
技术标签:
【中文标题】如何在 Visual Studio 2005 中使用 Manifest 文件以管理员权限运行应用程序?【英文标题】:How to run application with Admin privileges using Manifest file in Visual Studio 2005? 【发布时间】:2013-04-04 18:42:28 【问题描述】:我需要创建一个应用程序,该应用程序需要在 "C:\Program Files","Users[username]" 和 Sys32 中创建文件/文件夹。应用程序还需要创建一些注册表项。
此应用程序需要在 Vista 及更高版本上运行。此外,在 Windows Server 2003 及更高版本上。
上述操作系统有用户账户控制(UAC)的概念,在哪里访问程序文件和写入注册表需要管理员权限。
我查看了很多论坛,发现使用Microsoft SDK我们可以检查当前用户是否具有管理员权限。但是对于 Vista 及更高版本的操作系统,“CheckTokenMembership”功能失败。
我还找到了一个解决方案,可以使用清单文件提前告诉操作系统当前应用程序需要管理员权限。这是使用“requestedExecutionLevel”标签完成的。
我正在使用 Visual Studio 2005 创建应用程序。当我们在 Visual Studio 中创建应用程序时,会创建一个默认清单文件。我可以更改此清单文件以包含“requestedExecutionLevel”标签,以便我的应用程序始终以管理员权限运行吗?
是否有任何其他方法可以让我的应用程序以管理员权限运行而不要求用户(管理员或标准)以“以管理员身份运行”运行我的应用程序??
谢谢!
【问题讨论】:
这可能对你有帮助 ***.com/questions/8139480/… 和这个 msdn.microsoft.com/en-us/library/bb756929.aspx 不确定您的问题是什么。但是您需要在 UAC 下将您的令牌提升为管理员。如果您花时间通读 Microsoft SDK 和示例代码,您将有一个很好的示例来说明如何做到这一点。 【参考方案1】:您应该在项目属性链接器 -> 清单文件 -> UAC 执行级别中找到一个选项。将此设置为requireAdminstrator
。
这将导致默认生成的清单包含您需要的requestedExecutionlevel
,这样如果您的用户尚未提升权限,则会自动提示他们提升他们的权限。
【讨论】:
【参考方案2】:致谢和介绍
这个问题对我有帮助,我会用我获得的知识提供帮助。感谢:
Lipika(提出问题的人)透露管理员访问权限是将系统目录的访问权限重定向到虚拟目录的原因。后来很清楚,缺少管理员访问权限会导致写入某些注册表项失败。
snowcrash09 用于显示用于启用需要管理员访问权限的 Visual Studio 选项。随着对 MSDN 的进一步研究,我发现清单没有嵌入到 Properties>Manifest Tool 下的可执行文件中;从而让我阅读它。
Nayana 与多项式答案的链接也很好。这里我将在我的演示中借用他的部分答案。
回答
正如 Lipika 所说,您需要管理员权限,否则 Windows Vista 及更高版本会将您重定向到虚拟目录。这是伟大的。从逻辑上讲,您的应用程序应该请求管理员访问权限。您可以让用户手动执行此操作。如果没有,Windows 提供了许多以编程方式执行此操作的方法。最简单的方法是在应用的清单中声明它。在这里,我将专门为不使用 Visual Studio 的个人提供说明。如果您使用的是 Visual Studio,它就像 Properties>Linker>Manifest File>UAC Execution Level 一样简单。
例如,如果您使用的是 CodeBlocks;创建一个名为 app_resources.rc 的文件。对于 CodeBlocks,它非常重要的是该文件具有 .rc
扩展名,因此 CodeBlocks 知道使用 Windows 资源工具编译它。将以下代码复制到此文件中,并将其添加到您的项目中。
#include <windows.h>
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "adminAccess.manifest"
创建一个名为 adminAccess.manifest 的清单文件。将以下代码复制到文件中。不需要将此文件添加到您的项目中,因为它是从您的 rc 文件中引用的。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="MyApplication"
type="win32"/>
<description>Description of your application</description>
<!-- Identify the application security requirements. -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
现在您可以编译您的应用程序,它会在运行时自动提示输入管理员凭据。如果未授予管理员访问权限,它将返回失败。在 Windows Xp 上,不会提示您进行任何身份验证。
请注意,您可以在此处编辑清单以添加功能,例如 Windows 小部件的视觉样式和 DPI 感知。
如果您不使用 CodeBlocks。例如,您正在从命令行编译。您几乎必须使用 Windows 资源工具编译 rc 文件。在 MinGw 构建工具中,这称为 windres.exe。它将编译一个.res
文件。然后,您将此生成的文件与您将在链接器阶段链接的所有其他文件链接。
请注意,rc 文件是一个 windows 资源文件,它包含您的应用程序使用的所有资源,例如 BITMAP、ICON、STRING、对话框模板。这将全部存储在最终的可执行文件中。然后,您可以使用 Windows 特定功能从可执行文件中加载。这与 android 所做的非常相似。
【讨论】:
以上是关于如何在 Visual Studio 2005 中使用 Manifest 文件以管理员权限运行应用程序?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Visual Studio 2008 中打开使用 Visual Studio 2005 创建的 rdl?