Inno Setup installe toujours dans le répertoire admin AppData

Je souhaite stocker mon application dans le répertoire AppData l’utilisateur actuel pour éviter des problèmes avec les permissions dont nous disposions lors de la mise à jour automatique de notre application (lorsqu’elle est stockée dans Program Files). Nous ne donnons pas à l’utilisateur la possibilité d’installer l’application. Nous avons reçu des plaintes d’utilisateurs non-administrateurs que le programme d’installation stocke l’application dans le répertoire AppData administrateur (après UAC bien sûr), au lieu du répertoire AppData de l’utilisateur actuel, ce qui empêche l’exécution de l’application dans le futur.

Tout d’abord, j’avais DefaultDirName={userappdata}\{#MyAppName} . Ensuite, j’ai essayé DefaultDirName={commonappdata}\{#MyAppName} . Ensuite, j’ai essayé avec PrivilegesRequired=lowest et même en tant que PrivilegesRequired=none car la demande du programme d’installation Make InnoSetup ne donne des privilèges que lorsque la question est suggérée.

Ceci est mon script dès maintenant si je manque quelque chose d’évident:

 ; 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: "comstackr: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,{#SsortingngChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent 

modifier

J’ai changé deux options mais toujours pas de chance;

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

Edit 2:

J’ai ajouté le drapeau runasoriginaluser et généré un nouvel AppId (GUID) mais toujours pas de chance;

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

Edit 3:

J’ai créé un repository GitHub simple avec les fichiers source et le script Inno.

Edit 4:

J’avais testé sur Windows 8.1. Il semble fonctionner lorsqu’il est compilé sur Windows 7, et exécuté sur Windows 8, mais pas lorsqu’il est compilé sur 8 et exécuté sur 8.

Edit 5:

Il est résolu maintenant, mais pour clarifier les choses en ce qui concerne Edit 4 , cela ne fonctionnait pas seulement sur ma machine. Cela a fonctionné sur d’autres machines Windows 8. Doit avoir été une mise en cache bizarre ou quelque chose (même si j’ai changé l’ AppId ).

D’après le libellé de votre question et si je vous comprends bien, il semble que c’est parce que vous “validez avec un compte administrateur pour que l’installation s’exécute”. Si tel est le cas et que vous entrez un autre compte (à partir de lequel vous êtes connecté) à l’invite du contrôle de compte d’utilisateur, l’utilisateur actuel devient alors le compte administrateur que vous venez d’entrer avec. Par conséquent, tant que l’on vous demande d’élever l’installation à l’aide du contrôle de compte d’utilisateur, celle-ci ne se retrouvera pas dans le répertoire AppData de l’utilisateur connecté.

Il se peut que vous deviez utiliser la fonction runasoriginaluser , qui utilisera les informations d’identification de l’utilisateur connecté au lieu du compte que vous avez saisi à l’invite du runasoriginaluser compte d’utilisateur, ou trouver la cause de l’invite d’élévation UAC.

Voir aussi la clé de registre Inno Setup Creating pour les utilisateurs connectés (pas pour les administrateurs) .

La documentation MSDN sur le contexte d’installation peut également être utile.

Il devrait fonctionner avec PrivilegesRequired=lowest . Et c’est la bonne approche. Si ce n’est pas le cas, nous voulons voir un fichier journal.

Le lowest fera exécuter le programme d’installation dans le contexte de l’utilisateur non privilégié actuel. Par conséquent, toutes les constantes , telles que {userappdata} , {userdesktop} , etc., feront référence à l’utilisateur actuel.


Quoi qu’il en soit, pour répondre à votre question, vous pouvez utiliser le code ci-dessous.

Mais cela ne concerne que des situations spéciales, lorsque l’installateur a réellement besoin de privilèges d’administrateur (par exemple pour enregistrer une DLL système), mais doit tout de même déployer des fichiers pour l’utilisateur d’origine. Comme ici: Inno Setup – Enregistrez les composants en tant qu’administrateur .

 [Files] Source: "MyProg.exe"; DestDir: "{code:GetAppData}" [Code] var AppDataPath: ssortingng; function GetAppData(Param: ssortingng): ssortingng; begin Result := AppDataPath; end; function InitializeSetup(): Boolean; var Uniq: ssortingng; TempFileName: ssortingng; Cmd: ssortingng; Params: ssortingng; ResultCode: Integer; Buf: AnsiSsortingng; 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 LoadSsortingngFromFile(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; 

Des questions plus similaires:

  • Inno Setup Utilisation de {localappdata} pour l’utilisateur connecté
  • Inno Setup – place les fichiers utilisateur dans les documents admin