NSIS: планировщик заданий: запускается, только если установлен флажок - PullRequest
3 голосов
/ 31 октября 2009

У меня проблемы с настройкой запланированной задачи с NSIS.

  1. Я не буду знать все пароли для пользователей, для которых я устанавливаю задачи, поэтому мне нужно установить флажок Запускать только при входе в систему, чтобы обойти это.
  2. У меня нет доступа для установки других программ на компьютер, кроме как для настройки задачи, поэтому мне предпочтительно использовать планировщик задач Windows.
  3. Задача ниже устанавливает задачу, проверяет флажок, но не запускает настройку задачи. Он не будет запускать задачу, пока я снова не перейду к тому же файлу и не нажму OK. Теперь задача будет работать нормально. Я спросил об этом поведении на другом форуме о JT.exe, потому что он делает то же самое, и мне сказали: «Он не устанавливает вход в систему как пакетное задание« Право пользователя », которое устанавливается schtasks.exe или GUI».
  4. Я попытался создать задачу, а затем изменить ее через командную строку. Он все еще не работает.
  5. Цель состоит в том, чтобы создать запланированную задачу Windows XP с использованием NSIS (или чего-либо в этом роде), который выполняется правильно и проверяет флажок Запускать только при входе в систему в планировщике задач 1.0.

Может кто-нибудь помочь, пожалуйста?

Вот текущий скрипт NSIS

; Adds a scheduled task running as a different user than the one
; running the installer. Modified from a script by brainsucker
; 
; (c) Justin Dearing <zippy1981@gmail.com>, 2006
; (c) brainsucker, 2002


Name "System Plugin Example"
OutFile "Sheduletask.exe"

; TASK_TRIGGER is the struct that sets when your task in run.
; Setting it via the NSIS System plugin is a healthy alternative to
; banging ones head against the wall.
;
; general TASK_TRIGGER structure arguments
; 1, 2 - skip
; 3,4,5 - BEGIN year, month, day
; 6,7,8 - END year, month, day (SHOULD be = 0, if 1 flag is skipped)
; 9, 10 - Start hour, minute
; 11, 12 - Duration and Interval of task in minutes. (duration - the whole 
;          time task will work, interval - time between runs. D = 120, 
;          I = 10: task will be runned every 10 minutes for 2 hours).
; 13 - flags (should be ored (|)):  
;          1 - task has end date (6,7,8 defined)
;          2 - task will be killed at Duration end
;          4 - task trigger disabled
; 14 - trigger type: there are 7 different types, every one with it own 
;          structure
;       0 = ONCE        task will be runned once
;       5 = On IDLE     task will run on system IDLE (ITask->SetIdleWait)
;       6 = At System Startup
;       7 = At Logon
; these types use the following structure (so 7 means trigger at Logon):
;    push "*(&l2, &i2 0, &i2 2003, &i2 9, &i2 4, &i2 0, &i2 0, &i2 0, &i2 14, &i2 20, i 0, i 0, i 0, i 7, i 0, &i2 0, i 0, &i2 0) i.s"     
;       1 = DAILY  - field 15 gives interval in days (here it 15)
;    push "*(&l2, &i2 0, &i2 2003, &i2 9, &i2 3, &i2 0, &i2 0, &i2 0, &i2 13, &i2 10, i 0, i 0, i 0, i 1, &i2 15, i 0, i 0, &i2 0) i.s"
;       2 = WEEKLY  - field 15 gives interval in weeks (here 17), 
;                  field 16 - shows which days to run (OR them with |): 
;                  Sunday-Saturday (0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40)
;                  in example monday and friday
;    push "*(&l2, &i2 0, &i2 2003, &i2 9, &i2 3, &i2 0, &i2 0, &i2 0, &i2 13, &i2 10, i 0, i 0, i 0, i 2, &i2 13, &i2 0x2|0x20, &i2 0, i 0, &i2 0) i.s"
;       3 = MONTHLYDATE  - field 15 bit field of days (OR them) to run 
;                          (0x1-0x40000000), 
;                  field 16 - bit field of month (OR them with |): 
;                  January-December (0x1-0x800)
;                  in example (3 and 5 days of February and June)
;    push "*(&l2, &i2 0, &i2 2003, &i2 9, &i2 3, &i2 0, &i2 0, &i2 0, &i2 13, &i2 10, i 0, i 0, i 0, i 3, i 0x4|0x20, &i2 0x2|0x20, i 0, &i2 0) i.s"
;       4 = MONTHLYDOW  - field 15 week of month to run (1-5)
;                  field 16 - shows which days to run (OR them with |): 
;                  Sunday-Saturday (0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40)
;                  field 17 - bit field of month (or them with |): 
;                  January-December (0x1-0x800)
;                  in example (first week, monday and friday of February and June)
;    push "*(&l2, &i2 0, &i2 2003, &i2 9, &i2 3, &i2 0, &i2 0, &i2 0, &i2 13, &i2 10, i 0, i 0, i 0, i 4, &i2 1, &i2 0x2|0x20, &i2 0x2|0x20, i 0, &i2 0) i.s"

Function CreateTask
  !define GUIDTask "{148BD520-A2AB-11CE-B11F-00AA00530503}"
  !define GUIDITask "{148BD524-A2AB-11CE-B11F-00AA00530503}"
  !define GUIDTaskScheduler "{148BD52A-A2AB-11CE-B11F-00AA00530503}"
  !define GUIDITaskScheduler "{148BD527-A2AB-11CE-B11F-00AA00530503}"
  !define GUIDITaskTrigger  "{148BD52B-A2AB-11CE-B11F-00AA00530503}"
  !define GUIDIPersistFile "{0000010b-0000-0000-C000-000000000046}"

  SetPluginUnload  alwaysoff

  ; store registers and pop params
  System::Store "S r8r7r5r4r3r2r1r0"

  StrCpy $R0 "error" ; result 

  System::Call "ole32::CoCreateInstance(g '${GUIDTaskScheduler}', i 0, i 11, g '${GUIDITaskScheduler}', *i .R1) i.R9"
  IntCmp $R9 0 0 End

  ; ITaskScheduler->NewWorkItem()
  System::Call '$R1->8(w r0, g "${GUIDTask}", g "${GUIDITask}", *i .R2) i.R9' 

  ; IUnknown->Release()    
  System::Call '$R1->2() i'                    ; release Task Scheduler object
  IntCmp $R9 0 0 End

  ; ITask->SetComment()
  System::Call '$R2->18(w r1)'

  ; ITask->SetApplicationName()
  System::Call '$R2->32(w r2)'

  ; ITask->SetWorkingDir()
  System::Call '$R2->36(w r3)'

  ; ITask->SetParameters()
  System::Call '$R2->34(w r4)'

  ; ITask->CreateTrigger(trindex, ITaskTrigger)
  System::Call '$R2->3(*i .R4, *i .R5)'

  ; ITask->SetFlags()
    System::Call '$R2->28(i 0x2000)'

  ; allocate TASK_TRIGGER structure
  System::Call '$5'
  Pop $R6

  ; ITaskTrigger->SetTrigger
  System::Call '$R5->3(i R6)'     
  ; ITaskTrigger->Release
  System::Call '$R5->2()'     

  ; free TASK_TRIGGER structure
  System::Free $R6

  ; ITask->SetAccountInformation
  System::Call '$R2->30(w r7, w r8)'

  ; IUnknown->QueryInterface
  System::Call '$R2->0(g "${GUIDIPersistFile}", *i .R3) i.R9'     ; QueryInterface

  ; IUnknown->Release()    
  System::Call '$R2->2() i'                    ; release Task  object
  IntCmp $R9 0 0 End

  ; IPersistFile->Save
  System::Call '$R3->6(i 0, i 1) i.R9'         

  ; release IPersistFile
  System::Call '$R3->2() i'                    

  IntCmp $R9 0 0 End
  StrCpy $R0 "ok"     

End:
  ; restore registers and push result
  System::Store "P0 l"

  ; last plugin call must not have /NOUNLOAD so NSIS will be able to delete the temporary DLL
  SetPluginUnload manual
  ; do nothing
  System::Free 0

FunctionEnd


Section "SiteSecureBackup"
  SetOutPath $TEMP
  push "Test Task"
  push "Testing the Task"
  push "C:\file.exe"
  push "C:\"
  push ""
  push \
    "*(&l2, &i2 0, \
   &i2 2006, &i2 1, &i2 1, \
    &i2 0, &i2 0, &i2 0, \
    &i2 0, &i2 0, \
    i 0, i 0, \
    i 0, \
    i 1, \
    &i2 1, &i2 00, &i2 0, i 0, &i2 0) i.s"
  push "Username"
  push "Userpassword"
  Call CreateTask
  Pop $0
  ;MessageBox MB_OK "Scheduled task creation result: $0"
SectionEnd

; eof

Ответы [ 2 ]

0 голосов
/ 15 июня 2010

не

; ITask->SetFlags()
System::Call '$R2->28(i 0x2000)'

делает работу? 28 - это индекс SetFlags, а 0x2000 - это TASK_FLAG_RUN_ONLY_IF_LOGGED_ON.

0 голосов
/ 07 марта 2010

WinXP Вход в систему как документация для пакетного задания говорит: «В Windows 2000 Server, Windows 2000 Professional и Windows XP Professional планировщик задач автоматически предоставляет это право при необходимости»

После просмотра документов единственное, что бросается в глаза: «Если вы установите флаг TASK_FLAG_RUN_ONLY_IF_LOGGED_ON, вы также можете установить pwszPassword в NULL для локальных учетных записей или учетных записей пользователей домена. Используйте метод IScheduledWorkItem :: SetFlags, чтобы установить флаг «(Это имеет смысл, если пользователь вошел в систему, пароль не нужен)

...