2013-05-07 31 views
5

Inno Setup ile bir yükleyici yapıyorum ve ayıklanan dosyaların yönetici olarak çalıştırılmasını istiyorum. Ayıklanan dosyaları (ör. Toplu iş dosyası) yönetici olarak çalıştırmaya zorlamanın bir yolu var mı? Eğer öyleyse, bunu gerçekleştirmek için hangi kod öğelerini içermem gerekir. Ben bir yönetici olarak çalıştırıyorsunuz sorun yaşıyorumInno Kurulum Ayıklanan Toplu İş Dosyasını Yönetici Olarak Çalıştırın

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 

dosyalar [Run] bölümünde yer almaktadır:

kurulum günlük aşağıdaki gibi gösterilmektedir.

+1

Yapılacak en iyi şey, toplu iş dosyasında yaptığınız her şeyi Inno koduna yeniden yazmaktır. Kod, bir toplu iş dosyasının yapabileceği her şeyi yapabilir ve daha fazlasını yapabilir. – Miral

+0

@Miral - Dosyaları nasıl sildiğimi ve Inno Setup ile hizmetleri başlatıp durduğundan emin değilim. Sonuç olarak, toplu iş dosyalarını kullanmak zorunda kaldım. – John

cevap

8

o zaman

Else üç vardır (bu bayrak belirtilmişse, olurken işlem Kur/Uninstall kullanıcı kimlik bilgilerini (genellikle tam yönetici ayrıcalıkları) devralır) runascurrentuser bayrağı kullandığından emin olmak [Run] bölümünü kullanıyorsanız programlama (tavsiye edilen şekilde) uygulamaları çalıştırmak için nasıl yolları: belirtilen dosyayı açmak veya çünkü

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; 

Sen Exec() veya ShellExec() kullanmalıdır Kur/Unins aynı kimlik bilgilerini kullanarak, Fiil tarafından belirtilen başka bir eylem gerçekleştirdiğinde uzun boylu.

Ancak, yükleyiciniz yüksek modda çalışmıyorsa, belirtilen yollardan hiçbiri çalışmaz. Yani emin yükleyici önce görünür UAC penceresi başlatır yapmak:

bölüm [Setup] kullanım yönergesi ise

PrivilegesRequired

Geçerli değerler: sağlamak için

none, poweruser, admin veya lowest

Kullanım yönetici uygun kimlik bilgileri.

+1

Varsayılan olarak 'PrivilegesRequired = admin' ve yürütülen dosyaların yönetici kullanıcı olarak çalıştığını unutmayın ('postinstall [Run]' dışında). Bu yüzden işe yaramayacağın için yoldan çıkmalısın. – Miral

1

Ancak, yükleme Sonrasında bir toplu iş dosyasını çalıştırmanız gerekirse ne olur? Bu durumda uygulama tarafından değiştirilen veritabanı dosyalarının yedeğini geri yüklemek için?

Bu hack'i bulana kadar herşeyi denemeye çalışıyor.

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; 

Bu benim fikrim değildi. Bir example here buldum.

İlgili konular