コマンドライン パラメーターと/S
サイレント インストールを処理できるインストーラーがあります。最近、 UAC プラグインRequestExecutionLevel
を使用してからadmin
に切り替えることで、Vista/W7 UAC 管理の標準に準拠するようにインストーラーをアップグレードしましたuser
。
テストでは、UAC プラグインが GUI モードおよびコマンド ライン サイレント モードでの権利の昇格に対して適切に機能することが示されました (「サイレント」インストールは、昇格ダイアログのために実際には完全に「サイレント」ではありません)。
現在、セットアップをサードパーティの展開ツールにラップしているときに、ツールが1223
( ERROR_CANCELLED
) エラー コード (「ユーザーによってキャンセルされた昇格」のようです) を取得していると顧客から言われました。私のセットアップは を介してエラー コードを直接返さないerrorlevel
ため、このコードは、システムの「runas」ダイアログをハックして昇格を実行しているように見える UAC プラグインのどこかに返されると推測しています。
返されたコードの起源について私は正しいですか? 昇格ダイアログをキャンセルすると、1223ではなくエラーレベル5(アクセスが拒否されました)が表示されます
UAC プラグインを統合するため
InitElevation
に、 の先頭で呼び出されるマクロを使用しています.onInit
が、問題ありませんか?サイレント モードでの 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}