2016-05-04 10 views
0

こんにちは私は古いインストールスクリプトをリファクタリングして、UACプラグインが作成する問題に取り掛かります。 !insertmacro Init "installer"のため、.onInitが2回実行されます。 !insertmacro Init "uninstaller"un.onInitの機能も同じです。NSISインストーラ.onInitとun.onInitがUACのために2回実行する

このため、インストーラとアンインストーラは2回実行されますが、これは必要な動作ではありません。例えばC:/ドライブに触れるときには必要ですが、外側のプロセスでもインストーラが実行されます。I have read that the UAC creates an inner process with elevated permissions

インストールスクリプトがかなり長いため、私は.onInit機能を貼り付けます。 .nsiスクリプト全体はhereです。

!insertmacroの行をコメントアウトすると、.onInit関数が一度実行されますが、インストーラはもう実行されません。では、インストーラとアンインストーラを一度しか実行せず、正しい(管理者)権限で実行するにはどうすればよいですか?

私はどんな提案を感謝したり答え:)

Function .onInit 
MessageBox MB_OK "In .onInit" 
    SetShellVarContext all 

    !insertmacro Init "installer" 

    System::Call 'kernel32::CreateMutexA(i 0, i 0, t "Tribler") i .r1 ?e' 

    Pop $R0 
    StrCmp $R0 0 checkinst 

    MessageBox MB_OK "The installer is already running." 
    Abort 

    checkinst: 
    ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT}" "UninstallString" 
    StrCmp $R0 "" done 
    IfFileExists $R0 showuninstdialog done 

    showuninstdialog: 
    MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "${PRODUCT} is already installed. $\n$\nClick `OK` to remove the previous version or `Cancel` to cancel this upgrade." /SD IDCANCEL IDOK uninst 
    Abort 

    uninst: 
    ClearErrors 
    ; Laurens (2016-03-29): Retrieve the uninstallString stored in the register. Do NOT use $INSTDIR as this points to the current $INSTDIR var of the INSTALLER, 
    ; which is the default location at this point. 
    ReadRegStr $R0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT}" "UninstallString" 
MessageBox MB_OK "$R0" 
    ExecWait '"$R0"' ;Do not copy the uninstaller to a temp file 
    ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT}" "UninstallString" 
    StrCmp $R0 "" done 
    Abort 
    done: 

FunctionEnd 
+0

ここに貼り付けた.onInitコードは、リンク先のコードと一致しません!リンク先のコードには明確な問題があります。ここに貼り付けたコードに自分自身をテストすることなく問題があるかどうかは実際には分かりませんが、テストするコードを明確にするまではこれを行いません。使用されるNSIS/UACプラグイン/ Windowsバージョンについてのいくつかの情報を持っているといいですね。 – Anders

+0

@アンダー私はこれをタイプしながらいくつかのことを押して試しています。ごめんなさい。現在実行中のコードのリンク内のコードを考えてみましょう。また、私はWindows 2008の64ビットサーバー上に構築しており、Windowsのマシンでも64ビットのインストール手順をテストしています。 – Gooey

+0

@アンダーズ私は実験的な変更のいくつかを取り消し、それらを押した。人々がそれを見ているときにそれが実際に混乱しているので、私は今それを押してはいけません。 – Gooey

答えて

2

あなたにリンクされたコード(少なくとも私がそれを見た時に)!insertmacro UAC_RunElevated!insertmacro Init "installer"を.onInitで呼び出すので、複数回走ったのも不思議ではありません。 !insertmacro UAC_RunElevatedに電話した後は、$0をチェックする必要があります。その値に応じてQuitに電話する必要があるかもしれません。

私は初期のマクロは、私が書いたものですので、それが正常に動作する必要があることを前提と(?);)

私は個人的にあなたがフィニッシュページ上で実行する]チェックボックスを犠牲にして、あなたはおそらくする必要がないことをお勧めしますUACプラグインを使用してください。

+0

アンサーさん、ありがとうございます。私はUAC_RunElevatedをテストとして挿入しました。私が最初に行うことは追加のパーミッションがあるかどうかを確認するためのチェックを追加することができます。 。残念なことに、!insertmacro Init "installer"だけを持つと、2回実行されます。 – Gooey

+0

私はUACプラグインなしで、あなたの助けと助言のために提案した通りにそれを行うことができるかどうかを確認するつもりです:) – Gooey

+0

私はそれを削除し、ここでファイルをリファクタリングして素晴らしい動作をします。ありがとう! – Gooey

1

は、私が覚えている限りでは、UACのプラグインは、特別なパラメータを指定してインストーラを再起動します。あなたの.onInitGetParametersGetOptionsを使用しているかどうかを確認することができ、その後、条件付きのメッセージを示しています。個人的に

# get all commandline parameters 
${GetParameters} $0 

# parse specific option 
${GetOptions} $0 "/UAC:" $1 

# do stuff 
IfErrors 0 +2 
MessageBox MB_OK "No admint" IDOK +2 
MessageBox MB_OK "Admin" 

、私は最後の部分のためLogicLibを使用したい:

# do stuff 
${If} $1 == "" 
    MessageBox MB_OK "Not admin" 
${Else} 
MessageBox MB_OK "Admin" 
${Endif} 
+0

あなたの提案をありがとう。私はあなたの提案した行を追加しました。そして、あなたは昇格したアクセス権ダイアログの後に2回目の実行で '/ UAC:/NCRC'という空のダイアログを表示します。だから私は後者のケースを望んでいるように聞こえますが、これをチェックする方法はありますか? – Gooey

+0

探している/ UAC:正しいオプションではありません。 – Anders