5

コマンドライン パラメーターと/Sサイレント インストールを処理できるインストーラーがあります。最近、 UAC プラグインRequestExecutionLevelを使用してからadminに切り替えることで、Vista/W7 UAC 管理の標準に準拠するようにインストーラーをアップグレードしましたuser

テストでは、UAC プラグインが GUI モードおよびコマンド ライン サイレント モードでの権利の昇格に対して適切に機能することが示されました (「サイレント」インストールは、昇格ダイアログのために実際には完全に「サイレント」ではありません)。

現在、セットアップをサードパーティの展開ツールにラップしているときに、ツールが1223( ERROR_CANCELLED) エラー コード (「ユーザーによってキャンセルされた昇格」のようです) を取得していると顧客から言われました。私のセットアップは を介し​​てエラー コードを直接返さないerrorlevelため、このコードは、システムの「runas」ダイアログをハックして昇格を実行しているように見える UAC プラグインのどこかに返されると推測しています。

  1. 返されたコードの起源について私は正しいですか? 昇格ダイアログをキャンセルすると、1223ではなくエラーレベル5(アクセスが拒否されました)が表示されます

  2. UAC プラグインを統合するためInitElevationに、 の先頭で呼び出されるマクロを使用しています.onInitが、問題ありませんか?

  3. サイレント モードでの UAC プラグインの動作を正しく理解できていません。スイッチ_()の場合、キーはプラグイン dll の機能にあるようです。0サイレント モードが原因で NSIS dilaog が表示されない (または存在しない?) 場合、「runas」呼び出しが失敗する可能性がありますか? 私のテスト環境では、コマンド ラインから silet セットアップを呼び出している間は問題ありませんが、展開ツールから呼び出された場合はどうなりますか?

UAC プラグインを統合するマクロ:

!macro InitElevation thing
    uac_tryagain:
    ${Debug} "Init UAC_RunElevated"
    !insertmacro UAC_RunElevated
    ;${debug} "$$0=$0 $$1=$1 $$2=$2 $$3=$3"
    ${Switch} $0
    ${Case} 0
        ${IfThen} $1 = 1 ${|} Quit ${|} ;we are the outer process, the inner process has done its work, we are done
        ${If} $3 <> 0 ;if we are admin
            System::Call "kernel32::GetCurrentProcessId()i.r0"
            ${If} ${UAC_IsInnerInstance}
                ; If we are in the elevated process, we need to get our grandparent PID for console
                ${GetProcessParent} $0 $ConsoleParentPID
                ;${Debug} "From elevated $0 process, parent process is $ConsoleParentPID"
                ${GetProcessParent} $ConsoleParentPID $ConsoleParentPID
                ;${Debug} "grand parent process is $ConsoleParentPID"
            ${Else}
                ;${Debug} "We are an already elevated process"
                StrCpy $ConsoleParentPID -1
            ${EndIf}
            ${Break}        ;we are admin (after elevation or not), let the show go on
        ${EndIf}
        ${If} $1 = 3 ;RunAs completed successfully, but with a non-admin user
            MessageBox mb_YesNo|mb_IconExclamation|mb_TopMost|mb_SetForeground "This ${thing} requires admin privileges, try again" /SD IDNO IDYES uac_tryagain IDNO 0
        ${EndIf}
        ;fall-through and die
    ${Case} 1223
        MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "This ${thing} requires admin privileges, aborting!"
        Quit
    ${Case} 1062
        MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Logon service not running, aborting!"
        Quit
    ${Default}
        MessageBox mb_IconStop|mb_TopMost|mb_SetForeground "Unable to elevate , error $0"
        Quit
    ${EndSwitch}
    ${Debug} "End UAC_RunElevated init"
!macroend

マクロ呼び出し ( の先頭.onInit):

;abort if not started by administrator
!insertmacro InitElevation "installer"
${If} ${UAC_IsInnerInstance}
${AndIfNot} ${UAC_IsAdmin}
    SetErrorLevel 0x666666 ;special return value for outer instance so it knows we did not have admin rights
    Quit
${EndIf}
4

0 に答える 0