В предыдущей заметке был рассмотрен принцип простого выполнения сценариев, но что, если выполняемый скрипт должен возвращать некие значения, которые для нас важны? Попробуем немного усложнить задачу с выполнением скриптов через клиентов System Center 2012 Configuration Manager (SCCM).
Для примера будем использовать тот же скрипт для изменения RDP файлов, внеся в него некоторые изменения. В этом скрипте отличаются только выходные данные скрипта, которые будет ловить SCCM.
# $NewString - Строка адреса подключения которую хотим установить # $OldString - Массив вариантов старых значений строк адреса подключения, которые хотим заменить на $NewString # $NewString = "full address:s:KOM-AD01-RDSNLB.HOLDING.COM" $OldStrings = @( ` "full address:s:KOM-AD01-TS02.HOLDING.COM", ` "full address:s:KOM-AD01-RDSCB.HOLDING.COM", ` "full address:s:KOM-AD01-TS02", ` "full address:s:KOM-AD01-SRV-RDSH", ` "full address:s:10.160.0.140" ) # $DesktopPath = [Environment]::GetFolderPath("Desktop") $RDPFiles = Get-ChildItem -Path $DesktopPath -Recurse -Include *.RDP $Changed = 0 ForEach ($RDPFile in $RDPFiles) { $FileChanged = 0 $LinesArray = Get-Content $RDPFile $LinesCount = $LinesArray.Count For($i=0; $i -lt $LinesCount; $i++){ ForEach ($OldString in $OldStrings) { If ($LinesArray[$i] -like $OldString) { $LinesArray[$i] = $LinesArray[$i] -replace $OldString, $NewString Write-Host "Change File:" $RDPFile.FullName "`nline" $i "had a value of:"$OldString ", set new value:" $LinesArray[$i] "`n" $FileChanged = 1 } } } If ($FileChanged -eq 1) { $LinesArray > $RDPFile $Changed = $Changed + 1 } } If ($Changed -eq 0) { Write-Host "There was no change" } Else { Write-Host "Found RDP-files:" $RDPFiles.Count Write-Host "Change RDP-files:" $Changed }
На этот раз мы не будет использовать какие-либо сетевые расположения для хранения скрипта, всё будет хранится непосредственно в SCCM.
Открываем консоль SCCM и переходим на панель Активы и соответствие (Assets and Compliance) в раздел параметров соответствия (Compliance Settings) и вызовем создание нового элемента конфигурации (Configuration Items). Присвоим имя элементу конфигурации, тип элемента оставим по умолчанию, потому как исполнятся он должен на ОС Windows.
На следующем шаге укажем мастеру операционные системы к которым будет применяться элемент конфигурации.
Далее переходим к шагу “параметры”, где нужно нажать кнопку создать, откроется новое окно в котором необходимо настроить создаваемый параметр. Присвоим имя параметру и выберем тип “Сценарий”, т.к. сценарий нам будет возвращать строковые данные выберем тип “Строка”. Эта задача так же исполнятся от имени вошедшего пользователя, поэтому нужно установить соответствующую галку.
Пришло время добавить наш сценарий в параметр, жмём на “Добавить сценарий”, перед нами вновь появляется новое окно, куда мы просто копируем скрипт.
Язык сценария по умолчанию PowerShell, но так же доступны JScript и VBScript.
Как видно из скриншота, разработчики SCCM предлагают разделение скриптов, один - для обнаружения, второй - для исправления, но мы решили не мудрить и выполнить его в обнаружении. Возможно в каких-то других и более серьёзных задачах разделение скрипта будет полезным.
После того как скрипт добавлен, появляется возможность перейти на вкладку “Правила соответствия”. Присвоим правилу соответствия имя, выберем тип “Значение” и укажем параметр соответствия.
В правиле укажем следующий смысл – компьютер соответствует требованиям, если возвращаемая строка скриптом равна “There was no change”.
Степень важности несоответствия установим как “сведения”, потому как в нашем случае несоответствие не является ошибкой.
После проделанных действий параметр будет добавлен.
На следующем шаге, мы увидим уже добавленный ранее параметр соответствия, его можно добавлять и здесь, но мне удобнее с предыдущего мастера.
Осталось нажать несколько раз далее, чтобы завершить работу мастера создания элемента конфигурации.
Для развёртывания этого элемента нам потребуется создать шаблон базовой конфигурации (Configurations Baselines). В Мастере создания необходимо только присвоить имя и выбрать необходимый элемент конфигурации.
Вызовем контекстное меню на созданном шаблоне
Выберем пункт “Развернуть”, откроется мастер развёртывания шаблонов базовой конфигурации.
В настройках выберем коллекцию, на которую хотим выполнить развёртывание и укажем периоды выполнения. Для примера, я буду выполнять скрипт каждые 30 минут.
После получения SCCM клиентом развёртывания, возможно вы обнаружите, что состояние соответствия после выполнения имеет статус ошибки.
Такую же ошибку можно увидеть и на клиенте SCCM перейдя в вкладку “Конфигурации”.
Можно вызвать отчёт и посмотреть более детально.
Для того чтобы избежать этой ошибки, необходимо на клиентских компьютерах разрешить выполнение PS-скриптов. Сделать это можно, например, через Групповые политики.
Параметр в редакторе групповых можно найти по расположению: Конфигурация компьютера –> Политики –> Административные шаблоны –> Компоненты Windows –> Windows PowerShell –> Включить выполнение сценариев.
Необходимо установить политику “Разрешать локальные сценарии и удалённые подписанные сценарии”.
Дождёмся автоматического выполнения сценария, либо выберем шаблон на клиенте SCCM и нажмём кнопку “Оценить”.
Увидим новый статус “Не соответствует”, посмотрим отчёт:
Сортировка в отчёте клиента отображает значения почему-то не по порядку, но в отчётах запускаемых с консоли такой проблемы нет:
В любом из представленных отчётов можно увидеть, какие значения и файлы были заменены.
Если выполнить оценку ещё раз, то статус отображаемый на клиенте изменится на “Соответствует”, потому как скрипт возвратит строку соответствия – “There was no change”.
В отчёте на клиенте:
На мой взгляд, выполнять разворачивать скрипты PS/JS/VBS на рабочие станции пользователей более удобно используя шаблоны базовой конфигурации, так как у нас появляется возможность отслеживать статус выполняемых действий.
Добавить комментарий