我使用Inno Setup生成App安装程序。它成功安装了应用程序,但我只能以管理员身份运行它。由于我不希望用户右键单击exe文件并选择“以管理员身份运行”,我想知道是否有任何简单的方法可以向应用程序本身授予管理员权限,或者通过代码授予这些权限。 感谢。
答案 0 :(得分:3)
我想知道是否有任何简单的方法可以为应用程序本身授予管理员权限
您需要为应用提供一个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"
使用命令行.rc
实用程序将.res
文件编译为brcc32.exe
文件。
brcc32 myapp.rc
在您的项目中,转到项目&gt;选项&gt;应用程序并取消选中&#34;启用运行时主题&#34;复选框。这会禁用Delphi的默认清单,它只启用ComCtl v6 Visual Styles(这就是您需要在自定义清单中手动启用样式的原因)。
现在将已编译的.res
文件添加到您的项目中,然后构建。
或对话,通过代码授予这些权限。
不直接,不。 UAC提升仅在进程启动时发生。进程开始运行后,无法动态提升。但是,你能做的是:
使用ShellExecute/Ex()
动词调用"runas"
以使用额外的命令行参数(或单独的.exe
)启动应用的另一个副本,以运行您的管理逻辑需要。 "runas"
将提升该过程,即使它没有UAC清单。如果您的主应用程序需要等待管理进程完成,它可以将SEE_MASK_NOCLOSEPROCESS
标志指定为ShellExecuteEx()
,然后使用WaitForSingleObject()
或相关函数等待返回的HANDLE
},将在启动的进程退出时发出信号。
将您的管理逻辑移动到一个COM对象,主要.exe可以在需要时使用COM Elevation Moniker在升级状态下实例化。
这样,您的主.exe
不需要使用requireAdministrator
清单,除非您真的需要整个应用以管理员权限运行,否则您应该始终努力避免。