我使用 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 提升只发生在进程启动时。一旦进程开始运行,就不能动态提升它。但是,您可以做的是:
使用
"runas"
动词调用ShellExecute/Ex()
以使用额外的命令行参数(或单独的.exe
) 以根据需要运行您的管理逻辑。“runas”
将提升该进程,即使它没有 UAC list 。如果您的主应用需要等待管理进程完成,它可以将SEE_MASK_NOCLOSEPROCESS
标志指定给ShellExecuteEx()
然后使用WaitForSingleObject()
或相关函数等待返回的HANDLE
,这将在启动的进程退出时发出信号。将您的管理逻辑移动到一个 COM 对象中,您的主 .exe 可以使用 COM Elevation Moniker 在提升的状态下实例化该对象需要时。
这样,您的主 .exe
就不需要使用 requireAdministrator
list ,除非您真的需要整个应用程序才能运行,否则您应该始终努力避免这种情况管理员权限。
关于windows - 授予应用程序管理员权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30990188/