2012-01-04 32 views
11

Jestem całkiem nowy z NSIS. Próbuję zażądać uprawnień administratora w celu uruchomienia instalatora, ponieważ jest trochę chaotyczny z rejestrami. Mój problem z "RequestExecutionLevel" i "MULTIUSER_EXECUTIONLEVEL" polega na tym, że absolutnie blokują one dostęp do instalatora użytkownikowi niebędącemu administratorem, nawet po wybraniu opcji "Uruchom jako administrator" w menu kontekstowym. Próbowałem już używać biblioteki RunAs DLL, ale nie znalazłem ani jednego wątku, co umieścić w zmiennej $ command przekazanej do funkcji "RunAsW".Jak zażądać uprawnień administratora przy użyciu NSIS?

Oto mój (dość hacked-up) Kod:

 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 

Wiele z nich jest po prostu odgadnąć pracy i prób i błędów. (btw - próbowałem także uruchomić pętlę, aby uzyskać wszystkich administratorów, ale wydaje się, że biblioteka DLL była przeznaczona tylko dla komputerów 32-bitowych, więc ...).

W każdym razie, moje pytanie brzmi:

Czy ktoś wie o sposób (używając „RunAs” lub w inny sposób), aby otworzyć okno dialogowe z prośbą o nazwę użytkownika i hasło, sprawdź referencje i kontynuować instalację tylko wtedy, gdy sprawdzeniu ?

Ponadto wiem, że istnieje sposób na skonfigurowanie instalatora, aby był wyposażony w tę ikonę przedstawiającą ikonę tarczy, która informuje użytkowników, że zostanie poproszony o pozwolenie administratora. Czy ktoś wie, jak to zrobić?

Każda pomoc będzie bardzo doceniona, ponieważ jest to jedyna rzecz, która obecnie uniemożliwia wdrożenie mojej aplikacji.

+0

Jaki jest sens "System :: Alloc 64 " Wyrzucasz wskaźnik za pop i wyciekujesz pamięć. NSIS jest zawsze 32-bitowy, więc twój komentarz na temat pętli ma niewielki sens ... – Anders

+0

"Oba absolutnie blokują dostęp do instalatora użytkownikowi niebędącemu administratorem, nawet po wybraniu opcji" Uruchom jako administrator "w menu kontekstowym" To nie brzmi dobrze! Jaka jest twoja wersja Windows i ustawienia UAC? – Anders

+0

Zmienna $ command jest rzeczą, którą chcesz wykonać, "calc.exe" itd. – Anders

Odpowiedz

22
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 InstFile 

Section 
SectionEnd 

to podstawowy kod, który zwykle polecam, aby upewnić się, że instalator działa jako administrator.

IMHO nie ma sensu monitować o poświadczenia na niestandardowej stronie, chyba że tylko części procesu instalacji wymagają dostępu administratora, a druga część wymaga dostępu do profilu użytkowników. Jeśli to dotyczy ciebie, powinieneś rzucić okiem na UAC plug-in (Jest to nieco skomplikowane w użyciu i uniemożliwia plikowi exe uzyskanie ikony nakładki ekranowej)

Nie sądzę, że RunAs plug-in działa poprawnie w systemie Vista +, gdy UAC jest włączone, więc próba uruchomienia go może być ślepym zaułkiem ...

The recommended way, aby uzyskać osłonę, żąda podniesienia w manifeście exe, robi to RequestExecutionLevel admin. Jeśli w ogóle nie użyjesz w swoim skrypcie skryptu RequestExecutionLevel, Twój instalator może zostać wykryty jako starszy instalator, a także dostanie nakładkę ekranu.

W systemie Windows Vista, jeśli plik wykonywalny do uruchomienia wymaga elewacja, następnie ikonę pliku wykonywalnego powinno być „opieczętowane” z ikoną tarczy do wskazać ten fakt. Plik manifestu aplikacji administracyjnej musi oznaczać "requireAdministrator", aby oznaczać plik wykonywalny jako wymagający pełnego tokena dostępu administracyjnego . Nakładka ikony tarczy będzie również automatycznie umieszczana na plikach wykonywalnych, które wymagają podniesienia wartości zgodnie z heurystyką wykrywania instalacji. Na przykład plik o nazwie setup.exe automatycznie otrzyma nakładkę ikony tarczy , nawet jeśli plik wykonywalny nie ma wbudowanego manifestu aplikacji.

+1

Thnx Anders. Odwrócono go ponownie do żądania RequestExecutionLevel bez RunAs i rozwiązano, przenosząc "Administrator RequestExecutionLevel" na górę strony. Teraz system Windows automatycznie wyświetla monit logowania administratora ... –

+0

Ten wpis był dla mnie pomocny. Dzięki, Anders. –