【问题标题】:How to change executable file rights using Inno Setup?如何使用 Inno Setup 更改可执行文件权限?
【发布时间】:2012-08-02 08:43:52
【问题描述】:

我通过 InnoIDE 中的向导创建了一个非常简单的 inno 脚本。但是,部署的可执行文件可以由普通用户运行。如何强制用户必须通过脚本以管理员身份运行它?

[Setup]
AppId={{03E6645E-2C53-4E90-967B-D0833A8EBDAF}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
PrivilegesRequired=admin

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "                {cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "C:\Program Files\Inno Setup 5\Examples\MyProg.exe"; DestDir: {app}; Flags: ignoreversion; Permissions: admins-readexec; 
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

[Run]
Filename: {app}\{#MyAppExeName}; Description: "{cm:LaunchProgram,    {#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent; 

【问题讨论】:

  • How can I enforce that the user has to run it as administrator through the script -- 我认为这就是“PrivilegesRequired=admin”的作用。
  • @Jimmy,确实如此,但用于设置。 OP 想要为其创建设置的应用程序。

标签: inno-setup


【解决方案1】:

您不能使用 Inno 更改应用程序的权限或清单。

要让您的应用程序请求管理员权限,您需要向其添加适当的清单。这对于每种不同的编程语言都是不同的,但many related questions 已经被询问和回答了。

【讨论】:

  • 等等,我认为清单是通用的 XML file,而不是它依赖于编程语言。如果这是正确的,并且您找到了一些可以修改此 XML file 的工具(例如可能是 this tool),那么您可以在部署的应用程序实际打包到设置中之前从脚本中运行该工具(我♥预处理器:-)
  • @user1412803,好吧,看来你接受了不可能的事实。没关系。
  • @TLama 清单是,您添加它的方式会因语言/编译器而异。 VB6 要求您在编译之前将其添加到 res 文件中。 .NET 应用程序(在 VS2005 中)需要一个调用 mt.exe 的后编译步骤。 VS2008+ 有一个包含清单 (iirc) 的项目选项。等
  • @TLama 哦,虽然技术上仍然可以在设置编译/预处理器阶段添加,但如何仅测试可执行文件?如果您构建设置两次怎么办?它应该是可执行文件的属性,与设置无关。至于你对预处理器的使用,“当你有一把锤子时,一切都开始像钉子了”:p
  • 关于我在开玩笑的预处理器主题(但实际上,对于我认为需要的东西 ;-) 感谢您的清单解释!是的,我在应用程序测试中忘记了什么,但是你需要做的同样的事情,例如使用应用程序签名工具 ;-) +1
【解决方案2】:

更简单的方法让您的应用程序请求管理员权限:

将此值添加到可执行文件的注册表项中:

[Registry]
Root: "HKLM"; Subkey: "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"; ValueType: string; ValueName: "{app}\{#MyAppExeName}"; ValueData: "RUNASADMIN"; Flags: uninsdeletevalue

我更喜欢通常使用上面的代码。

【讨论】:

  • 我看不出这比添加清单更容易。为什么要从头开始设置他们的程序以兼容模式运行?避免这样做。添加清单是正确的方法。
  • 这更容易,因为那个可执行文件不是我的(我不是那个程序员)而且我不知道它是如何编码的,添加清单文件可能会在未来引起任何问题,我只是重新打包以便更好地安装。
  • 是的,如果 MS 决定将这些注册表项移动到其他地方,肯定会节省您未来的计划。这并不容易。时期。如果应用程序。是你的(假设这个问题),添加一个清单(如果你的应用程序真的需要它)。许多 IDE 对此提供了丰富的支持。如果您正在窃取某人的应用程序。重新打包,使用外部清单(如果你真的需要它)。
猜你喜欢
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
相关资源
最近更新 更多