NSIS: планировщик заданий: запускать только при входе в систему флажок

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

  1. Я не буду знать все пароли для пользователей, для которых я настраиваю задачи, поэтому мне нужно установить флажок «Выполнять только при входе в систему», чтобы обойти это.
  2. У меня нет доступа для установки других программ на компьютер, кроме как для настройки задачи, поэтому я должен предпочтительно использовать планировщик заданий Windows.
  3. Задача ниже устанавливает задачу, устанавливает флажок, но не запускает настройку задачи. Он не запустит задачу, пока я снова не перейду к тому же файлу, а затем не нажму «ОК». Теперь задача будет работать нормально. Я спросил об этом поведении на другом форуме о JT.exe, потому что он делает то же самое, и мне сказали: «Он не устанавливает право пользователя на вход в систему как пакетное задание, которое устанавливается schtasks.exe или графическим интерфейсом».
  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 <[email protected]>, 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

person Wayne    schedule 31.10.2009    source источник
comment
Интересно. Вчера я опубликовал аналогичный вопрос на superuser.com, который не имеет ничего общего с NSIS, но пытается решить ту же самую проблему. См. superuser.com/questions/191749/ - Мне очень любопытно узнать, можно ли решить эту проблему из командной строки (т.е. используя schtasks).   -  person Android Eve    schedule 23.09.2010


Ответы (2)


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

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

person Anders    schedule 07.03.2010

Разве не

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

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

person Vargas    schedule 15.06.2010