SCCM; CI/CB; Уведомление пользователей о необходимости перезагрузки через CCM/CB и SCToastNotification;

В качестве демонстрации возможностей SCCM — «Configuration baselines», будем дополнительно напоминать пользователю о необходимости перезагрузки, вот таким вот образом:

image

В качестве проверки на необходимость перезагрузиться я взял готовый скрипт «Get-PendingReboot.ps1» за авторством Brian Wilhite.

В качестве уведомления будем использовать утилиту входящую в состав CCM-клиента «SCToastNotification.exe». На вход она принимает два параметра «Заголовок» и «Текст»

%windir%\ccm\SCToastNotification.exe "Заголовок уведомления" "Текст уведомления"

SCToastNotification.exe использует класс «ToastNotificationManager» и работает начиная с Windows 8 / 2012 версий.

Для более старых ОС можно использовать «System.Windows.Forms.NotifyIcon», например:

## Original script: https://technet.microsoft.com/en-us/library/ff730952.aspx
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$objNotifyIcon = New-Object System.Windows.Forms.NotifyIcon
$objNotifyIcon.Icon = [System.Drawing.SystemIcons]::Information
$objNotifyIcon.BalloonTipIcon = "Info"
$objNotifyIcon.BalloonTipTitle = "Уведомление о перезагрузке"
$objNotifyIcon.BalloonTipText = "Вашему компьютеру требуется перезагрузка, пожалуйста перезагрузите его в удобное для Вас время. Спасибо!"
$objNotifyIcon.Visible = $True
$objNotifyIcon.ShowBalloonTip(10000)
Start-Sleep 10
$objNotifyIcon.Dispose()

Вместо вызова «SCToastNotification.exe» можно нужно использовать данный класс напрямую, например:

В Windows 1710 немного “закрутили гайки” и теперь уведомления можно слать только от приложения (AppID) которое имеет ярлык в меню “Пуск”. Получить все зарегистрированные AppID можно через командлет Get-StartApps. Центр программного обеспечения тоже регистрирует свой AppID —  “Microsoft.SoftwareCenter.DesktopToasts”.

[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null
[Windows.UI.Notifications.ToastNotification, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null
[Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | Out-Null
 
$AppID = "Microsoft.SoftwareCenter.DesktopToasts" # Or use Get-StartApps for get AppID
$Title = "Уведомление о перезагрузке"
$Message = "Вашему компьютеру требуется перезагрузка, пожалуйста перезагрузите его в удобное для Вас время. Спасибо!"
$TimeOut = 60 # Minutes

$template = @"
<toast>
    <visual>
        <binding template="ToastText02">
            <text id="1">$($Title)</text>
            <text id="2">$($Message)</text>
        </binding>
    </visual>
</toast>
"@
 
$xml = New-Object Windows.Data.Xml.Dom.XmlDocument
$xml.LoadXml($template)
$toast = New-Object Windows.UI.Notifications.ToastNotification $xml
$toast.ExpirationTime = [DateTimeOffset]::Now.AddMinutes($TimeOut)
 
[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier($AppID).Show($toast)

2019-08-21: Используйте PowerShell-код выше в своих CI/CB, т.к. в SCToastNotification.exe нет таймаута, приложение ожидает когда появится пользователь. И при существующей, заблокированной сесии, процессы будут копиться и ожидать логина пользователя, чтобы потом выдать ему все то кол-во предупреждений которое накопилось. Более того больше возможностей по кастомизации. Можно добавить интерактива этим уведомлениям, можно взять что-то готовое, например: https://gallery.technet.microsoft.com/Windows-10-Toast-9f228eb1.

Но в утилите уже реализованы необходимые проверки и логирование, а результат вызова можно наблюдать в лог файле:

"%windir%\CCM\Logs\SCToastNotification_<Domain@User>_.log"

Например: C:\Windows\CCM\Logs\SCToastNotification_LAB@s.korotkov_3.log

Starting up... (Microsoft.SoftwareCenter.Client.ToastNotification.App at Main) SCToastNotification 2016-12-22 16:30:05 1 (0x0001)
Client is running .Net Version4.0.30319.42000 (Microsoft.SoftwareCenter.Client.ToastNotification.App at Main) SCToastNotification 2016-12-22 16:30:05 1 (0x0001)
Toast notification process started with command line Заголовок уведомления Текст уведомления (Microsoft.SoftwareCenter.Client.ToastNotification.App at Main) SCToastNotification 2016-12-22 16:30:05 1 (0x0001)
The command line has 2 arguments (Microsoft.SoftwareCenter.Client.ToastNotification.App at Main) SCToastNotification 2016-12-22 16:30:05 1 (0x0001)
The toast has timed out (Microsoft.SoftwareCenter.Client.ToastNotification.App at ToastDismissed) SCToastNotification 2016-12-22 16:30:13 4 (0x0004)

Осталось только создать необходимые Configuration Item — 2 шт. и Baseline — 1 шт. и распространить на коллекцию.

Не буду полностью расписывать процесс создания, с картинками (порядок создания можно почитать здесь) просто выложу в конце готовый Baseline, который вы можете импортировать в консоли SCCM перейдя в раздел «\Assets and Compliance\Overview\Compliance Settings\Configuration Baselines» И нажав «Import Configuration Data».

В качестве «Discovery script» (скрипта проверки) что для Windows 7, что для Windows 8 и выше, используем скрипт от Brian Wilhite, добавляя последней строчкой вызов функции:

$Pending = Get-PendingReboot -ErrorAction SilentlyContinue
$Pending.CBServicing -or $Pending.WindowsUpdate -or $Pending.CCMClientSDK -or $Pending.PendComputerRename

В качестве Remediation script (скрипта исправления):

  • для Windows 7 указываем скрипт, использующий «System.Windows.Forms.NotifyIcon», указанный выше;
  • для Windows 8 и выше — указываем следующее:
    & (Join-Path $env:windir "CCM\SCToastNotification.exe") "Уведомление о перезагрузке" "Вашему компьютеру требуется перезагрузка, пожалуйста перезагрузите его в удобное для Вас время. Спасибо!"
    
    

И не забываем установить галку “Run scripts by using the logged on user credentials”, мы же хотим показывать уведомления залогиненному пользователю а не System :). В этом случае можно распространять CB и на Device-коллекции и на User-коллекции.

Далее «деплоим» Baseline на коллекцию, не забывая ставить галку «Remediate noncompliant rules when supported» и «Allow remediation outside the maintenance window». Указываем частоту проверки, например раз в 3 часа.

deploy-configuration-baselines

В общем то все.

*Update: 2016-12-23

Готовый Configuration Baseline для всех поддерживаемых ОС (2 Configuration Item, один для Windows 7, второй для Windows 8 и выше): Alert: Reboot Pending (Win7 & above)

* Update: 2016-12-29

Если вы скачиваете готовый Configuration Baseline, не забывайте разблокировать файл: открыть Свойство файла и справа внизу нажать «Разблокировать» («Unblock»). Иначе может появляться ошибка «0x87d00327 Script is not signed«, даже при включенной разрешающей («ByPass«) политике CCM-клиента.
Обнаружено и «оттраблшутено» коллективным разумом в чатике SCCM UG Russia (Telegram). Присоединяйтесь!

* Update: 2017-11-17

Коллеги, с большими инфраструктурами, имейте в виду, частый запуск DCM может сгенерировать вам большой трафик State message о переоценке со вторичных сайтов в виде RPL-файлов в Inbox Replmgr.
За информацию спасибо PFE Инженеру из чатика SCCM UG Russia (Telegram).

Реклама
Запись опубликована в рубрике PowerShell, SCCM, Tricks. Добавьте в закладки постоянную ссылку.

3 отзыва на “SCCM; CI/CB; Уведомление пользователей о необходимости перезагрузки через CCM/CB и SCToastNotification;

  1. Дмитрий:

    Здравствуйте.
    Нашел Ваш пост очень полезным и решил использовать в работе.
    Имеется SCCM 2012 R2 SP1
    При попытке импортировать готовый Configuration Baseline получил ошибку:
    Configuration BaseLines (1)
    — Alert: Reboot Pending (Win 7 & above) [Invalid reference in content]
    Configuration Items (2)
    — Alert: Reboot Pending (Win 8 & above) [The CI contents a missing or invalid CI reference]

  2. Дмитрий:

    Спасибо. Импорт был выполнен без проблем.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s