windows - 授予应用程序管理员权限

标签 windows permissions

我使用 Inno Setup 生成 App 安装程序。它成功安装了该应用程序,但我只能以管理员身份运行它。由于我不希望用户右键单击 exe 文件并选择“以管理员身份运行”,我想知道是否有任何简单的方法可以向应用程序本身授予管理员权限,或者相反,通过代码授予这些权限。 谢谢。

最佳答案

I wonder if there is any simple way to grant admin privileges to the app itself

您需要为您的应用提供一个 UAC list ,其 requestedExecutionLevel 值设置为 requireAdministrator

创建一个文件扩展名为 .manifest 的文本文件,并将以下 XML 放入其中:

<?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="*" name="MyAppAssemblyNameHere" type="win32"/>
  <description>My App Description</description>
  <!-- uncomment this to enable ComCtl v6 Visual Styles...
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*"/>
    </dependentAssembly>
  </dependency>
  -->
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

创建一个文件扩展名为 .rc 的文本文件,并让它引用 .manifest 文件:

1 24 "myapp.manifest"

使用命令行brcc32.exe 实用程序将.rc 文件编译成.res 文件。

brcc32 myapp.rc

在您的项目中,转到项目 > 选项 > 应用程序 并取消选中“启用运行时主题”复选框。这将禁用 Delphi 的默认 list ,该 list 仅启用 ComCtl v6 视觉样式(这就是您需要在自定义 list 中手动启用样式的原因)。

现在将编译后的 .res 文件添加到您的项目中,然后构建。

or conversly, grant those privileges by code.

不直接,不。 UAC 提升只发生在进程启动时。一旦进程开始运行,就不能动态提升它。但是,您可以做的是:

  1. 使用 "runas" 动词调用 ShellExecute/Ex() 以使用额外的命令行参数(或单独的.exe) 以根据需要运行您的管理逻辑。 “runas” 将提升该进程,即使它没有 UAC list 。如果您的主应用需要等待管理进程完成,它可以将 SEE_MASK_NOCLOSEPROCESS 标志指定给 ShellExecuteEx() 然后使用 WaitForSingleObject() 或相关函数等待返回的 HANDLE,这将在启动的进程退出时发出信号。

  2. 将您的管理逻辑移动到一个 COM 对象中,您的主 .exe 可以使用 COM Elevation Moniker 在提升的状态下实例化该对象需要时。

这样,您的主 .exe 就不需要使用 requireAdministrator list ,除非您真的需要整个应用程序才能运行,否则您应该始终努力避免这种情况管理员权限。

关于windows - 授予应用程序管理员权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30990188/

相关文章:

c# - 所有 UWP 样本在启动画面卡住

windows - 无法从 Windows 中的 makefile 运行 'start' 命令

ios - 是否需要联系人权限 key 来防止 EKEventEditViewController 崩溃?

php - 解析错误,期望 activecollab 模型类中出现 `T_PAAMAYIM_NEKUDOTAYIM' 错误

java - 如何用Android代码制作系统应用程序

linux - 有权读写和删除文件夹中的文件,但不能读写和删除文件夹本身

windows - WinInet::InternetSetOption(...) 始终返回 0,GetLastError() 返回 12018

windows - 如何以编程方式将图像从 Air 应用程序直接导出到 powerpoint 幻灯片

windows - 复制文件名并用它创建新的空白文件

linux - 使用Cloudera服务重新启动hadoop CDH4的tasktracker和job tracker