Inno Setup始终安装在admin的AppData目录中

时间:2015-03-31 19:27:54

标签: windows installer inno-setup executable

我想将我的应用程序存储在当前用户的AppData目录中,以避免在自动更新我们的应用程序时(当它存储在Program Files中时)的权限问题。我们不会向用户提供安装应用程序的位置选项。我们收到非管理员用户的抱怨,安装程序将应用程序存储在管理员的AppData目录中(当然是在UAC之后),而不是当前用户的AppData目录,这会阻止应用程序在未来奔跑。

首先,我有DefaultDirName={userappdata}\{#MyAppName}。然后我尝试了DefaultDirName={commonappdata}\{#MyAppName}。然后我与PrivilegesRequired=lowest一起尝试了这一点,甚至与Make InnoSetup installer request privileges elevation only when needed提出的问题一样PrivilegesRequired=none

这是我现在的脚本,以防我遗漏了一些明显的东西:

; Script generated by the Inno Setup Script Wizard.
;SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Teamwork Chat"
#define MyAppVersion "0.10.0"
#define MyAppPublisher "Digital Crew, Ltd."
#define MyAppURL "http://www.teamwork.com/"
#define MyAppExeName "TeamworkChat.exe"

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{0F063485-F5AF-4ADE-A9F9-661AB3BAA661}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={userappdata}\{#MyAppName}
DisableDirPage=yes
DefaultGroupName={#MyAppName}
OutputDir=E:\chat-client\dist
OutputBaseFilename={#MyAppName}_for_Windows32_Installer-{#MyAppVersion}
SetupIconFile=E:\chat-client\icons\teamwork_chat.ico
WizardImageFile=E:\chat-client\icons\chatWizardImageFile.bmp
Compression=lzma
SolidCompression=yes
PrivilegesRequired=none

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

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

[Files]
Source: "E:\chat-client\dist\TeamworkChat\win32\TeamworkChat.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "E:\chat-client\dist\TeamworkChat\win32\ffmpegsumo.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "E:\chat-client\dist\TeamworkChat\win32\icudtl.dat"; DestDir: "{app}"; Flags: ignoreversion
Source: "E:\chat-client\dist\TeamworkChat\win32\libEGL.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "E:\chat-client\dist\TeamworkChat\win32\libGLESv2.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "E:\chat-client\dist\TeamworkChat\win32\nw.pak"; DestDir: "{app}"; Flags: ignoreversion
; 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

修改

我已经改变了两个选项,但仍然没有运气;

PrivilegesRequired=lowest
...
[Icons]
...
Name: "{userdesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

编辑2:

我添加了runasoriginaluser标记并生成了新的AppId(GUID),但仍然没有运气;

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

编辑3:

我使用源文件和Inno脚本创建了一个简单的GitHub repository

编辑4:

我一直在Windows 8.1上测试。它似乎在Windows 7上编译时运行,并在Windows 8上运行,但在8上编译并在8上运行时则不行。

编辑5:

现在已经解决了,但要清除 Edit 4 的内容,它只能在我的机器上运行。它适用于其他Windows 8机器。一定是一些奇怪的缓存或其他东西(即使我更改了AppId)。

2 个答案:

答案 0 :(得分:3)

根据您的问题的措辞,如果我正确理解您,听起来这是因为您“通过管理员帐户验证要运行的安装”。如果是这种情况,并且您在UAC提示符下输入了另一个帐户(来自您登录的帐户),则当前用户实际上将成为您刚刚在UAC提示下输入的管理员帐户,而不是您记录的帐户在...因此,只要您被要求使用UAC提升安装,它就不会在登录用户的AppData目录中结束。

您可能需要做的是使用runasoriginaluser函数,该函数将使用登录的用户凭据而不是您在UAC提示符下输入的帐户,或查找导致UAC提升提示的原因。

另见Inno Setup Creating registry key for logged in user (not admin user)

Installation Context上的MSDN文档也可能有用。

答案 1 :(得分:2)

它应该与PrivilegesRequired=lowest一起使用。这是正确的方法。如果没有,我们希望看到一个日志文件。

$(function() { $('form > input').keyup(function() { var checkEmpty = false; $('form > input').each(function() { if ($(this).val() == '') { checkEmpty = true; } }); if (checkEmpty ) { $('#addRow').attr('disabled', 'disabled'); } else { $('#addRow').removeAttr('disabled'); } }); 将使安装程序在当前非特权用户的上下文中运行。因此,所有constants,如lowest{userappdata}等,都会引用当前用户。

无论如何,要回答您的问题,您可以使用以下代码。

但这仅适用于特殊情况,当安装程序确实需要管理员权限(例如注册某些系统DLL)时,仍然需要为原始用户部署文件。就像这里:Inno Setup - Register components as an administrator

{userdesktop}

更多类似的问题: