Plik nagłówkowy Multi-User

Ten dokument zgodny jest z NSIS 3.1

Konfiguracja instalatora w środowisku Windows z wieloma użytkownikami



1. Wprowadzenie

Nowoczesne systemy Windows obsługują konta wielu użytkowników na jednym komputerze, każde z innymi uprawnieniami. Z powodów bezpieczeństwa, uprawnienia aplikacji również są ograniczone. Z punktu widzenia instalatora, ważne są: poziom wykonania oraz tryb instalacji. Poziom wykonania określa uprawnienia dla instalatora. Na przykład, aby zainstalować sterowniki urządzeń, wymagane są uprawnienia administratora. Programy mogą być również instalowane dla pojedynczego użytkownika lub dla wszystkich użytkowników komputera. Określa to tryb instalacji. Instalacja dla wszystkich użytkowników wymaga wyższych uprawnień w porównaniu z trybem instalacji dla pojedynczego użytkownika. Plik nagłówkowy MultiUser.nsh umożliwia automatyczną obsługę opisywanych aspektów procesu instalacji, to jest obsługę kont użytkowników oraz uprawnień.

Proszę zwrócić uwagę, że wszystkie ustawienia muszą być ustalone przed dołączeniem pliku nagłówkowego MultiUser.nsh.

2. Inicjalizacja i poziom wykonywania

Przed dołączeniem pliku nagłówkowego MultiUser.nsh, powinna być określona definicja MULTIUSER_EXECUTIONLEVEL. Przyjmować może ona jedną z poniższych wartości, w zależności od wymaganego poziomu wykonania:


  • Admin

    Wymagane są prawa administratora. Dostęp do danych wszystkich użytkowników.

  • Power

    Wymagane są prawa użytkownika zaawansowanego (użytkownicy zaawansowani nie istnieją w systemie Windows Vista. W systemie tym odpowiadają oni użytkownikom administratorom). Dostęp do danych wszystkich użytkowników (zapis do lokalizacji "Program Files" lub kluczy gałęzi rejestru HKLM), instalacja sterowników).

  • Highest

    Wymagany jest najwyższy możliwy poziom wykonania dla bieżącego użytkownika. Instalator może działać w trybie mieszanym, zarówno instalacja dla pojedynczego użytkownika, jak i dla wszystkich użytkowników.

  • Standard

    Nie wymagane są żadne specjalne uprawnienia. Instalacja tylko dla bieżącego użytkownika.

Aby zweryfikować te uprawnienia, wstaw makra MULTIUSER_INIT oraz MULTIUSER_UNINT w funkcji .onInit oraz un.onInit. Jeśli nie jest tworzony deinstalator, ustaw definicję MULTIUSER_NOUNINSTALL.

!define MULTIUSER_EXECUTIONLEVEL Highest
; !define MULTIUSER_NOUNINSTALL ; Odkomentuj tę linię, jeśli deinstalator nie jest tworzony
!include MultiUser.nsh

...

Function .onInit
  !insertmacro MULTIUSER_INIT
FunctionEnd

Function un.onInit
  !insertmacro MULTIUSER_UNINIT
FunctionEnd

To, czy wymagane uprawnienia mogą być pobrane zależy od użytkownika, który uruchamia instalatora:

  • System Windows NT 4/2000/XP/2003 nadaje instalatorowi te same uprawnienia, które posiada użytkownik. Jeśli wymagania te nie są wystarczające (np. wymagane są uprawnienia administratora, a użytkownik uruchamiający instalatora nie posiada takich praw), makra zwrócą błąd i zakończą pracę instalatora. Możliwe jest jednak ręczne uruchomienie instalatora z uprawnieniami konta administratora.
  • System Windows Vista domyślnie ogranicza uprawnienia wszystkich aplikacji. W zależności od żądanego poziomu wykonania, plik nagłówkowy MultiUser.nsh ustawia flagę RequestExecutionLevel do wymaganych uprawnień. Użytkownik zostanie zapytany o potwierdzenie i (jeśli jest to wymagane) o hasło administratora.
  • System Windows 95/98/Me nie ogranicza w żaden sposób uprawnień użytkownika bądź aplikacji. Zawsze dostępne są uprawnienia administratora.

Zaleca się wstawienie inicjujących makr przed makrami, które wymagają interwencji użytkownika. Na przykład, nie ma sensu pytać użytkownika o język instalatora, jeśli instalator zakończy pracę, ponieważ konto użytkownika nie posiada odpowiednich uprawnień. Po wstawieniu tych makr, zmienna $MultiUser.Privileges będzie zawierała poziom wykonania bieżącego użytkownika (Admin, Power, User lub Guest).


Dostępne są poniższe dodatkowe ustawienia dla inicjalizacji:

  • MULTIUSER_INIT_TEXT_ADMINREQUIRED

    Komunikat błędu, który zostanie wyświetlony, jeśli wymagane są prawa administratora, ale nie są one dostępne.

  • MULTIUSER_INIT_TEXT_POWERREQUIRED

    Komunikat błędu, który zostanie wyświetlony, jeśli wymagane są prawa użytkownika zaawansowanego, ale nie są one dostępne.

  • MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE

    Komunikat błędu, który zostanie wyświetlony, jeśli wymagane są prawa administratora lub użytkownika zaawansowanego z uwagi na ustawienia trybu instalacji w linii poleceń (patrz poniżej), ale nie są one dostępne.

  • MULTIUSER_INIT_FUNCTIONQUIT, MULTIUSER_INIT_UNFUNCTIONQUIT

    Niestandardowa funkcja, która zostanie wywołana, jeśli instalator jest zamykany z powodu niewystarczających uprawnień.

3. Tryb instalacji

Jak wcześniej wspomniano, aplikacje mogą być instalowane zarówno dla pojedynczego użytkownika, jak i dla wszystkich użytkowników komputera. Aplikacje dla wszystkich użytkowników zazwyczaj instalowane są w katalogu 'Program Files' i pojawiają się w menu Start każdego użytkownika komputera. Aplikacje dla pojedynczego użytkownika zaś, są zazwyczaj instalowane w lokalnym katalogu danych aplikacji i pojawiają się w menu Start użytkownika, który zainstalował aplikację.

Domyślnie, plik nagłówkowy MultiUser.nsh ustawia tryb instalacji na tryb instalacji dla wszystkich użytkowników, jeśli dostępne są uprawnienia administratora lub użytkownika zaawansowanego (dzieje się tak zawsze, gdy poziom wykonania ustawiony jest na uprawnienia administratora Admin lub użytkownika zaawansowanego Power. Poziom wykonania z najwyższymi dostępnymi uprawnieniami użytkownika Highest zależy od konta użytkownika). Dla standardowego poziomu wykonania instalacja zawsze będzie trybem instalacji pojedynczego użytkownika. W systemie Windows 95/98/Me instalacja dla pojedynczego użytkownika nie jest dostępna.


Dostępne są następujące ustawienia do zmiany domyślnego trybu instalacji:

  • MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER

    Ustawia domyślny tryb instalacji na instalację pojedynczego użytkownika, nawet wtedy gdy dostępne są uprawnienia instalacji dla wszystkich użytkowników.

  • MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY
    MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME

    Niepuste klucze, tworzone są podczas instalacji w gałęzi HKCU lub HKLM. Domyślny tryb instalacji zostanie automatycznie ustawiony na poprzednio wybrany tryb, w zależności od lokalizacji klucza rejestru.

Po inicjalizacji, zmienna $MultiUser.InstallMode zawierać będzie bieżący tryb instalacji (AllUsers lub CurrentUser).


Instalacja mieszana


Dla poziomów wykonania z uprawnieniami administratora Admin oraz użytkownika zaawansowanego Power, dostępne są tryby instalacji dla pojedynczego użytkownika jak i dla wszystkich użytkowników. Jeśli ustawiony jest poziom wykonania Highest, a użytkownik jest administratorem lub użytkownikiem zaawansowanym, dostępne są również obie opcje.

Zazwyczaj, dobrze jest dać użytkownikowi możliwość wyboru pomiędzy tymi opcjami. Użytkownicy, którzy korzystają z nowoczesnego interfejsu użytkownika, MUI2, mają do dyspozycji specjalną stronę, która zapyta użytkownika o tryb instalacji. Aby skorzystać z tej strony, określ definicję MULTIUSER_MUI, uprzednio dołączając plik nagłówkowy User.nsh. Następnie makro MULTIUSER_PAGE_INSTALLMODE może być użyte jak normalna strona nowoczesnego interfejsu użytkownika (strona ta zostanie automatycznie pominięta, jeśli instalator działa w systemie Windows 95/98/Me):

!define MULTIUSER_EXECUTIONLEVEL Highest
!define MULTIUSER_MUI
!define MULTIUSER_INSTALLMODE_COMMANDLINE
!include MultiUser.nsh
!include MUI2.nsh

!insertmacro MULTIUSER_PAGE_INSTALLMODE
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_LANGUAGE Polish

...

Function .onInit
  !insertmacro MULTIUSER_INIT
FunctionEnd

Function un.onInit
  !insertmacro MULTIUSER_UNINIT
FunctionEnd

Ustawienie MULTIUSER_INSTALLMODE_COMMANDLINE, które widzimy w powyższym przykładzie, włącza możliwość ustawienia trybu instalacji poprzez użycie parametrów linii poleceń /AllUsers lub /CurrentUser. Jest to szczególnie przydatne w instalatorach bezokienkowych (cichych).

Dostępne są poniższe ustawienia, do ustalenia tekstów na stronie (dodatkowo dla ogólnej strony nowoczesnego interfejsu użytkownika):


  • MULTIUSER_INSTALLMODEPAGE_TEXT_TOP

    Tekst, który wyświetlany jest na górze strony.

  • MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS

    Tekst, który wyświetlany jest na przycisku pola wyboru instalacji dla wielu użytkowników.

  • MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER

    Tekst, który wyświetlany jest na przycisku pola wyboru instalacji dla pojedynczego użytkownika.


Inicjalizacja trybu instalacji


Flaga SetShellVarContext (która określa katalogi dla, np. skrótów, jak $DESKTOP) ustawiana jest automatycznie w zależności od trybu instalacji. Dodatkowo, poniższe ustawienia mogą być użyte, aby wykonać dodatkowe akcje, gdy tryb instalacji jest zainicjalizowany:

  • MULTIUSER_INSTALLMODE_INSTDIR

    Nazwa katalogu, w którym zainstalowana zostanie aplikacja, bez ścieżki dostępu. Katalog ten znajduje się w katalogu 'Program Files', dla instalacji dla wielu użytkowników oraz w lokalnym katalogu danych aplikacji, dla instalacji dla pojedynczego użytkownika (jeśli obsługiwane).

  • MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY
    MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME

    Klucz rejestru, w którym zachowany jest uprzednio zapisany katalog instalacji. Dla trybu instalacji dla pojedynczego użytkownika katalog pobierany jest z gałęzi HKCU, a dla trybu instalacji dla wszystkich użytkowników katalog pobierany jest z gałęzi HKLM.

  • MULTIUSER_INSTALLMODE_FUNCTION
    MULTIUSER_INSTALLMODE_UNFUNCTION

    Niestandardowa funkcja, która zostanie wywołana podczas inicjalizacji trybu instalacji, aby ustawić dodatkowe ustawienia, które zależą od trybu.


Aby ręcznie ustalić tryb instalacji, wywołaj jedną z poniższych funkcji:

  • MultiUser.InstallMode.AllUsers

    Instalator: Instalacja dla wszystkich użytkowników

  • MultiUser.InstallMode.CurrentUser

    Instalator: Instalacja dla pojedynczego użytkownika

  • un.MultiUser.InstallMode.AllUsers

    Deinstalator: Instalacja dla wszystkich użytkowników

  • un.MultiUser.InstallMode.CurrentUser

    Deinstalator: Instalacja dla pojedynczego użytkownika