我想将我的应用程序存储在当前用户的AppData
目录中,以避免在自动更新我们的应用程序时(存储在程序文件中)我们拥有的权限问题。我们不会为用户提供将应用程序安装在何处的选项。非管理员用户曾提示说,安装程序将应用程序存储在管理员的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
)。 最佳答案
从您的问题的措辞以及如果我对您的理解正确,这听起来像是因为您“正在使用管理员帐户验证安装是否可以运行”。如果是这种情况,并且您要在UAC提示符下输入其他帐户(与您登录时使用的帐户不同),则当前用户实际上将成为您刚刚在UAC提示符下输入的Administrator帐户,而不是您登录的帐户。在。因此,只要系统要求您使用UAC提升安装,它就不会最终出现在登录用户的AppData目录中。
您可能需要做的是使用runasoriginaluser
函数,该函数将使用登录的用户凭据而不是您在UAC提示符下输入的帐户,或者查找导致UAC海拔提示的原因。
另请参见Inno Setup Creating registry key for logged in user (not admin user)。
Installation Context上的MSDN文档也可能有用。
关于windows - Inno Setup始终安装在管理员的AppData目录中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29376898/