14

私はNSISにまったく慣れていません。インストーラーを実行するために管理者権限を要求しようとしています。レジストリが少し混乱しているためです。「RequestExecutionLevel」と「MULTIUSER_EXECUTIONLEVEL」に関する私の問題は、コンテキストメニューで[管理者として実行]を選択した場合でも、管理者以外のユーザーがインストーラーを開くのを完全にブロックすることです。RunAs DLLを使用しようとしましたが、「RunAsW」関数に渡される$command変数に何を入れるかについての単一のスレッドが見つかりませんでした。

これが私の(かなりハッキングされた)コードです:

     StrCpy $0 0
     StrCpy $1 ""
     System::Call 'RunAs::GetAdministrators(w r1, *i .r0) i .r2 ? u'
     System::Alloc 64
     Pop $4
     StrCpy $4 $2
     StrCpy $5 ""
     loop:
          IntCmp $0 0 endloop
          System::Call '*$4(w .r3)'
          StrCpy $5 "$5|$3"
    endloop:
    System::Free $4   ; we free the memory used by the array
    StrCpy $5 "$5" "" 1
    !insertmacro MUI_INSTALLOPTIONS_WRITE "Settings.ini" "Field 1" "ListItems" $5
     !insertmacro MUI_INSTALLOPTIONS_DISPLAY "Settings.ini"
     !insertmacro MUI_INSTALLOPTIONS_READ $1 "UserPass" "Field 1" "State"
     !insertmacro MUI_INSTALLOPTIONS_READ $2 "Settings.ini" "Field 2" "State"
     StrCpy $3 "%%LOGONSERVER%%"
     StrCpy $3 0
     StrCpy $4 0
     System::Call 'RunAs::RunAsW(w r1, w r2, w r3, *w .r4) i .r0 ? u'
     MessageBox MB_OK $0
     IntCmp $0 1 success
     Quit
     success:
     !insertmacro MUI_LANGDLL_DISPLAY

その多くは、推測作業と試行錯誤です。(ところで、ループを実行してすべての管理者を取得しようとしましたが、DLLは32ビットマシン専用のようです...)。

とにかく、私の質問は:

ユーザー名とパスワードを要求するダイアログを開き、資格情報を確認し、チェックアウトした場合にのみインストールを続行する方法(「RunAs」などを使用)を知っている人はいますか?

また、インストーラーをセットアップして、管理者権限が要求されることをユーザーに知らせる素敵なシールドアイコンが表示されるようにする方法があることも知っています。誰かがそれを行う方法を知っていますか?

これが私のアプリの展開を現在妨げている唯一のものであるため、どんな助けでも大歓迎です。

4

1 に答える 1

25
Outfile RequireAdmin.exe
RequestExecutionLevel admin ;Require admin rights on NT6+ (When UAC is turned on)

!include LogicLib.nsh

Function .onInit
UserInfo::GetAccountType
pop $0
${If} $0 != "admin" ;Require admin rights on NT4+
    MessageBox mb_iconstop "Administrator rights required!"
    SetErrorLevel 740 ;ERROR_ELEVATION_REQUIRED
    Quit
${EndIf}
FunctionEnd

Page InstFiles

Section
SectionEnd

インストーラーが管理者として実行されていることを確認するために通常お勧めする基本的なコードです。

私見では、インストールプロセスの一部のみが管理者アクセスを必要とし、他の部分がユーザープロファイルへのアクセスを必要としない限り、カスタムページで資格情報の入力を求めることは意味がありません。これが当てはまる場合は、UACプラグインを確認する必要があります(使用が少し複雑で、exeファイルでシールドオーバーレイアイコンを取得できなくなります)

UACがオンのときにRunAsプラグインがVista+で正しく機能するとは思わないので、それを機能させるのは行き止まりになる可能性があります...

シールドを取得するための推奨される方法は、exeマニフェストで昇格を要求するRequestExecutionLevel adminことです。RequestExecutionLevelスクリプトでまったく使用しない場合、インストーラーレガシーインストーラーとして検出され、シールドオーバーレイも取得される可能性があります。

Windows Vistaでは、実行可能ファイルを起動するために昇格が必要な場合、実行可能ファイルのアイコンにシールドアイコンを「スタンプ」して、この事実を示す必要があります。実行可能ファイルのアプリケーションマニフェストは、実行可能ファイルを完全な管理アクセストークンが必要であることを指定するために、「requireAdministrator」をマークする必要があります。シールドアイコンオーバーレイは、インストーラー検出ヒューリスティックに従って昇格が必要と見なされる実行可能ファイルにも自動的に配置されます。たとえば、setup.exeという名前のファイルは、実行可能ファイルにアプリケーションマニフェストが埋め込まれていない場合でも、シールドアイコンオーバーレイを自動的に受け取ります。

于 2012-01-04T23:00:05.443 に答える