2013-05-07 10 views
5

Ich bin ein Installationsprogramm mit Inno-Setup erstellen und möchte für die extrahierten Dateien als Administrator ausgeführt werden. Gibt es eine Möglichkeit, die extrahierten Dateien (z. B. Stapeldatei) als Administrator auszuführen? Wenn ja, welche Code-Elemente muss ich für die Ausführung mit einbeziehen?Inno-Setup Ausführen extrahierter Batch-Datei als Administrator

Das Setup-Protokoll zeigt in etwa wie folgt:

2013-05-07 17:34:25.303 -- Run entry -- 
2013-05-07 17:34:25.303 Run as: Current user 
2013-05-07 17:34:25.303 Type: Exec 
2013-05-07 17:34:25.303 Filename: C:\Temp\is-U4VID.tmp\Filename.bat 
2013-05-07 17:34:25.412 Process exit code: 0 

Die Dateien, die ich Probleme habe mit als Admin-Benutzer ausgeführt werden, in dem [Run] Abschnitt.

+1

Das beste, was Sie tun müssen, ist, was auch immer Sie in der Batch-Datei in Inno-Code umschreiben. Code kann alles, was eine Batch-Datei tun kann, und mehr. – Miral

+0

@Miral - Ich bin nicht sicher, wie lösche Dateien und starten und stoppen Sie Dienste mit Inno-Setup. Daher musste ich Batch-Dateien verwenden. – John

Antwort

8

Wenn Sie mit [Run] Abschnitt stellen Sie sicher, verwenden Sie runascurrentuser Flag (Wenn dieses Flag spezifiziert ist, wird der erzeugte Prozess Setup/Deinstallation des Benutzers Anmeldeinformationen erben (in der Regel vollständige Administratorrechte))

Else gibt es drei Möglichkeiten, wie Anwendungen programmatisch laufen (empfohlene Methode):

function Exec(const Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ResultCode: Integer): Boolean; 

function ShellExec(const Verb, Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ErrorCode: Integer): Boolean; 

function ShellExecAsOriginalUser(const Verb, Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ErrorCode: Integer): Boolean; 

Sie Exec() oder ShellExec() verwenden sollten, weil sie die angegebene Datei oder öffnen Sie führt eine weitere Aktion durch Verb angegeben, die gleichen Anmeldeinformationen wie Setup/UNINS mit hoch.

Keine der genannten Methoden funktioniert, wenn das Installationsprogramm nicht im erhöhten Modus ausgeführt wird. Also die UAC-Fenster vor Installer angezeigt wird sicherstellen, starten:

In Abschnitt [Setup] Verwendung Richtlinie PrivilegesRequired

Gültige Werte:

none, poweruser, admin oder lowest

Verwenden Administrator, um sicherzustellen, geeignete Anmeldeinformationen.

+1

Beachten Sie, dass standardmäßig 'PrivilegesRequired = admin' und ausgeführte Dateien als Administrator ausgeführt werden (außer 'postinstall [Run]'). Du musst also aus dem Weg gehen, damit es nicht funktioniert. – Miral

1

Aber was ist, wenn Sie eine Batch-Datei im postUninstall-Moment ausführen müssen? In diesem Fall, um eine Sicherung von Datenbankdateien wiederherzustellen, die von der Anwendung geändert wurden?

Es dauert einige Stunden, bis ich diesen Hack gefunden habe.

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); 
var 
    ResultCode: Integer; 
    outfile: String; 
    runBatHeader: String; 
    runBatBody: String; 

begin 

    if CurUninstallStep = usPostUninstall then 
    begin 
    (* 
     This is a messy hack, but the only way I could find to run a bat file 
     during the post unistall section. In this case all files copied are 
     already removed, and it was not permitted to extract temp files in 
     the uninstall phase. Code here writes 'outfile' to a system folder then runs it. 
    *) 
    if DirExists('C:\ProgramData\MySQL\MySQL Server 5.7_bak') then begin 
     if MsgBox('Uninstall located a possible backup of your original MySQL tables. ' + 
     'Uninstall can attempt to copy it to the previous location. There is no ' + 
     'guarantee that it will succeed. Do you want to try restoring this folder?', mbConfirmation, MB_YESNO or MB_DEFBUTTON2) = IDYES then 
     begin 

     outFile := 'C:\ProgramData\MySQL\restore.bat'; 
     runBatHeader := '@echo off' + #13#10 + #13#10; 
     runBatBody := 'ECHO Attempt to stop MySQL57' + #13#10 + 
       'NET STOP MySQL57' + #13#10 + 
       'ECHO Removing application databases' + #13#10 + 
       'RMDIR /S /Q "C:\ProgramData\MySQL\MySQL Server 5.7\"' + #13#10 + 
       'ECHO Copying backup to original location' + #13#10 + 
       'XCOPY "C:\ProgramData\MySQL\MySQL Server 5.7_bak" "C:\ProgramData\MySQL\MySQL Server 5.7\" /C /E /H /I /K /O /Q /R /Y' + #13#10 + #13#10 + 
       'ECHO Try to start MySQL57' + #13#10 + 
       'NET START MySQL57';'; 
     SaveStringToFile(outFile, runBatHeader, False); 
     SaveStringToFile(outFile, runBatBody, True); 

     MsgBox('ShelExec : C:\ProgramData\MySQL\restore.bat', mbConfirmation, MB_OK); 
     if not ShellExec('', 'C:\ProgramData\MySQL\restore.bat', '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then 
     begin 
      // handle failure if necessary 
      MsgBox('Apparently, the administrative privilege was not operational. Exiting without restoring the backup. ('+ IntToStr(ResultCode) +')', mbConfirmation, MB_OK); 
     end; 
     DeleteFile(outfile); 

     end; 
    end; 
    end; 
end; 

Es war nicht meine Idee. Ich habe eine example here gefunden.

Verwandte Themen