Поделиться через


Автоматическое обслуживание

Платформы

Клиентысерверы Windows 8 — Windows Server 2012

Описание

Windows зависит от выполнения действий по обслуживанию папки "Входящие" и сторонних разработчиков для большей части своей надстройки, включая клиентский компонент Центра обновления Windows и автоматическую дефрагментацию дисков, а также обновления и проверки антивирусной программы. Кроме того, предприятия часто используют такие действия обслуживания, как проверка защиты доступа к сети (NAP), чтобы обеспечить соблюдение стандартов безопасности на всех корпоративных рабочих станциях.

Действия по обслуживанию в Windows предназначены для выполнения в фоновом режиме с ограниченным взаимодействием с пользователем и минимальным влиянием на производительность и энергоэффективность. Однако в Windows 7 и более ранних версиях производительность и энергоэффективность по-прежнему затрагиваются из-за недетерминированного и широкого расписания нескольких действий по обслуживанию в Windows. Скорость реагирования пользователей снижается при выполнении действий по обслуживанию, пока пользователи активно используют компьютер. Приложения также часто просят пользователя обновить свое программное обеспечение и выполнить фоновое обслуживание, а также направить пользователей на несколько интерфейсов, включая центр уведомлений, панель управления, клиентский компонент Центра обновления Windows, оснастку MMC планировщика задач и сторонние элементы управления.

Цель автоматического обслуживания — объединить все действия фонового обслуживания в Windows и помочь сторонним разработчикам добавить их действия обслуживания в Windows без негативного влияния на производительность и энергоэффективность. Кроме того, автоматическое обслуживание позволяет пользователям, а также предприятиям контролировать планирование и настройку действий обслуживания.

Основные проблемы

Автоматическое обслуживание предназначено для решения этих проблем с действиями обслуживания в Windows:

  • Планирование крайнего срока
  • Конфликты использования ресурсов
  • Энергоэффективности
  • Прозрачность для пользователя

функциональное назначение;

Автоматическое обслуживание упрощает бездействующий режим и позволяет выполнять все действия своевременно и приоритетным образом. Она также помогает обеспечить единую видимость и контроль за действиями по обслуживанию, а также позволяет сторонним разработчикам добавлять свои действия по обслуживанию в Windows без негативного влияния на производительность и энергоэффективность. Для этого он предоставляет полностью автоматический режим, режим, инициированный пользователем, автоматическую остановку, крайние сроки и уведомления, а также контроль предприятия. Они описаны ниже.

Полностью автоматический режим

Этот режим по умолчанию обеспечивает интеллектуальное планирование во время простоя компьютера и в запланированное время — выполнение и автоматическое приостановка действий обслуживания без вмешательства пользователя. Пользователь может задать еженедельное или ежедневное расписание. Все действия по обслуживанию не являются интерактивными и выполняются автоматически.

Компьютер автоматически возобновляется из спящего режима, когда система, скорее всего, не будет использоваться, учитывая политику управления питанием, которая в случае ноутбуков по умолчанию разрешает пробуждение только в том случае, если он включен в питание ac. Полные системные ресурсы с высокой мощностью используются для выполнения действий по обслуживанию как можно быстрее. Если система была возобновлена из спящего режима для автоматического обслуживания, ему будет предложено вернуться в спящий режим.

Все необходимые взаимодействия с пользователем, связанные с такими действиями, как настройка, выполняются вне выполнения автоматического обслуживания.

Режим, инициированный пользователем

Если пользователям необходимо подготовиться к поездке, ожидать, что питание от батареи в течение длительного времени или хотите оптимизировать производительность и скорость реагирования, у них есть возможность инициировать автоматическое обслуживание по требованию. Пользователи могут настраивать атрибуты автоматического обслуживания, включая расписание автоматического запуска. Они могут просматривать текущее состояние выполнения автоматического обслуживания, и при необходимости они могут остановить автоматическое обслуживание.

Автоматическая остановка

Автоматическое обслуживание автоматически останавливается в настоящее время, если пользователь начинает взаимодействовать с компьютером. Действие обслуживания возобновляется, когда система возвращается в состояние простоя.

Примечание

Все действия в автоматическом обслуживании должны поддерживать остановку в течение 2 секунд или меньше. Пользователь должен быть уведомлен о том, что действие было остановлено.

Крайние сроки и уведомления Критически важное действие обслуживания должно выполняться в течение предопределенного периода времени. Если критические задачи не смогли выполняться в течение указанного времени, автоматическое обслуживание автоматически начнет выполняться при следующей доступной возможности простоя системы. Однако если состояние задачи остается за крайним сроком, автоматическое обслуживание уведомит пользователя о действии и предоставит возможность ручного запуска автоматического обслуживания. Все задачи, запланированные на обслуживание, будут выполняться, хотя большинство задач с нехваткой имеют приоритет. Это действие может повлиять на скорость реагирования системы и производительность; Таким образом, автоматическое обслуживание уведомит пользователя о выполнении критически важных действий по обслуживанию.

Корпоративный элемент управления

Корпоративные ИТ-специалисты должны иметь возможность определять, когда автоматическое обслуживание выполняется в своих системах Windows, применять это расписание через стандартизированные интерфейсы управления и получать данные о состоянии попыток автоматического обслуживания. Кроме того, ИТ-специалисты должны иметь возможность удаленно вызывать определенные действия автоматического обслуживания через стандартные интерфейсы управления. Каждый раз, когда выполняется автоматическое обслуживание, отчеты о состоянии, включая уведомления, когда не удалось выполнить автоматическое обслуживание, так как пользователь вручную приостановил действие, запускается. ИТ-специалисты должны рассмотреть возможность перемещения скриптов входа в автоматическое обслуживание, чтобы упростить работу пользователя.

Создание задачи автоматического обслуживания

В этом разделе описано, как разработчики могут создавать задачи с помощью определения задачи на языке XML или C. Имейте в виду, что действия по обслуживанию не должны запускать пользовательский интерфейс, требующий взаимодействия с пользователем, так как автоматическое обслуживание полностью без вести и запускается, когда пользователь отсутствует. Действительно, если пользователь взаимодействует с компьютером во время автоматического обслуживания, все задачи, выполняемые в процессе, будут завершены до следующего периода простоя.

Использование XML

Планировщик задач включает встроенное средство командной строки schtasks.exe, которое может импортировать определение задачи в формате XML. Схема определения задачи задокументирована по адресу https://msdn.microsoft.com/library/aa383609(v=VS.85).aspx. Ниже приведен пример задачи автоматического обслуживания, определенной в XML.

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.4" xmlns="https://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2011-07-01T11:34:31</Date>
    <Author>IT Deptartment</Author>
  </RegistrationInfo>
  <Principals>
    <Principal id="Author">
      <RunLevel>LeastPrivilege</RunLevel>
      <GroupId>NT AUTHORITY\SYSTEM</GroupId>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <MaintenanceSettings>
      <Period>P2D</Period>
      <Deadline>P14D</Deadline>
    </MaintenanceSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession>
    <UseUnifiedSchedulingEngine>true</UseUnifiedSchedulingEngine>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>P3D</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>cmd</Command>
      <Arguments>/c timeout -t 60</Arguments>
    </Exec>
  </Actions>
</Task> 

Чтобы сохранить задачу на компьютере с Windows, сохраните приведенный выше XML-файл в виде текстового файла и используйте следующую командную строку:

Schtasks.exe /create /tn <task name> /xml <text file name>

Использование C

Задачу автоматического обслуживания также можно создать с помощью кода C. Ниже приведен пример кода, который можно использовать для настройки параметров автоматического обслуживания задачи:

/********************************************************************
This sample creates a maintenance task to start cmd window during maintenance opportunities with periodicity of 2 days and deadline 0f 14 days.
********************************************************************/

#define _WIN32_DCOM

#include <windows.h>
#include <iostream>
#include <stdio.h>
#include <comdef.h>
#include <wincred.h>
//  Include the task header file.
#include <taskschd.h>
//#pragma comment(lib, "taskschd.lib")
//#pragma comment(lib, "comsupp.lib")

int __cdecl 
MainteanceTask( )
{
    //  ------------------------------------------------------
    //  Initialize COM.
    HRESULT hr;

    //  ------------------------------------------------------
    //  Create a name for the task.
    LPCWSTR wszTaskName = L"MaintenanceTask";

    ITaskService *pService = NULL;
    ITaskFolder *pRootFolder = NULL;
    ITaskDefinition *pTask = NULL;
    ITaskSettings *pSettings = NULL;
    IRegistrationInfo *pRegInfo= NULL;
    IPrincipal *pPrincipal = NULL;
    ITaskSettings3 *pSettings3 = NULL;
    IMaintenanceSettings* pMaintenanceSettings = NULL;
    IActionCollection *pActionCollection = NULL;
    IAction *pAction = NULL;
    IExecAction *pExecAction = NULL;
    IRegisteredTask *pRegisteredTask = NULL;

    wprintf(L"\nCreate Maintenance Task %ws", wszTaskName );

    hr = CoInitializeEx( NULL, COINIT_MULTITHREADED);
    if( FAILED(hr) )
    {
        wprintf(L"\nCoInitializeEx failed: %x", hr );
        return 1;
    }

    //  Set general COM security levels.
    hr = CoInitializeSecurity( NULL,
        -1,
        NULL,
        NULL,
        RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
        RPC_C_IMP_LEVEL_IMPERSONATE,
        NULL,
        0,
        NULL);

    if( FAILED(hr) )
    {
        wprintf(L"\nCoInitializeSecurity failed: %x", hr );
        goto CleanUp;
    }

    //  ------------------------------------------------------
    //  Create an instance of the Task Service. 
    hr = CoCreateInstance( CLSID_TaskScheduler,
                           NULL,
                           CLSCTX_INPROC_SERVER,
                           IID_ITaskService,
                           (void**)&amp;pService );  
    if (FAILED(hr))
    {
        wprintf(L"\nFailed to create an instance of ITaskService: %x", hr);
        goto CleanUp;
    }
        
    //  Connect to the task service.
    hr = pService->Connect(_variant_t(), _variant_t(), _variant_t(), _variant_t());
    if( FAILED(hr) )
    {
        wprintf(L"\nITaskService::Connect failed: %x", hr );
        goto CleanUp;
    }

    //  ------------------------------------------------------
    //  Get the pointer to the root task folder.  This folder will hold the
    //  new task that is registered.
    hr = pService->GetFolder( _bstr_t( L"\\") , &amp;pRootFolder );
    if( FAILED(hr) )
    {
        wprintf(L"\nCannot get Root folder pointer: %x", hr );
        goto CleanUp;
    }
    
    //  If the same task exists, remove it.
    ( void ) pRootFolder->DeleteTask( _bstr_t(wszTaskName), 0  );
    
    //  Create the task definition object to create the task.
    hr = pService->NewTask( 0, &amp;pTask );
    if (FAILED(hr))
    {
        wprintf(L"\nFailed to CoCreate an instance of the TaskService class: %x", hr);
        goto CleanUp;
    }
        
    //  ------------------------------------------------------
    //  Get the registration info for setting the identification.
    hr = pTask->get_RegistrationInfo( &amp;pRegInfo );
    if( FAILED(hr) )
    {
        wprintf(L"\nCannot get identification pointer: %x", hr );
        goto CleanUp;
    }
    
    hr = pRegInfo->put_Author( _bstr_t(L"Author Name") );    
    if( FAILED(hr) )
    {
        wprintf(L"\nCannot put identification info: %x", hr );
        goto CleanUp;
    }

    // The task needs to grant explicit FRFX to LOCAL SERVICE (A;;FRFX;;;LS)
    hr = pRegInfo->put_SecurityDescriptor( _variant_t(L"D:P(A;;FA;;;BA)(A;;FA;;;SY)(A;;FRFX;;;LS)") );
    if( FAILED(hr) )
    {
        wprintf(L"\nCannot put security descriptor: %x", hr );
        goto CleanUp;
    }

    //  ------------------------------------------------------
    //  Create the principal for the task - these credentials
    //  are overwritten with the credentials passed to RegisterTaskDefinition
    hr = pTask->get_Principal( &amp;pPrincipal );
    if( FAILED(hr) )
    {
        wprintf(L"\nCannot get principal pointer: %x", hr );
        goto CleanUp;
    }
    
    //  Set up principal logon type to interactive logon
    hr = pPrincipal->put_LogonType( TASK_LOGON_INTERACTIVE_TOKEN );
    if( FAILED(hr) )
    {
        wprintf(L"\nCannot put principal info: %x", hr );
        goto CleanUp;
    }  

    //  ------------------------------------------------------
    //  Create the settings for the task
    hr = pTask->get_Settings( &amp;pSettings );
    if( FAILED(hr) )
    {
        wprintf(L"\nCannot get settings pointer: %x", hr );
        goto CleanUp;
    }

    hr = pSettings->QueryInterface( __uuidof(ITaskSettings3), (void**) &amp;pSettings3 );
    if( FAILED(hr) )
    {
        wprintf(L"\nCannot query ITaskSettings3 interface: %x", hr );
        goto CleanUp;
    }

    hr = pSettings3->put_UseUnifiedSchedulingEngine( VARIANT_TRUE );
    if( FAILED(hr) )
    {
        wprintf(L"\nCannot put_UseUnifiedSchedulingEngine: %x", hr );
        goto CleanUp;
    }

    hr = pSettings3->CreateMaintenanceSettings( &amp;pMaintenanceSettings );
    if( FAILED(hr) )
    {
        wprintf(L"\nCannot CreateMaintenanceSettings: %x", hr );
        goto CleanUp;
    }

    hr = pMaintenanceSettings->put_Period ( _bstr_t(L"P2D") );
    if( FAILED(hr) )
    {
        wprintf(L"\nCannot put_Period: %x", hr );
        goto CleanUp;
    }

    hr = pMaintenanceSettings->put_Deadline ( _bstr_t(L"P14D") );
    if( FAILED(hr) )
    {
        wprintf(L"\nCannot put_Period: %x", hr );
        goto CleanUp;
    }

    //  ------------------------------------------------------
    //  Add an action to the task. This task will execute notepad.exe.     
    //  Get the task action collection pointer.
    hr = pTask->get_Actions( &amp;pActionCollection );
    if( FAILED(hr) )
    {
        wprintf(L"\nCannot get Task collection pointer: %x", hr );
        goto CleanUp;
    }
    
    //  Create the action, specifying that it is an executable action.
    hr = pActionCollection->Create( TASK_ACTION_EXEC, &amp;pAction );
    if( FAILED(hr) )
    {
        wprintf(L"\nCannot create the action: %x", hr );
        goto CleanUp;
    }

    //  QI for the executable task pointer.
    hr = pAction->QueryInterface( IID_IExecAction, (void**) &amp;pExecAction );
    if( FAILED(hr) )
    {
        wprintf(L"\nQueryInterface call failed for IExecAction: %x", hr );
        goto CleanUp;
    }

    //  Set the path of the executable to notepad.exe.
    hr = pExecAction->put_Path( _bstr_t(L"cmd") );
    if( FAILED(hr) )
    {
        wprintf(L"\nCannot put action path: %x", hr );
        goto CleanUp;
    }  
    
    //  ------------------------------------------------------
    //  Save the task in the root folder.
    hr = pRootFolder->RegisterTaskDefinition(
            _bstr_t(wszTaskName),
            pTask,
            TASK_CREATE_OR_UPDATE, 
            _variant_t(), 
            _variant_t(), 
            TASK_LOGON_INTERACTIVE_TOKEN,
            _variant_t(L""),
            &amp;pRegisteredTask);
    if( FAILED(hr) )
    {
        wprintf(L"\nError saving the Task : %x", hr );
        goto CleanUp;
    }
    
    wprintf(L"\nSuccess!\n----------------------------------" );

CleanUp:

    if ( pService != NULL ) pService->Release();
    if ( pRootFolder != NULL ) pRootFolder->Release();
    if ( pTask != NULL ) pTask->Release();
    if ( pSettings != NULL ) pSettings->Release();
    if ( pRegInfo != NULL ) pRegInfo->Release();
    if ( pPrincipal != NULL ) pPrincipal->Release();
    if ( pSettings3 != NULL ) pSettings3->Release();
    if ( pMaintenanceSettings != NULL ) pMaintenanceSettings->Release();
    if ( pActionCollection != NULL ) pActionCollection->Release();
    if ( pAction != NULL ) pAction->Release();
    if ( pExecAction != NULL ) pExecAction->Release();
    if ( pRegisteredTask != NULL ) pRegisteredTask->Release();

    CoUninitialize();
    return SUCCEEDED ( hr ) ? 0 : 1;
}

Проверка задач

Убедитесь, что задача успешно создана и выполняется в процессе обслуживания.

Проверка создания задачи

Используйте эту командную строку для экспорта определения задачи в файл и обеспечения правильности определения задачи:

Schtasks.exe /Query /tn<task name> /xml <text file name>

Проверка выполнения задачи

Запустите эту командную строку, чтобы запустить задачу и убедиться, что в пользовательском интерфейсе планировщика задач (taskschd.msc) показано, что задача запущена:

Schtasks.exe /Run /tn<task name>

Ресурсы