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
J’ai changé deux options mais toujours pas de chance;
PrivilegesRequired=lowest ... [Icons] ... Name: "{userdesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
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
J’ai créé un repository GitHub simple avec les fichiers source et le script Inno.
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.
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: