18

我需要创建一个应用程序,该应用程序需要在“C:\Program Files”、“Users[username]”和 Sys32 中创建文件/文件夹。此外,应用程序需要创建一些注册表项。

此应用程序需要在 Vista 及更高版本上运行。此外,在 Windows Server 2003 及更高版本上。

上述操作系统具有用户帐户控制(UAC)的概念,在哪里访问程序文件和写入注册表需要管理员权限。

我查看了很多论坛,发现使用 Microsoft SDK 我们可以检查当前用户是否具有管理员权限。但是对于 Vista 和更高版本的操作系统,“CheckTokenMembership”功能失败。

我还找到了一个解决方案,可以使用清单文件提前告诉操作系统当前应用程序需要管理员权限。这是使用“requestedExecutionLevel”标签完成的。

我正在使用 Visual Studio 2005 创建应用程序。当我们在 Visual Studio 中创建应用程序时,会创建一个默认清单文件。我可以更改此清单文件以包含“requestedExecutionLevel”标签,以便我的应用程序始终以管理员权限运行吗?

是否有任何其他方法可以让我的应用程序以管理员权限运行而不要求用户(管理员或标准)以“以管理员身份运行”运行我的应用程序?

谢谢!

4

2 回答 2

39

您应该在项目属性 Linker -> Manifest File -> UAC Execution Level 中找到一个选项。将此设置为requireAdminstrator

这将导致默认生成的清单包含requestedExecutionlevel您需要的内容,这样如果您的用户尚未提升权限,则会自动提示他们提升他们的权限。

Visual Studio UAC 选项的屏幕截图

于 2014-08-11T18:01:35.227 回答
0

致谢和介绍

这个问题帮助了我,我会用我获得的知识来帮助我。谢谢:

  1. Lipika(提出问题的人)揭示了管理员访问权限是将系统目录的访问权限重定向到虚拟目录的原因。后来很清楚,缺乏管理员访问权限会导致写入某些注册表项失败。

  2. 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 所做的非常相似。

于 2021-09-05T02:34:07.553 回答