2012-08-02 146 views
2

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

[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; 
+0

'我如何强制用户必须通过脚本以管理员身份运行它 - 我认为这就是“PrivilegesRequired = admin”所做的。 – JimmyPena 2012-08-08 19:14:15

+0

@Jimmy,确实如此,但对于设置。 OP希望为其创建安装程序的应用程序。 – TLama 2012-08-10 15:48:48

+1

@TLama明白了,谢谢。 – JimmyPena 2012-08-10 17:03:28

回答

3

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

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

+0

等等,我认为清单是通用的XML *文件*,并不是说它依赖于编程语言。如果这是正确的,你会发现一些工具可以修改这个XML *文件*(例如可能是['这个工具'](http://msdn.microsoft.com/en-us/library/acz3y3te(v = vs。 110).aspx)),那么您可以在部署的应用程序实际打包到设置中之前从脚本运行该工具(I♥预处理器:-) – TLama 2012-08-02 09:58:11

+0

@ user1412803,好吧,看起来您认为这是不可能的。没关系。 – TLama 2012-08-02 11:18:19

+0

@TLama清单是,如何添加它不同基于语言/编译器虽然。 VB6要求您在编译之前将其添加到res文件中。 .NET应用程序(在VS2005中)需要一个调用mt.exe的后编译步骤。 VS2008 +有一个项目选项来包含一个清单(iirc)。 – Deanna 2012-08-02 14:11:47

0

简单的办法来使您的应用程序要求管理员权限:

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

[Registry] 
Root: "HKLM"; Subkey: "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"; ValueType: string; ValueName: "{app}\{#MyAppExeName}"; ValueData: "RUNASADMIN"; Flags: uninsdeletevalue 
我通常喜欢使用上面的代码

+0

我无法看到比添加清单更容易的事情。为什么在这个世界上,人们喜欢将他们的程序设置为以兼容模式*从头开始运行*?避免这样做。添加清单是正确的方法。 – TLama 2015-08-31 07:23:09

+0

它更容易,因为该可执行文件不是我的(我不是程序员),我没有智能如何编码和添加清单文件将来可能会导致任何问题,我只是重新包装它,以便更好的安装。 – user3733975 2015-08-31 07:44:51

+0

是的,如果MS决定将这些注册表项移到其他地方,肯定会为您保存未来的计划。这并不容易。期。如果应用程序。是你的(这是为这个问题假设),添加一个清单(如果你的应用程序真的需要它)。许多IDE对此有着丰富的支持。如果你在偷别人的应用程序。重新包装,使用外部清单(如果你真的需要它)。 – TLama 2015-08-31 08:01:30