【发布时间】:2015-06-22 21:32:40
【问题描述】:
我使用 Inno Setup 来生成 App 安装程序。它成功安装了该应用程序,但我只能以管理员身份运行它。由于我不希望用户右键单击 exe 文件并选择“以管理员身份运行”,我想知道是否有任何简单的方法可以向应用程序本身授予管理员权限,或者反过来,通过代码授予这些权限。 谢谢。
【问题讨论】:
标签: windows permissions
我使用 Inno Setup 来生成 App 安装程序。它成功安装了该应用程序,但我只能以管理员身份运行它。由于我不希望用户右键单击 exe 文件并选择“以管理员身份运行”,我想知道是否有任何简单的方法可以向应用程序本身授予管理员权限,或者反过来,通过代码授予这些权限。 谢谢。
【问题讨论】:
标签: windows permissions
我想知道是否有任何简单的方法可以为应用本身授予管理员权限
您需要为您的应用提供 UAC 清单,并将其 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 的默认清单,它仅启用 ComCtl v6 视觉样式(这就是您需要在自定义清单中手动启用样式的原因)。
现在将编译后的.res 文件添加到您的项目中,然后构建。
或者反过来,通过代码授予这些权限。
不直接,不。 UAC 提升仅在进程启动时发生。一旦进程开始运行,就不能动态提升它。但是,您可以做的是:
使用 "runas" 动词调用 ShellExecute/Ex() 以启动您的应用程序的另一个副本,并使用额外的命令行参数(或单独的 .exe)根据需要运行您的管理逻辑。 "runas" 将提升该进程,即使它没有 UAC 清单。如果您的主应用程序需要等待管理进程完成,它可以指定SEE_MASK_NOCLOSEPROCESS 标志为ShellExecuteEx(),然后使用WaitForSingleObject() 或相关函数等待返回的HANDLE,当启动的进程退出。
将您的管理逻辑移动到一个 COM 对象中,您的主 .exe 可以在需要时使用 COM Elevation Moniker 在提升的状态下实例化该对象。
这样,您的主要 .exe 不需要使用 requireAdministrator 清单,除非您真的需要整个应用程序以管理员权限运行,否则您应该始终努力避免这种情况。
【讨论】: