Inno Setup si installa sempre nella directory AppData dell’amministratore

Voglio archiviare la mia app nella directory AppData dell’utente corrente per evitare problemi con le autorizzazioni ottenute durante l’aggiornamento automatico della nostra app (quando è memorizzata in Programmi). Non diamo all’utente la possibilità di dove installare l’app. Abbiamo ricevuto lamentele da parte di utenti non amministratori che il programma di installazione archivia l’app nella directory AppData (dopo UAC, ovviamente), invece della directory AppData dell’utente corrente, che impedisce quindi l’esecuzione dell’applicazione in futuro.

In primo luogo, avevo DefaultDirName={userappdata}\{#MyAppName} . Poi ho provato DefaultDirName={commonappdata}\{#MyAppName} . Poi l’ho provato insieme a PrivilegesRequired=lowest e anche come PrivilegesRequired=none come l’ elevazione dei privilegi di richiesta Make InnoSetup richiesta solo quando è stata suggerita una domanda.

Questo è il mio copione come adesso, nel caso mi manchi qualcosa di ovvio:

 ; 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 

modificare

Ho cambiato due opzioni ma ancora senza fortuna;

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

Modifica 2:

Ho aggiunto il flag runasoriginaluser e generato un nuovo AppId (GUID) ma ancora senza fortuna;

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

Modifica 3:

Ho creato un semplice repository GitHub con i file di origine e lo script Inno.

Modifica 4:

Stavo testando su Windows 8.1. Sembra funzionare quando è compilato su Windows 7 e funziona su Windows 8, ma non quando è compilato su 8 e viene eseguito su 8.

Modifica 5:

È stato risolto ora ma per chiarire le cose riguardo a Modifica 4 , non funzionava solo sulla mia macchina. Ha funzionato su altre macchine Windows 8. Deve essere stato qualche strano caching o qualcosa del genere (anche se ho cambiato l’ AppId ).

Dal testo della tua domanda e se ti capisco correttamente, sembra che questo sia dovuto al fatto che stai “convalidando con un account amministratore per l’installazione da eseguire”. Se questo è il caso e stai inserendo un account diverso (da quello con cui hai effettuato l’accesso) al prompt UAC, l’utente corrente diventa in realtà l’account Amministratore appena inserito al prompt UAC e non l’account che hai registrato con. Pertanto, finché viene chiesto di elevare l’installazione utilizzando UAC, non si troverà nella directory AppData dell’utente connesso.

Quello che potrebbe essere necessario fare è utilizzare la funzione runasoriginaluser , che utilizzerà le credenziali dell’utente registrate al posto dell’account che hai inserito al prompt UAC, o trovare ciò che sta causando il prompt di elevazione UAC.

Vedi anche Inno Setup Creazione della chiave di registro per l’utente che ha effettuato l’accesso (non l’utente amministratore) .

Potrebbe anche essere utile la documentazione MSDN sul contesto di installazione .

Dovrebbe funzionare con PrivilegesRequired=lowest . Ed è l’approccio corretto. In caso contrario, vogliamo vedere un file di registro.

Il lowest farà eseguire il programma di installazione nel contesto dell’utente attuale non privilegiato. Quindi tutte le costanti , come {userappdata} , {userdesktop} , etc, si riferiranno all’utente corrente.


Ad ogni modo, per rispondere alla tua domanda, puoi usare il codice qui sotto.

Ma questo è solo per situazioni speciali, quando l’installatore ha davvero bisogno dei privilegi di amministratore (ad esempio per registrare qualche DLL di sistema), ma ha ancora bisogno di distribuire file per l’utente originale. Come qui: Inno Setup – Registra i componenti come amministratore .

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

Domande più simili:

  • Inno Setup Utilizzo di {localappdata} per l’utente connesso
  • Inno Setup: inserisce i file utente nei documenti di amministrazione