Inno Setup的总是安装到管理的AppData目录Inno Setup的总是安装到管理的App

2019-05-12 08:25发布

我想我的存储在当前用户的应用程序AppData目录,以避免当自动更新我们的应用程序(当它存储在Program Files文件)我们有权限问题。 我们不提供用户在哪里安装应用程序的选项。 我们已经从非管理员用户投诉,安装程序存储在管理的应用程序AppData目录(当然UAC后),而不是当前用户的AppData的目录,然后阻止应用程序在未来的运行。

首先,我不得不DefaultDirName={userappdata}\{#MyAppName} 然后我试图DefaultDirName={commonappdata}\{#MyAppName} 然后我想,随着PrivilegesRequired=lowest甚至为PrivilegesRequired=none作为只在需要时制作InnoSetup安装程序请求的权限提升问题提出。

这是我的脚本截至目前的情况下,我失去了一些东西很明显的:

; 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:

我创建了一个简单的GitHub库与源文件和创新科技的脚本。

编辑4:

我一直在测试在Windows 8.1。 这似乎在8编译并在8时运行在Windows 7上编译的时候,而在Windows 8上阵,但没有工作。

编辑5:

它解决了,但现在要明确的事情了关于编辑4,它不是我的机器上唯一的工作。 它的工作在其他Windows 8机器。 一定是一些奇怪的缓存或东西(即使我改变了AppId )。

Answer 1:

从你的问题的措辞,如果我理解正确你,听起来这是因为你“用管理员帐户的安装运行验证。” 如果是这样的话,你是在UAC提示输入不同的帐户(从你与登录),当前用户,然后居然变成了管理员帐户您只需在UAC提示输入的,而不是你登录的帐户用。 因此,只要你被要求提高使用UAC的安装,它不会在登录用户的AppData目录中结束。

你可能需要做的是使用runasoriginaluser功能,将使用登录用户的凭据,而不是你在UAC提示输入的帐户,或者发现是什么原因造成的UAC提升提示。

又见Inno Setup的创建为登录用户的注册表项(非管理员用户) 。

在MSDN文档安装语境也可能是有用的。



Answer 2:

它应与工作PrivilegesRequired=lowest 。 而且它是正确的做法。 如果没有,我们希望看到一个日志文件。

lowest将使当前非特权用户的上下文中运行安装程序。 因此,所有的常数 ,象{userappdata} {userdesktop}等,将参考当前用户。


总之,要回答你的问题,你可以使用下面的代码。

但是,这只是特殊情况下,当安装真正需要管理员权限(例如注册一些系统DLL),但仍需要为原来的用户配置文件。 喜欢这里: Inno Setup的-注册组件管理员 。

[Files]
Source: "MyProg.exe"; DestDir: "{code:GetAppData}"

[Code]

var
  AppDataPath: string;

function GetAppData(Param: string): string;
begin
  Result := AppDataPath;
end;  

function InitializeSetup(): Boolean;
var
  Uniq: string;
  TempFileName: string;
  Cmd: string;
  Params: string;
  ResultCode: Integer;
  Buf: AnsiString;
begin
  AppDataPath := ExpandConstant('{userappdata}');
  Log(Format('Default/Fallback application data path is %s', [AppDataPath]));
  Uniq := ExtractFileName(ExpandConstant('{tmp}'));
  TempFileName :=
    ExpandConstant(Format('{commondocs}\appdata-%s.txt', [Uniq]));
  Params := Format('/C echo %%APPDATA%% > %s', [TempFileName]);
  Log(Format('Resolving APPDATA using %s', [Params]));
  Cmd := ExpandConstant('{cmd}');
  if ExecAsOriginalUser(Cmd, Params, '', SW_HIDE, ewWaitUntilTerminated, ResultCode) and
     (ResultCode = 0) then
  begin
    if LoadStringFromFile(TempFileName, Buf) then
    begin
      AppDataPath := Trim(Buf);
      Log(Format('APPDATA resolved to %s', [AppDataPath]));
    end
      else
    begin
      Log(Format('Error reading %s', [TempFileName]));
    end;
    DeleteFile(TempFileName);
  end
    else
  begin
    Log(Format('Error %d resolving APPDATA', [ResultCode]));
  end;

  Result := True;
end;

更多类似的问题:

  • 登录的用户Inno Setup的使用{} LOCALAPPDATA为
  • Inno Setup的-把用户文件管理文件


文章来源: Inno Setup always installs into admin's AppData directory