Так же, как и в OpsMgr, SCSM поддерживает консольные задачи – набор возможностей, доступных для каждого элемента в системе. Консольные задачи отображаются в панели Actions (Задачи) в консоле SCSM:
Мы можем создавать собственные консольные задачи, но в отличии от того же OpsMgr, в SCSM нам доступен только один вид задач – задачи командной строки. Такие задачи отлично подходят для запуска различных консолей и прочего, но не совсем подходят для работы с объектами самого SCSM.
“Изнутри” консольные команды радикально отличаются от того, что мы видели в OpsMgr. Все консольные задачи обрабытываются с помощью одной из двух .NET-сборок, так называемых обработчиков (handlers):
- CommandLineHandler – отвечает за обработку задач командной строки
- ConsoleTaskHandler – отвечает за обработку любых задач из сборок .NET
Описание задач в пакетах управления
Общие параметры
Все консольные задачи имеют следующее определение:
<ConsoleTask ID="NewID" Accessibility="Public" Enabled="true" Target="Class" RequireOutput="true"> <Assembly>EnterpriseManagement!SdkDataAccessAssembly</Assembly> <Handler>HandlerAssemblyFullName</Handler> <Parameters> ..... </Parameters> </ConsoleTask>
Атрибуты консольной задачи:
- ID – внутреннее имя задачи
- Accessibility – уровень доступности, для задач обычно public, т.е. доступен для всех пакетов управления
- Enabled – включена или отключена задача
- Target – тип объекта, для которого будет доступна эта задача
- RequireOutput – требуется ли вывод на экран для этой задачи. Обычно включается для программ командной строки (ping, tracert и т.п.)
Параметры коснольной задачи:
- Assembly – полное имя сборки млм ссылка на сборку. Обычно указывается ссылка (EnterpriseManagement!SdkDataAccessAssembly)
- Handler – полное имя класса-обработчика
- Parameters – отпределяет список параметров, которые передаются в обработчик
- Criteria – позволяет создать фильтр, который задает условие отображения задачи в зависимости от свойств выбранного элемента
Если вы захотите создать свой обработчик, то вы должны создать класс, наследованный от класса Microsoft.EnterpriseManagement.ConsoleFramework.TaskHandler (определен в сборке Microsoft.EnterpriseManagement.UI.Foundation) и переопределить один или оба метода DoTask:
public virtual void DoTask(NavigationModelNodeBase navigationNode, NavigationModelNodeTask task); public virtual void DoTask(IList<NavigationModelNodeBase> navigationNodes, NavigationModelNodeTask task);
ВНИМАНИЕ! Здесь и далее приводится описание классов и методов, не поддерживаемых Microsoft. Информация предоставлена “как есть”, без каких либо гарантий.
CommandLineHandler
Данный обработчик имеет следующее описание:
<ConsoleTask ID="ConsoleTask.94b96f8849a64a2bbe619e2f627c2d2a" Accessibility="Public" Enabled="true" Target="WorkItem!System.WorkItem.Incident" RequireOutput="true"> <Assembly>EnterpriseManagement!SdkDataAccessAssembly</Assembly> <Handler>Microsoft.EnterpriseManagement.UI.SdkDataAccess.CommandLineHandler</Handler> <Parameters> <Argument Name="LoggingEnabled">False</Argument> <Argument Name="Application">c:windowssystem32ping.exe</Argument> <Argument Name="WorkingDirectory">%windir%system32</Argument> <Argument Name="">$Context/Path[Relationship='CustomSystem_WorkItem_Library!System.WorkItemAboutConfigItem' TypeConstraint='CustomMicrosoft_Windows_Library!Microsoft.Windows.Computer']/Property[Type='CustomMicrosoft_Windows_Library!Microsoft.Windows.Computer']/NetbiosComputerName$</Argument> </Parameters> </ConsoleTask>
Описывать все параметры смысла нет, их легко сопоставить с соответствующими параметрами в UI:
Единственное, хотелось бы отметить опцию “Вести журнал действий во время выполнения задачи”. При включении этой опции вывод задачи записывается в журнал действий элемента:
ConsoleTaskHandler
Этот обработчик отвечает за запуск любых консольных задач. В качестве параметров для этого обработчика передаются полное название сборки (первый параметр) и полное имя класса (второй параметр) и параметры для этого класса (все последующие параметры):
<ConsoleTask ID="RunReportAction" Accessibility="Public" Enabled="true" Target="Microsoft.EnterpriseManagement.ServiceManager.UI.Administration.RunReportActionCategory" RequireOutput="false"> <Assembly>SdkDataAccessAssembly</Assembly> <Handler>Microsoft.EnterpriseManagement.UI.SdkDataAccess.ConsoleTaskHandler</Handler> <Parameters> <Argument Name="Assembly">Microsoft.EnterpriseManagement.ServiceManager.UI.Administration</Argument> <Argument Name="Type">Microsoft.EnterpriseManagement.ServiceManager.UI.Administration.Reporting.ReportTaskHandler</Argument> </Parameters> </ConsoleTask>
Если вы захотите создать свой собственный класс для передачи его в обработчик, вам необходимо создать класс, наследованный от класса Microsoft.EnterpriseManagement.UI.SdkDataAccess.ConsoleCommand (сборка Microsoft.EnterpriseManagement.UI.SdkDataAccess) и переопределить метод ExecuteCommand:
public virtual void ExecuteCommand(IList<NavigationModelNodeBase> nodes, NavigationModelNodeTask task, ICollection<string> parameters);
MultiSelect
Если вы заметили, некоторые задачи могут выполнять при нескольких выделенных элементах. Признаком того, что задача может выполняться на нескольких элементах, является наличие записи о данной задаче в секции Categories с атрибутом MultiSelectTask:
<Category ID="Microsoft.EnterpriseManagement.ServiceManager.UI.Console.MultiSelectTask.ActivateIncident" Target="System.WorkItem.Incident.ActivateIncidentCommand.Task" Value="SMConsole!Microsoft.EnterpriseManagement.ServiceManager.UI.Console.MultiSelectTask" />
Здесь Target – это внутреннее имя задачи.
Default Task
Для каждого элемента можно назначить задачу по-умолчанию. Она будет отличаться от других тем, что её можно запустить двойным щелчком на элементе в консоли. В интерфейсе такие задачи выделены жирным:
Для того, чтобы установить задачу как задачу по умолчанию, необходимо добавить в категории данную задачу с атрибутом Microsoft.EnterpriseManagement.ServiceManager.UI.Console.MultiSelectTask:
<Category ID="ServiceManager.IncidentManagement.Library.Category.AutomaticIncidentChange" Target="ServiceManager.IncidentManagement.Library.Task.AutomaticIncidentChange" Value="SMConsole!Microsoft.EnterpriseManagement.ServiceManager.UI.Console.DoubleClickTask" />
Здесь Target – это внутреннее имя задачи.