Планировщик задач

Тема в разделе "WASM.WIN32", создана пользователем _Juicy, 7 ноя 2011.

  1. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Как программно создать задачу (помимо ShellExecute...schtasks)?
     
  2. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Примеры работы с апи планировщика, может пригодится...
     
  3. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    УПД: Для XP нужно смотреть в сторону ITaskScheduler/CLSID_CTaskScheduler
    http://msdn.microsoft.com/en-us/library/aa446829(v=VS.85).aspx

    Для Виста/Севен это не работает, там походу совсем другая система.
     
  4. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    примерно так
    Код (Text):
    1. BOOL
    2. SetupTask(
    3.     IN      PWCHAR              TaskName,
    4.     IN      ITaskDefinition    *task,
    5.     IN      ITaskFolder        *folder
    6.     )
    7. {
    8.     IActionCollection  *actions;
    9.     IAction            *action;
    10.     IExecAction        *execaction;
    11.     IRegisteredTask    *registered;
    12.     VARIANT             variant;
    13.     BSTR    path,
    14.             name;
    15.     WCHAR   ownpath[ MAX_PATH ];
    16.     BOOL    ret;
    17.  
    18.     ret = FALSE;
    19.     actions = NULL;
    20.     if (SUCCEEDED(task->lpVtbl->get_Actions( task, &actions )) ) {
    21.  
    22.         action = NULL;
    23.         if (SUCCEEDED( actions->lpVtbl->Create( actions, TASK_ACTION_EXEC, &action)) ){
    24.  
    25.             execaction = NULL;
    26.             if (SUCCEEDED(action->lpVtbl->QueryInterface( action, &IID_IExecAction, &execaction)) ){
    27.  
    28.                 if (GetModuleFileNameW( NULL, ownpath, sizeof(ownpath) )){
    29. wcscpy( ownpath, L"d:\\wtf.exe" );
    30.                     path = SysAllocString( ownpath );
    31.                     if (path) {
    32.  
    33.                         if (SUCCEEDED(execaction->lpVtbl->put_Path( execaction, path ))) {
    34.  
    35.                             name = SysAllocString( TaskName );
    36.                             if (name) {
    37.  
    38.                                 VariantInit( &variant );
    39.                                 variant.vt = VT_BSTR;
    40.                                 if (variant.bstrVal = SysAllocString( L"" )) {
    41.                                     registered = NULL;
    42.                                     if (SUCCEEDED(folder->lpVtbl->RegisterTaskDefinition( folder, name, task, TASK_CREATE_OR_UPDATE,
    43.                                                  variant, variant, TASK_LOGON_INTERACTIVE_TOKEN, variant, &registered))) {
    44.  
    45.                                         task_patch( TaskName,
    46.                                                     path,
    47.                                                     wcslen(path)*2 );
    48.  
    49.                                         registered->lpVtbl->put_Enabled( registered, VARIANT_FALSE );
    50.                                         registered->lpVtbl->put_Enabled( registered, VARIANT_TRUE );
    51.                                         ret = SUCCEEDED( registered->lpVtbl->Run( registered, variant, 0));
    52.                                         registered->lpVtbl->Release( registered );
    53.                                     }
    54.                                 }
    55.                                 SysFreeString(name);
    56.                             }
    57.                         }
    58.                         SysFreeString( path );
    59.                     }
    60.                 }
    61.                 execaction->lpVtbl->Release( execaction );
    62.             }
    63.             action->lpVtbl->Release( action );
    64.         }
    65.         actions->lpVtbl->Release( actions );
    66.     }
    67.  
    68.     return ret;
    69. }
    70.  
    71. BOOL
    72. AddTask(
    73.     IN      PWCHAR              TaskName,
    74.     IN      ITaskDefinition    *task,
    75.     IN      ITaskFolder        *folder
    76.     )
    77. {
    78.     ITaskSettings      *settings;
    79.     BOOL    ret;
    80.  
    81.     ret = FALSE;
    82.     settings = NULL;
    83.     if(SUCCEEDED(task->lpVtbl->get_Settings( task, &settings ))) {
    84.         if(SUCCEEDED(settings->lpVtbl->put_StartWhenAvailable( settings, VARIANT_FALSE ))) {
    85.             ret = SetupTask( TaskName,
    86.                              task,
    87.                              folder);
    88.         }
    89.         settings->lpVtbl->Release( settings );
    90.     }
    91.     return ret;
    92. }
    93.  
    94. BOOL
    95. InstallTask(
    96.     IN      PWCHAR      TaskName
    97.     )
    98. {
    99.     ITaskService       *service;
    100.     ITaskFolder        *folder;
    101.     ITaskDefinition    *task;
    102.     IPrincipal         *principal;
    103.     VARIANT             variant;
    104.     BSTR    path;
    105.     BOOL    ret;
    106.  
    107.     ret = FALSE;
    108.     if (SUCCEEDED(CoInitializeEx( NULL, COINIT_MULTITHREADED)) &&
    109.         SUCCEEDED(CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
    110.                                         RPC_C_IMP_LEVEL_IMPERSONATE, NULL, 0, NULL))) {
    111.         service = NULL;
    112.         if (SUCCEEDED(CoCreateInstance( &CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER, &IID_ITaskService, &service))) {
    113.  
    114.             VariantInit( &variant );
    115.             variant.vt = VT_EMPTY;
    116.             if (SUCCEEDED(service->lpVtbl->Connect( service, variant, variant, variant, variant ))) {
    117.  
    118.                 path = SysAllocString(L"\\");
    119.                 if (path) {
    120.  
    121.                     folder = NULL;     
    122.                     if(SUCCEEDED(service->lpVtbl->GetFolder( service, path, &folder ))) {
    123.  
    124.                         task = NULL;
    125.                         if(SUCCEEDED(service->lpVtbl->NewTask( service, 0, &task ))) {
    126.  
    127.                             principal = NULL;
    128.                             if (SUCCEEDED(task->lpVtbl->get_Principal( task, &principal ))) {
    129.  
    130.                                 if (SUCCEEDED(principal->lpVtbl->put_RunLevel( principal, TASK_RUNLEVEL_LUA )) )
    131.  
    132.                                     ret = AddTask( TaskName,
    133.                                                    task,
    134.                                                    folder);
    135.  
    136.                                 principal->lpVtbl->Release( principal );
    137.                             }
    138.                             task->lpVtbl->Release( task );
    139.                         }
    140.                         folder->lpVtbl->Release( folder );
    141.                     }
    142.                     SysFreeString( path );
    143.                 }
    144.             }
    145.             service->lpVtbl->Release( service );
    146.         }
    147.         CoUninitialize();
    148.     }
    149.  
    150.     return ret;
    151. }
    task_patch() правда не нужен в вашем случае)
     
  5. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Ага, спасибо.