Statistiques
| Révision :

root / tmp / org.txm.setups / nsis / Include / MultiUser.nsh @ 3088

Historique | Voir | Annoter | Télécharger (14,75 ko)

1
/*
2

    
3
MultiUser.nsh
4

    
5
Installer configuration for multi-user Windows environments
6

    
7
Copyright 2008-2020 Joost Verburg
8

    
9
*/
10

    
11
!ifndef MULTIUSER_INCLUDED
12
!define MULTIUSER_INCLUDED 20200319
13
!verbose push 3
14

    
15
;Standard NSIS header files
16

    
17
!ifdef MULTIUSER_MUI
18
  !include MUI2.nsh
19
!endif
20
!include LogicLib.nsh
21
!include WinVer.nsh
22
!include FileFunc.nsh
23

    
24
!if ${NSIS_PTR_SIZE} > 4
25
!define /IfNDef MULTIUSER_MINWIN 0x501
26
!else
27
!define /IfNDef MULTIUSER_MINWIN 0x400
28
!endif
29

    
30
;Variables
31

    
32
Var MultiUser.Privileges
33
Var MultiUser.InstallMode
34

    
35
;Command line installation mode setting
36

    
37
!ifdef MULTIUSER_INSTALLMODE_COMMANDLINE
38
  !include StrFunc.nsh
39
  !ifndef StrStr_INCLUDED
40
    ${StrStr}
41
  !endif
42
  !ifndef MULTIUSER_NOUNINSTALL
43
    !ifndef UnStrStr_INCLUDED
44
      ${UnStrStr}
45
    !endif
46
  !endif
47
  
48
  Var MultiUser.Parameters
49
  Var MultiUser.Result
50
!endif
51

    
52
;Installation folder stored in registry
53

    
54
!ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
55
  Var MultiUser.InstDir
56
!endif
57

    
58
!ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME
59
  Var MultiUser.DefaultKeyValue
60
!endif
61

    
62
;Windows Vista UAC setting
63

    
64
!if "${MULTIUSER_EXECUTIONLEVEL}" == Admin
65
  RequestExecutionLevel admin
66
  !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS
67
!else if "${MULTIUSER_EXECUTIONLEVEL}" == Power
68
  RequestExecutionLevel admin
69
  !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS
70
!else if "${MULTIUSER_EXECUTIONLEVEL}" == Highest
71
  RequestExecutionLevel highest
72
  !define MULTIUSER_EXECUTIONLEVEL_ALLUSERS
73
!else
74
  RequestExecutionLevel user
75
  !ifndef MULTIUSER_EXECUTIONLEVEL
76
    !warning "MULTIUSER_EXECUTIONLEVEL not set!"
77
  !endif
78
!endif
79

    
80
/*
81

    
82
Install modes
83

    
84
*/
85

    
86
!macro MULTIUSER_INSTALLMODE_ALLUSERS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX
87

    
88
  ;Install mode initialization - per-machine
89

    
90
  ${ifnot} ${IsNT}
91
    ${orif} $MultiUser.Privileges == "Admin"
92
    ${orif} $MultiUser.Privileges == "Power"
93
  
94
    StrCpy $MultiUser.InstallMode AllUsers
95
  
96
    SetShellVarContext all
97
  
98
    !if "${UNINSTALLER_PREFIX}" != UN
99
      ;Set default installation location for installer
100
      !ifdef MULTIUSER_INSTALLMODE_INSTDIR
101
        !ifdef MULTIUSER_USE_PROGRAMFILES64
102
          StrCpy $INSTDIR "$PROGRAMFILES64\${MULTIUSER_INSTALLMODE_INSTDIR}"
103
        !else
104
          StrCpy $INSTDIR "$PROGRAMFILES\${MULTIUSER_INSTALLMODE_INSTDIR}"
105
        !endif
106
      !endif
107
    !endif
108
  
109
    !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
110
  
111
      ReadRegStr $MultiUser.InstDir HKLM "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}"
112
  
113
      ${if} $MultiUser.InstDir != ""
114
        StrCpy $INSTDIR $MultiUser.InstDir
115
      ${endif}
116
  
117
    !endif
118
  
119
    !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION
120
      Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}"
121
    !endif
122
    
123
  ${endif}
124

    
125
!macroend
126

    
127
!macro MULTIUSER_INSTALLMODE_CURRENTUSER UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX
128

    
129
  ;Install mode initialization - per-user
130

    
131
  !if ${MULTIUSER_MINWIN} < 0x500
132
  ${if} ${IsNT}
133
  !endif
134

    
135
    StrCpy $MultiUser.InstallMode CurrentUser
136
    SetShellVarContext current
137
  
138
    !if "${UNINSTALLER_PREFIX}" != UN
139
      ;Set default installation location for installer  
140
      !ifdef MULTIUSER_INSTALLMODE_INSTDIR
141
        !if ${MULTIUSER_MINWIN} < 0x490
142
        ${if} ${AtLeastWin2000}
143
        !endif
144
          GetKnownFolderPath $INSTDIR {5CD7AEE2-2219-4A67-B85D-6C9CE15660CB} ; FOLDERID_UserProgramFiles
145
          StrCmp $INSTDIR "" 0 +2
146
          StrCpy $INSTDIR "$LocalAppData\Programs" ; Fallback directory
147
          StrCpy $INSTDIR "$INSTDIR\${MULTIUSER_INSTALLMODE_INSTDIR}"
148
        !if ${MULTIUSER_MINWIN} < 0x490
149
        ${else}
150
          StrCpy $INSTDIR "$PROGRAMFILES\${MULTIUSER_INSTALLMODE_INSTDIR}"
151
        ${endif}
152
        !endif
153
      !endif
154
    !endif
155
  
156
    !ifdef MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY & MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME
157
      ReadRegStr $MultiUser.InstDir HKCU "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_INSTDIR_REGISTRY_VALUENAME}"
158
      ${if} $MultiUser.InstDir != ""
159
        StrCpy $INSTDIR $MultiUser.InstDir
160
      ${endif}
161
    !endif
162

    
163
    !ifdef MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION
164
      Call "${MULTIUSER_INSTALLMODE_${UNINSTALLER_PREFIX}FUNCTION}"
165
    !endif
166

    
167
  !if ${MULTIUSER_MINWIN} < 0x500
168
  ${endif}
169
  !endif
170

    
171
!macroend
172

    
173
Function MultiUser.InstallMode.AllUsers
174
  !insertmacro MULTIUSER_INSTALLMODE_ALLUSERS "" ""
175
FunctionEnd
176

    
177
Function MultiUser.InstallMode.CurrentUser
178
  !insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER "" ""
179
FunctionEnd
180

    
181
!ifndef MULTIUSER_NOUNINSTALL
182

    
183
Function un.MultiUser.InstallMode.AllUsers
184
  !insertmacro MULTIUSER_INSTALLMODE_ALLUSERS UN .un
185
FunctionEnd
186

    
187
Function un.MultiUser.InstallMode.CurrentUser
188
  !insertmacro MULTIUSER_INSTALLMODE_CURRENTUSER UN .un
189
FunctionEnd
190

    
191
!endif
192

    
193
/*
194

    
195
Installer/uninstaller initialization
196

    
197
*/
198

    
199
!macro MULTIUSER_INIT_QUIT UNINSTALLER_FUNCPREFIX
200

    
201
  !ifdef MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUNCTIONQUIT
202
    Call "${MULTIUSER_INIT_${UNINSTALLER_FUNCPREFIX}FUNCTIONQUIT}"
203
  !else
204
    Quit
205
  !endif
206

    
207
!macroend
208

    
209
!macro MULTIUSER_INIT_TEXTS UNINSTALLER_PREFIX
210

    
211
  !if "${UNINSTALLER_PREFIX}" == ""
212
    !define /ReDef MULTIUSER_TMPSTR_CAPTION "$(^SetupCaption)"
213
  !else
214
    !define /ReDef MULTIUSER_TMPSTR_CAPTION "$(^Name)"
215
  !endif
216

    
217
  !define /IfNDef MULTIUSER_INIT_TEXT_ADMINREQUIRED "${MULTIUSER_TMPSTR_CAPTION} requires administrator privileges."
218
  !define /IfNDef MULTIUSER_INIT_TEXT_POWERREQUIRED "${MULTIUSER_TMPSTR_CAPTION} requires at least Power User privileges."
219
  !define /IfNDef MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE "Your user account does not have sufficient privileges to install $(^Name) for all users of this computer."
220

    
221
  !undef MULTIUSER_TMPSTR_CAPTION
222

    
223
!macroend
224

    
225
!macro MULTIUSER_INIT_CHECKS UNINSTALLER_PREFIX UNINSTALLER_FUNCPREFIX
226

    
227
  ;Installer initialization - check privileges and set install mode
228

    
229
  !insertmacro MULTIUSER_INIT_TEXTS "${UNINSTALLER_PREFIX}"
230

    
231
  UserInfo::GetAccountType
232
  Pop $MultiUser.Privileges
233
  
234
  !if ${MULTIUSER_MINWIN} < 0x500
235
  ${if} ${IsNT}
236
  !endif
237
  
238
    ;Check privileges
239
  
240
    !if "${MULTIUSER_EXECUTIONLEVEL}" == Admin
241
  
242
      ${if} $MultiUser.Privileges != "Admin"
243
        MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ADMINREQUIRED}"
244
        !insertmacro MULTIUSER_INIT_QUIT "${UNINSTALLER_FUNCPREFIX}"
245
      ${endif}
246
  
247
    !else if "${MULTIUSER_EXECUTIONLEVEL}" == Power
248
  
249
      ${if} $MultiUser.Privileges != "Power"
250
        ${andif} $MultiUser.Privileges != "Admin"
251
        ${if} ${AtMostWinXP}
252
           MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_POWERREQUIRED}"
253
        ${else}
254
           MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ADMINREQUIRED}"
255
        ${endif}        
256
        !insertmacro MULTIUSER_INIT_QUIT "${UNINSTALLER_FUNCPREFIX}"
257
      ${endif}
258
  
259
    !endif
260
    
261
    !ifdef MULTIUSER_EXECUTIONLEVEL_ALLUSERS
262
    
263
      ;Default to per-machine installation if possible
264
    
265
      ${if} $MultiUser.Privileges == "Admin"
266
        ${orif} $MultiUser.Privileges == "Power"
267
        !ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER
268
          Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
269
        !else
270
          Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
271
        !endif
272

    
273
        !ifdef MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY & MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME
274

    
275
          ;Set installation mode to setting from a previous installation
276

    
277
          !ifndef MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER
278
            ReadRegStr $MultiUser.DefaultKeyValue HKLM "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
279
            ${if} $MultiUser.DefaultKeyValue == ""
280
              ReadRegStr $MultiUser.DefaultKeyValue HKCU "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
281
              ${if} $MultiUser.DefaultKeyValue != ""
282
                Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
283
              ${endif}
284
            ${endif}
285
          !else
286
            ReadRegStr $MultiUser.DefaultKeyValue HKCU "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
287
            ${if} $MultiUser.DefaultKeyValue == ""
288
              ReadRegStr $MultiUser.DefaultKeyValue HKLM "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_KEY}" "${MULTIUSER_INSTALLMODE_DEFAULT_REGISTRY_VALUENAME}"
289
              ${if} $MultiUser.DefaultKeyValue != ""
290
                Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
291
              ${endif}
292
            ${endif}
293
          !endif
294

    
295
        !endif
296

    
297
      ${else}
298
        Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
299
      ${endif}
300
    
301
    !else
302

    
303
      Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
304

    
305
    !endif  
306
  
307
    !ifdef MULTIUSER_INSTALLMODE_COMMANDLINE
308
    
309
      ;Check for install mode setting on command line
310

    
311
      ${${UNINSTALLER_FUNCPREFIX}GetParameters} $MultiUser.Parameters
312
  
313
      ${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters "/CurrentUser"    
314
    
315
      ${if} $MultiUser.Result != ""
316
        Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.CurrentUser
317
      ${endif}    
318
  
319
      ${${UNINSTALLER_PREFIX}StrStr} $MultiUser.Result $MultiUser.Parameters "/AllUsers"    
320
    
321
      ${if} $MultiUser.Result != ""
322
        ${if} $MultiUser.Privileges == "Admin"
323
          ${orif} $MultiUser.Privileges == "Power"
324
          Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
325
        ${else}
326
          MessageBox MB_OK|MB_ICONSTOP "${MULTIUSER_INIT_TEXT_ALLUSERSNOTPOSSIBLE}"
327
        ${endif}
328
      ${endif}
329
  
330
    !endif
331

    
332
  !if ${MULTIUSER_MINWIN} < 0x500
333
  ${else}
334
  
335
    ;Not running Windows NT, per-user installation not supported
336
    Call ${UNINSTALLER_FUNCPREFIX}MultiUser.InstallMode.AllUsers
337

    
338
  ${endif}
339
  !endif
340

    
341
!macroend
342

    
343
!macro MULTIUSER_INIT
344
  !verbose push 3
345
  !ifdef __UNINSTALL__
346
    !insertmacro MULTIUSER_UNINIT
347
  !else
348
    !insertmacro MULTIUSER_INIT_CHECKS "" ""
349
  !endif
350
  !verbose pop 
351
!macroend
352

    
353
!ifndef MULTIUSER_NOUNINSTALL
354
!macro MULTIUSER_UNINIT
355
  !verbose push 3
356
  !insertmacro MULTIUSER_INIT_CHECKS Un un.
357
  !verbose pop 
358
!macroend
359
!endif
360

    
361
/*
362

    
363
Mode selection page
364

    
365
*/
366

    
367
!macro MULTIUSER_PAGE_FUNCTION_CUSTOM TYPE
368
  !ifmacrodef MUI_PAGE_FUNCTION_CUSTOM
369
    !insertmacro MUI_PAGE_FUNCTION_CUSTOM "${TYPE}"
370
  !endif
371
  !ifdef MULTIUSER_PAGE_CUSTOMFUNCTION_${TYPE}
372
    Call "${MULTIUSER_PAGE_CUSTOMFUNCTION_${TYPE}}"
373
    !undef MULTIUSER_PAGE_CUSTOMFUNCTION_${TYPE}
374
  !endif
375
!macroend
376

    
377
!macro MULTIUSER_INSTALLMODEPAGE_INTERFACE
378

    
379
  !ifndef MULTIUSER_INSTALLMODEPAGE_INTERFACE
380
    !define MULTIUSER_INSTALLMODEPAGE_INTERFACE
381
    Var MultiUser.InstallModePage
382
    
383
    Var MultiUser.InstallModePage.Text
384
    
385
    Var MultiUser.InstallModePage.AllUsers
386
    Var MultiUser.InstallModePage.CurrentUser
387

    
388
  !endif
389

    
390
!macroend
391

    
392
!macro MULTIUSER_PAGEDECLARATION_INSTALLMODE UNPREFIX UNIQUEID
393

    
394
  !define /ReDef MULTIUSER_${UNPREFIX}INSTALLMODEPAGE "" ; Unlock strings in the language file(s)
395
  !insertmacro MULTIUSER_INSTALLMODEPAGE_INTERFACE
396

    
397
  !define /IfNDef MULTIUSER_INSTALLMODEPAGE_TEXT_TOP "$(MULTIUSER_INNERTEXT_INSTALLMODE_TOP)"
398
  !define /IfNDef MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS "$(MULTIUSER_INNERTEXT_INSTALLMODE_ALLUSERS)"
399
  !define /IfNDef MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER "$(MULTIUSER_INNERTEXT_INSTALLMODE_CURRENTUSER)"  
400

    
401
  PageEx custom
402

    
403
    PageCallbacks MultiUser.InstallModePre_${UNIQUEID} MultiUser.InstallModeLeave_${UNIQUEID}
404

    
405
    !define /IfNDef MULTIUSER_INSTALLMODEPAGE_CAPTION " "
406
    Caption "${MULTIUSER_INSTALLMODEPAGE_CAPTION}"
407

    
408
  PageExEnd
409

    
410
  !insertmacro MULTIUSER_FUNCTION_INSTALLMODEPAGE MultiUser.InstallModePre_${UNIQUEID} MultiUser.InstallModeLeave_${UNIQUEID}
411

    
412
  !undef MULTIUSER_INSTALLMODEPAGE_TEXT_TOP
413
  !undef MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS
414
  !undef MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER
415

    
416
!macroend
417

    
418
!macro MULTIUSER_PAGE_INSTALLMODE
419

    
420
  !verbose push 3
421
  
422
  !ifndef MULTIUSER_EXECUTIONLEVEL_ALLUSERS
423
    !error "A mixed-mode installation requires MULTIUSER_EXECUTIONLEVEL to be set to Admin, Power or Highest."
424
  !endif
425

    
426
  !ifmacrodef MUI_PAGE_INIT
427
    !insertmacro MUI_PAGE_INIT
428
  !endif
429
  !insertmacro MULTIUSER_PAGEDECLARATION_INSTALLMODE "" ${__COUNTER__}
430
  
431
  !verbose pop
432

    
433
!macroend
434

    
435
!macro MULTIUSER_FUNCTION_INSTALLMODEPAGE PRE LEAVE
436

    
437
  !include nsDialogs.nsh
438

    
439
  Function "${PRE}"
440

    
441
    !if ${MULTIUSER_MINWIN} < 0x500
442
    ${ifnot} ${IsNT}
443
      Abort
444
    ${endif}
445
    !endif
446

    
447
    ${if} $MultiUser.Privileges != "Power"
448
      ${andif} $MultiUser.Privileges != "Admin"
449
      Abort
450
    ${endif}
451

    
452
    !insertmacro MULTIUSER_PAGE_FUNCTION_CUSTOM PRE
453
    !ifmacrodef MUI_HEADER_TEXT_PAGE
454
      !insertmacro MUI_HEADER_TEXT_PAGE $(MULTIUSER_TEXT_INSTALLMODE_TITLE) $(MULTIUSER_TEXT_INSTALLMODE_SUBTITLE)
455
    !endif
456

    
457
    nsDialogs::Create 1018
458
    Pop $MultiUser.InstallModePage
459

    
460
    ${NSD_CreateLabel} 0 2u 100% 42u "${MULTIUSER_INSTALLMODEPAGE_TEXT_TOP}"
461
    Pop $MultiUser.InstallModePage.Text
462

    
463
    ${NSD_CreateRadioButton} 15u 50u -15u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_ALLUSERS}"
464
    Pop $MultiUser.InstallModePage.AllUsers
465

    
466
    !ifdef MULTIUSER_INSTALLMODEPAGE_SHOWUSERNAME
467
    !ifdef NOSYSTEMCALLS
468
    ReadEnvStr $0 USERNAME
469
    !else
470
    System::Call 'ADVAPI32::GetUserName(t""r0,*i${NSIS_MAX_STRLEN})'
471
    !endif
472
    StrCmp $0 "" +2
473
      StrCpy $0 " ($0)"
474
    ${NSD_CreateRadioButton} 15u 70u -15u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER}$0"
475
    !else
476
    ${NSD_CreateRadioButton} 15u 70u -15u 10u "${MULTIUSER_INSTALLMODEPAGE_TEXT_CURRENTUSER}"
477
    !endif
478
    Pop $MultiUser.InstallModePage.CurrentUser
479

    
480
    ${if} $MultiUser.InstallMode == "AllUsers"
481
      SendMessage $MultiUser.InstallModePage.AllUsers ${BM_SETCHECK} ${BST_CHECKED} 0
482
    ${else}
483
      SendMessage $MultiUser.InstallModePage.CurrentUser ${BM_SETCHECK} ${BST_CHECKED} 0
484
    ${endif}
485
    
486
    !insertmacro MULTIUSER_PAGE_FUNCTION_CUSTOM SHOW
487
    nsDialogs::Show
488
    !insertmacro MULTIUSER_PAGE_FUNCTION_CUSTOM DESTROYED
489
    
490
  FunctionEnd
491

    
492
  Function "${LEAVE}"
493
     SendMessage $MultiUser.InstallModePage.AllUsers ${BM_GETCHECK} 0 0 $0
494
     
495
     ${if} $0 = ${BST_CHECKED}
496
        Call MultiUser.InstallMode.AllUsers
497
     ${else}
498
        Call MultiUser.InstallMode.CurrentUser
499
     ${endif}
500
  
501
    !insertmacro MULTIUSER_PAGE_FUNCTION_CUSTOM LEAVE
502
  FunctionEnd
503

    
504
!macroend
505

    
506

    
507
!verbose pop
508
!endif