Приведём несколько примеров применения скриптов PowerShell в Configuration Manager

Наиболее распространённый метод управления SCCM-сервером – с помощью графической консоли. В ней визуально отображаются компоненты и их содержимое, статусы и ошибки, удобно вносить изменения в конфигурации и создавать отчёты. Помимо этого, в Configuration Manager может применяться и PowerShell, который при помощи огромного количества команд [https://docs.microsoft.com/en-us/previous-versions/system-center/powershell/system-center-2012-r2/jj821733(v%3dsc.20)] позволяет обращаться к реестру, Active Directory, WMI, файловой системе, операционной системе. Рассмотрим несколько примеров управления либо получения нужной информации с помощью командной строки.

Командлеты PowerShell разбиты на группы и пишутся через дефис. Чтобы получить какую-то информацию, нужно использовать Get-группу, для установки значений – Set-группу, для остановки – Stop, New\Remove – для создания\удаления, Move – для переноса, Rename – переименования, а для вывода информации – Out-группу.

Работать с командной строкой PowerShell можно как без сохранения результата, так и с сохранением. Чтобы в дальнейшем править имеющийся скрипт или применять его где-то, можно изначально создать пустой текстовый файл с помощью программы Блокнот, а затем сменить расширение с .txt на .ps1.

 

Первые действия

Сначала нужно подключиться PowerShell, относительно сервера SCCM [https://msdn.microsoft.com/en-us/library/dn528996.aspx?f=255&MSPPError=-2147217396]. Для этого в консоли Configuration Manager на главной панели в первом меню выбираем пункт Connect via Windows PowerShell.

Другой способ подключения к SCCM – с помощью специального модуля, используя командлет Import-Module. Для этого нужно запустить консоль PowerShell от имени администратора, перейти в каталог установки сервера (в нашем случае CD ‘D:\SCCM2016\AdminConsole\bin’), и выполнить импорт:

Import-Module .\ConfigurationManager.psd1 –verbose ,

ещё один вариант установить набор командлетов SCCM - запустить PowerShellCmdlets.msi.

Нам может понадобиться обращаться к Active Directory и получать в ответ нужные данные, поэтому сразу установим ещё один необходимый модуль:

Add-WindowsFeature -Name "RSAT-AD-PowerShell" –IncludeAllSubFeature

Далее пробуем вывести список доступных командлетов:

Get-Command –Module ConfigurationManager | out-gridview ,

затем проверим работоспособность справки, например:

help Remove-CMDevice –full ,

также выведем информацию о сайте (Get-CMSite) и список доступных пакетов для установки (Get-CMPackage | ft name) (см. рис. 1), множество несложных конструкций можно найти здесь [https://www.youtube.com/watch?v=OakNmNAmAsc].

Рисунок 1. Список доступных пакетов.

 

Дальнейшие действия

После того, как настроили работу командной строки, приведём сначала несложные примеры её применения.

Пример 1. Удалить все компьютеры в SCCM, где в имени встречается сочетание букв “DUD”. За удаление компьютеров отвечает командлет remove-cmdevice:

Get-CMDevice | where {$_.name -like '*DUD*'} | Remove-CMDevice Force

Пример 2. Вывести всех пользователей SCCM, фамилии которых начинаются на “b”. Делаем так: 

Get-CMUSER | where {$_.name -like 'b*'} | ft name

Пример 3. Вывести пользователей Active Directory, названия их компьютеров и IP-адреса, ОС.

Get-ADComputer -filter * -SearchBase “OU=Computers,dc=dmk,dc=dc03,dc=corp” | Select-Object -Property Name, ipv4*, OperatingSystem

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

Например, в Configuration Manager необходимо разрешить доступ на чтение к пакету по его имени сотруднику техподдержки. В этом случае удобно применить переменную, присвоив ей значения массива данных, а потом её использовать в другом месте. Переменная объявляется символом $.

$Name = Get-CMAccessAccount -PackageName "Office 2016"

Set-CMAccessAccount -PackageName $Name -Type User -UserName "KKK\Andreev.dd" -Access Read –Confirm .

Чтобы разрешить доступ к драйверам, загрузочным образам или приложениям, вместо ключа –PackageName можно использовать и такие ключи:  

-Application, -OperatingSystemImage, -OperatingSystemInstaller, -BootImageId, -DriverPackage и другие.

Пример 5. Вывести информацию о компьютерах.

Здесь ещё больше усложняется конструкция и может она визуально выглядеть, как код какого-то языка программирования, то есть с объявлением переменных и присвоением им значений, функциями, циклами, комментариями, считыванием данных из файла, экспортом в файл, специальными отступами.

Откроем пустой файл в редакторе с расширением .ps1, нажав на нём правой кнопкой мыши и выбрав из контекстного меню пункт Edit. Откроется программа PowerShell ISE (или открыть её из меню Пуск), состоящая из 3х частей: справа - список командлетов, сверху – поле для написания кода, а снизу – его результат (см. рис. 2).

Рисунок 2. Скриптовый редактор PowerShell.

В данном случае для получения данных о комплектующих компьютера нам необходимо обратиться к WMI [https://forsenergy.com/ru-ru/windowspowershellhelp/html/a4c499fa-deec-4c4b-b3fb-6e195d48a396.htm , https://docs.microsoft.com/en-us/powershell/module/Microsoft.PowerShell.Management/Get-WmiObject?view=powershell-5.1]. Значение каждого WMI-запроса присваиваем новой переменной, параметр Computername необходим для получения данных не с локальной машины, а с помощью символа “|” и Select-Object перечисляются необходимые параметры дальнейшего вывода значений, например, так:

$HDD = Get-WmiObject Win32_DiskDrive –Computername $PC | Select-Object Size

Эту и остальные переменные ($PC, $OS, $Mem, $IP, $CPU) завернём в функцию с математическими преобразованиями и протащим её через цикл Foreach(), получив на выходе данные со всех компьютеров:    

function PS_Inv

{

Param ([Parameter(Mandatory=$False, Position=0, HelpMessage="ComputerName")][Object] $PC = $env:COMPUTERNAME)

PROCESS {

$OS = Get-WmiObject Win32_OperatingSystem -Computername $PC

$PCProperties = Get-WmiObject Win32_ComputerSystem -ComputerName $PC

$MemoryProperties = Get-WmiObject Win32_PhysicalMemory -ComputerName $PC

$HDD = Get-WmiObject Win32_DiskDrive | Select-Object Size

$CPU = Get-WmiObject Win32_Processor | Select-Object Name

"-------------------------"

""

"PC  : {0}" -f $OS.csname

"OS  : {0}" -f $OS.Caption  + $OS.CSDVersion

"Mem : {0}" –f ([math]::round(($PCProperties.TotalPhysicalMemory/1024/1024),0))

"HDD : {0}" -f ($HDD.Size/1GB)

"CPU : {0}" -f $CPU.Name

} }

Clear-Host

PS_Inv $env:COMPUTERNAME

Get-ADcomputer -filter * | foreach {PS_Inv -PC $_.Name}

Результат можно увидеть на рисунке 2.

Пример 6. Удалить у всех пользователей программы из магазина (при установке OC) Windows 10 Pro.

В этом случае воспользуемся встроенным в SCCM функционалом работы со скриптами PowerShell [https://docs.microsoft.com/ru-ru/sccm/apps/deploy-use/create-deploy-scripts#security-scopes, https://www.systemcenterdudes.com/sccm-deploy-powershell-script/]. Для этого заходим в меню Software Library->Overview->Scripts, жмём правой кнопкой мыши и выбираем пункт Create Script. Мастер запросит ввести имя, например, Delete StoreApp, и сам скрипт, который выглядит так:

удалить 3D Builder - Get-AppxPackage -allusers *bing* | Remove-AppxPackage

Если же необходимо будет удалить все лишние приложения, то придётся их перечислить и прогнать в цикле, например, так:

$Delete_Apps = @("*3DBuilder*" "*Advertising*" "*BingWeather*" "*Feedback*" "*GetStarted*" "*Maps*" "*Messaging*" "*People*" "*ZuneMusic*" "*ZuneVideo*")

ForEach($app in $Delete_Apps)

{

Get-AppxPackage -Name $app | Remove-AppxPackage -ErrorAction SilentlyContinue

}

Затем новый скрипт необходимо будет утвердить. Для этого нажимаем на нём правой кнопкой мыши, в меню выбираем пункт Approve/Deny, жмём кнопку Next, проверяем установленный по умолчанию вариант Approve, потом Next->Next->Close.

После этого переходим в Assets and Compliance->Overview->Device Collections. На группе компьютеров нажимаем правой кнопкой мыши и выбираем пункт Run Script. В появившемся окне выбираем нужный нам скрипт, и ожидаем результат работы, а в это время можно наблюдать за процессом его выполнения (см. рис. 3).

Рисунок 3. Мониторинг работы скрипта.

Конечно же, мы рассмотрели только малую часть того, как можно получать, выводить и структурировать информацию. Помимо этого, с помощью PowerShell можно управлять сервером Configuration Manager, используя командлеты для создания точки распространения (Add-CMDistributionPoint), очистки статуса последнего развёртывания (Clear-CMPxeDeployment), отключения программы в пакетах (Disable-CMProgram), включения последовательности задач (Enable-CMTaskSequence), экспорта пакета драйверов (Export-CMDriverPackage), получения\вывода данных о коллекциях устройств (Get-CMDeviceCollection), установки клиентской части (Install-CMClient), создания нового загрузочного образа (New-CMBootImage), удаления точки управления (Remove-CMManagementPoint), изменения настроек границ (Set-CMBoundary), старта распространения пакетов программ (Start-CMPackageDeployment), обновления статуса клиентов (Update-CMClientStatus) и многого другого.

 

Отладка

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

Чтобы в лог-файле появилась информация, нужно применить 2 командлета, один - Start-Transcript - для начала записи, другой – Stop-Transcript - для остановки. Для удобства нужно ещё указать путь к файлу и можно ещё запретить его перезапись. На деле это будет выглядеть так:

Start-Transcript -Path D:\PS_Log\log1.txt -NoClobber 

…Код скрипта…

Stop-Transcript

Пример лог-файла можно увидеть на рисунке 4.

Рисунок 4. Пример лог-файла PowerShell.

 

ПО для PowerShell

Помимо стандартной оболочки написания скрипта PowerShell и PowerShell ISE существуют и более расширенные, но небесплатные. Например, PowerShell Studio 2019 [https://www.sapien.com/software/powershell_studio], PowerShell Plus [https://www.idera.com/productssolutions/freetools/powershellplus]. Ещё стоит упомянуть про утилиту PowerShell App Deployment Toolkit [https://psappdeploytoolkit.com/], которая интегрируется с SCCM и помогает распространять приложения.


Достоинства: расширяются знания по администрированию SCCM-сервера.

Недостатки: тратится время на изучение командлетов, а также тестирование и отладку.

Вывод: использование командной строки PowerShell в Configuration Manager даёт системному администратору дополнительные навыки и более глубокое понимание тонкостей работы в администрировании данного сервера, сбора и обработки полученной информации.