Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / API планировщика задач? Как хотя бы узнать, существует ли задание с заданным именем? / 3 сообщений из 3, страница 1 из 1
22.04.2012, 23:46
    #37765552
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
API планировщика задач? Как хотя бы узнать, существует ли задание с заданным именем?
SCHTASKS.exe понятно
Добавлять собираюсь пока им (как описал в соседней теме).
Код: vbnet
1.
SCHTASKS /Create /TN taskname /SC ONLOGON /RL HIGHEST /RU пользователи /TR "\"C:\Program Files (x86)\Proga\Proga.exe\" "/start /F


Хотя очень смущает
/RU пользователи
/RU users
(без языкозависимого параметра никак, SID в общем случае не работает, надо вычислять users по SID).
Т.е. лучше б через API. (ну это максимально чего могу хотеть)

Но счас интересует простой вопрос. (мои минимальные потребности)
Как узнать программно что существует задание с именем "taskname"? (без подробностей)

SCHTASKS /QUERY [] это понятно, можно конечно
SCHTASKS /QUERY [] > file.txt
и искать там название задание, но как то уж очень не хочется.

P.S. Запрос делается от имени администратора (текущего), задание как оно добавлено, распространяется на всех пользователей.
...
Рейтинг: 0 / 0
23.04.2012, 01:47
    #37765612
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
API планировщика задач? Как хотя бы узнать, существует ли задание с заданным именем?
Нарыл:
Task Scheduler 2.0 Interfaces

VB6 - Use Vista+ Task Scheduler 2.0 API
В этом примере показано как создать задание и технология программы на VB6. Покопаюсь позже, посмотрю какие преимущества над SCHTASKS.

How the Windows built-in watchdog infrastructure can monitor performance counters and trigger alerts

Ответ на мой "короткий" вопрос, то что надо, работает:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Private Sub Command1_Click()
    'taskschd.dll -код работает только на висте/Win7/Win2008
    'http://msdn.microsoft.com/en-us/library/windows/desktop/aa383600(v=vs.85).aspx
    'http://www.codeproject.com/Articles/64401/How-the-Windows-built-in-watchdog-infrastructure-c
    
    'Enumerate the registered Task Scheduler tasks
    Dim taskService As Object ' As New TaskScheduler.TaskScheduler
    Dim folder As ITaskFolder
    Dim collection As IRegisteredTaskCollection
    Dim item As IRegisteredTask
    Set taskService = CreateObject("Schedule.Service")
    taskService.Connect
    'We are here connected with the task scheduler
    Set folder = taskService.GetFolder("")
    Set collection = folder.GetTasks(0)
    For Each item In collection
        MsgBox item.Name
    Next
    
'// Enumerate the registered Task Scheduler tasks
'ITaskService taskService = new TaskSchedulerClass();
'taskService.Connect(null, null, null, null);
'// We are here connected with the task scheduler
'ITaskFolder folder = taskService.GetFolder("\\");
'IRegisteredTaskCollection collection = folder.GetTasks(0);
'foreach (IRegisteredTask item in collection)
'{
'  comboBoxSchedulerTasks.Items.Add( item.Name);
'}
End Sub


А старые at-методы API и WMI здесь не годятся.
...
Рейтинг: 0 / 0
23.04.2012, 12:29
    #37766034
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
API планировщика задач? Как хотя бы узнать, существует ли задание с заданным именем?
Накатал:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
'taskschd.dll -код работает только на висте/Win7/Win2008
'надо использовать позднее связывание, иначе даже не скомпилируется
'библиотеку имеет смысл прикручивать только на момент написания кода
'http://msdn.microsoft.com/en-us/library/windows/desktop/aa383600(v=vs.85).aspx
'http://www.codeproject.com/Articles/64401/How-the-Windows-built-in-watchdog-infrastructure-c
'http://oildfish.blogbus.com/logs/69441678.html
    
Option Explicit

Private Const TASK_LOGON_GROUP = &H4
Private Const TASK_RUNLEVEL_HIGHEST = &H1
Private Const TASK_TRIGGER_LOGON = &H9
Private Const TASK_ACTION_EXEC = &H0
Private Const TASK_CREATE_OR_UPDATE = &H6

Public Function Schedule_AddAutoStart() As Boolean
    'SCHTASKS /Create /TN taskname /SC ONLOGON /RL HIGHEST /RU пользователи /TR "\"C:\Program Files (x86)\Proga\Proga.exe\" "/start /F
    Dim TaskDef As Object 'As TaskScheduler.ITaskDefinition
    Schedule_AddAutoStart = False
    On Error Resume Next
    With CreateObject("Schedule.Service") 'New TaskScheduler.TaskScheduler
        .Connect
        'This method call forces us to use late binding here, because .NewTask()
        'takes an Unsupported Variant type argument "flags" (UInt?).  It has to
        'be 0 anyway, so this works fine:
        Set TaskDef = .NewTask(0)
        With TaskDef
            With .RegistrationInfo
                .Description = "Allow to autorun Proga on Vista, Windows 7 or Windows 2008"
                .Author = "Proga Software"
            End With
            With .Principal
                .LogonType = TASK_LOGON_GROUP 'выполняеся для группы пользователей
                .GroupId = "S-1-5-32-545" '"Пользователи" имя группы(можно/нужно SID явно), выполняется от имени текущего пользователя
                .RunLevel = TASK_RUNLEVEL_HIGHEST 'Выполнить с наивысшими правами
            End With
            With .Settings
                .AllowDemandStart = True 'Разрешать выполнение задачи по требованию
                .Enabled = True 'Задание включено
                .Hidden = False 'задача не скрытая
                .StartWhenAvailable = True 'Немедленно запускать задачу, если пропущен плановый запуск
                .DisallowStartIfOnBatteries = False 'Разрешать запуск при питании от батарей
                .StopIfGoingOnBatteries = False 'Не останавливать при переходе на питание от батарей
                .AllowHardTerminate = False 'Не делать принудительную остановку задачи, если она не прекращается по запросу
                .ExecutionTimeLimit = "PT0S" 'Не останавливать задачу (т.к. по умолчанию 3 дня)
            End With
            With .Triggers.Create(TASK_TRIGGER_LOGON) 'Задание выполняется при входе в систему (любой пользователь)
                .Enabled = True 'Триггер включен
            End With
            With .Actions.Create(TASK_ACTION_EXEC) 'действие - запуск программы
                .Path = "C:\Program Files (x86)\Proga\Proga.exe" 'путь к программе
                .WorkingDirectory = "C:\Program Files (x86)\Proga" 'рабочая директория (не обязательно)
                '.Arguments = "/start" 'параметры (не обязательно)
                '.Path = App.Path & "\Proga.exe" 'путь к программе
                '.WorkingDirectory = App.Path
            End With
        End With
        With .GetFolder("\")
            On Error Resume Next
            'создаем или обновляем задание
            .RegisterTaskDefinition _
                "proga_autostart", _
                TaskDef, _
                TASK_CREATE_OR_UPDATE, _
                "S-1-5-32-545", _
                , _
                TASK_LOGON_GROUP
            If Err Then
            Else
                Schedule_AddAutoStart = True
            End If
        End With
    End With
    Set TaskDef = Nothing
End Function

Public Function Schedule_IsAutoStart() As Boolean
    'Enumerate the registered Task Scheduler tasks
    Dim taskService As Object 'As New TaskScheduler.TaskScheduler
    Dim folder As Object 'As ITaskFolder
    Dim collection As Object 'As IRegisteredTaskCollection
    Dim item As Object 'As IRegisteredTask
    Schedule_IsAutoStart = False
    On Error Resume Next
    Set taskService = CreateObject("Schedule.Service")
    taskService.Connect
    'We are here connected with the task scheduler
    Set folder = taskService.GetFolder("\")
    Set collection = folder.GetTasks(0)
    For Each item In collection
        If item.Name = "proga_autostart" Then
            Schedule_IsAutoStart = True
            Exit For
        End If
    Next
    Set taskService = Nothing: Set folder = Nothing: Set collection = Nothing: Set item = Nothing
End Function

Public Sub Schedule_DeleteAutoStart()
    Dim taskService As Object 'As New TaskScheduler.TaskScheduler
    Dim folder As Object 'As ITaskFolder
    On Error Resume Next
    Set taskService = CreateObject("Schedule.Service")
    taskService.Connect
    Set folder = taskService.GetFolder("\")
    folder.DeleteTask "proga_autostart", 0
    Set taskService = Nothing: Set folder = Nothing
End Sub
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / API планировщика задач? Как хотя бы узнать, существует ли задание с заданным именем? / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]