Модуль SMLets требует для своей работы консоль SCSM, а также скопированную библиотеку Microsoft.EnterpriseManagement.Core.dll с сервера SCSM. Но на самом деле это требование не такое уж и жесткое, и в этой статье пойдет речь о том, как установить SMLets на сервер, где нет консоли управления SCSM. Это может быть полезно например на сервере Opalis\Orchestrator, или на любом другом сервере, который должен взаимодействовать с серверами SCSM с помощью PowerShell.
Для установки SMLets потребуется выполнить несколько действий:
- Скачать и установить на сервер SMLets
- Отключить обязательное подписание скриптов в PowerShell
- Установить библиотеки SCSM в GAC (Global Assembly Cache)
- Изменить настроечный файл SMLets
Итак, приступим.
Установка SMLets
Тут нет ничего военного. Качаем самую свежую версию SMLets, и устанавливаем. На момент написания статьи SMLets распросранался в виде msi-пакета, и особых хлопот при установке не создавал, даже если на сервере включен UAC. Единственное, что можно отметить, что на выделенном сервере можно не устанавливать компоненты Data Gen и тестовые скрипты.
Отключение проверки подписи скриптов в PowerShell
По умолчанию, в PowerShell действует политика проверки подписи скриптов (Restricted), и если ваш скрипт не будет подписан, выполнение его будет заблокировано.
Для того, чтобы изменить политику, необходимо вызывать PowerShell от имени администратора (т.е. с повышенными привилегиями) и выполнить команду:
Set-ExecutionPolicy Unresricted
После чего подтвердить установку политики, нажав Y.
Установка библиотек SCSM в GAC
Затем необходимо установить библиотеки Microsoft.EnterpriseManagement.Core.dll и Microsoft.EnterpriseManagement.ServiceManager.dll в GAC. Это необходимо, чтобы при их подключении не заботиться о полном пути к этим библиотекам.
Самый простой способ это сделать следующий:
- Открыть два окна проводника, в первом – папку C:\Windows\Assembly, во втором – папку \\%имя_сервера_SCSM%\c$\Program Files\Microsoft System Center\Service Manager 2010\SDK Binaries\.
- Перетащить (drap-and-drop) файлы Microsoft.EnterpriseManagement.Core.dll и Microsoft.EnterpriseManagement.ServiceManager.dll в окном с папкой C:\Windows\Assembly
- Проверить, что в списке папки C:\Windows\Assembly появились Microsoft.EnterpriseManagement.Core и Microsoft.EnterpriseManagement.ServiceManager:
Собственно всё.
Изменение файла SMLets.psm1
Теперь необходимо отредактировать файл SMLets.psm1 из модуля SMLets. Сам модуль находится по адресу C:\Windows\System32\WindowsPowerShell\v1.0\Modules\SMLets. Замечу, что на х64 серверах файл SMLets.psm1 необходимо открывать 64х-битным редактором, например Блокнот. А вот к примеру Notepad++ “не увидит” этот файл, т.к. является 32х-битным приложением. Кроме этого, при включенном UAC редактор надо запускать с повышенными привилегиями.
В файле SMLets.psm1 необходимо произвести следующие изменения (приведена только начальная часть файла с изменениями):
#requires -version 2.0 # handy global variables $GLOBAL:SMADLL = ([appdomain]::CurrentDomain.getassemblies()|?{$_.location -match "System.Management.Automation.dll"}).location #$GLOBAL:SMDIR = (Get-ItemProperty 'hklm:/software/microsoft/System Center/2010/Service Manager/Setup').InstallDirectory #$GLOBAL:SMSDKDIR = "${SMDIR}\SDK Binaries" #$GLOBAL:SMDLL = "${SMSDKDIR}/Microsoft.EnterpriseManagement.Core.dll" $GLOBAL:EMGTYPE = "Microsoft.EnterpriseManagement.EnterpriseManagementGroup" $GLOBAL:DATAGENDIR = "$psScriptRoot\DataGen" <# .SYNOPSIS Load an assembly into the current process space .DESCRIPTION Provides a quick way of loading an assembly into the current process. .PARAMETER Dll The assemply to load. This can be either a file name or full path .EXAMPLE Import-Assembly "C:\Program Files\Microsoft System Center\Service Manager 2010\SDK Binaries\Microsoft.EnterpriseManagement.Core.dll" .OUTPUTS No output #> function import-Assembly { [CmdletBinding(SupportsShouldProcess=$true)] param ( [parameter(Mandatory=$true,Position=0)]$dll , [switch]$partial ) end { $dllpath = (resolve-path $dll).path if ( $partial ) { [reflection.assembly]::LoadWithPartialName($dll) } else { [reflection.assembly]::LoadFile($dllpath) } } } # load the Service Manager Core assembly set-alias -scope global load import-assembly #load $SMDLL | out-null [reflection.assembly]::LoadWithPartialName("Microsoft.EnterpriseManagement.Core.dll") | out-null $GLOBAL:smdefaultcomputer = "SCSMSERVERNAME"
Необходимо закомментировать строки 4, 5 и 6 (у нас таких путей и ключей реестра всё равно нет) и строку 45. После чего добавить строку 46 (загружаем библиотеку SCSM) и 48 (указываем с каким сервером работать, обсуждалось в прошлой статье). Обратите внимание на префикс GLOBAL – он указывает, что переменная должна действовать в рамках данной сессии PowerShell, а не только текущего контекста выполнения.
Заключение
На этом настройка закончена, запускайте PowerShell, и выполняйте любые команды из состава SMLets:
import-module SMLets Get-SCSMWhoAmI Get-SCSMIncident