SCCM; PowerShell; Удаление ревизий приложений
Небольшой пример как удалить все ревизии приложений, кроме последней, из конкретной папки.
Ребята из PatchMyPC пофиксили баг по нашему обращению, очень быстро. Но за время пока мы это заметили к каждому приложению создалось до ~ 100 ревизий. Пример как можно удалить все ревизии всех приложений из конкретной папки:
Import-Module "$($ENV:SMS_ADMIN_UI_PATH)\..\ConfigurationManager.psd1" -Verbose:$false
$SiteCode = Get-PSDrive -PSProvider CMSITE
Set-Location "$($SiteCode.Name):\"
$Apps = Invoke-CMWmiQuery @"
SELECT *
FROM SMS_ApplicationLatest AS app
WHERE app.ObjectPath = '/PatchMyPc'
"@
Write-Host "Apps Count = $($Apps.Count)`n"
foreach($app in $apps) { ## $app = $apps[0]
Write-Host "Application = $($app.LocalizedDisplayName)"
$AppRevision = Get-CMApplicationRevisionHistory -InputObject $app | Where-Object { $_.IsLatest -eq $false}
Write-Host "... revision count = $($AppRevision.Count)" -NoNewline
if ($AppRevision.Count) {
Write-Host ", removing... "
$AppRevision | Remove-CMApplicationRevisionHistory -Force -ErrorAction Stop
Write-Host "... done`n"
} else {
Write-Host ", skip... "
}
Write-Host ''
}
Работает крайне медленно, так что запускайте на сервере :)
SCCM; Base Security; Или что можно потерять если нарушать рекомендации
Сколько пишут рекомендаций про недопустимость использования учётных записей (далее УЗ) доменного админа в сервисных УЗ ConfigMgr, а все равно через раз кто-то попадается на этом. Может ленятся или любимое — «знал, но забыл…», или — «да и так сойдёт…».
Видимо пространные рассуждения о рисках без демонстрации не сильно пугают, так что попробую на примерах показать, что, откуда и как можно «выловить» в ConfigMgr.
Тег «Далее»PowerShell; VS Code; snippet for SCCM;

Сниппет по подгрузке CCM-командлет в VS Code.
Нажимаем F1, вводим «User snippet», выбираем PowerShell, добавляем в открывшийся конфиг:
"Import-Module ..\ConfigurationManager.psd1": {
"prefix": "ccm",
"body": [
"Import-Module \"\\$(\\$ENV:SMS_ADMIN_UI_PATH)\\..\\ConfigurationManager.psd1\"",
"\\$SiteCode = Get-PSDrive -PSProvider CMSITE",
"Set-Location \"\\$(\\$SiteCode.Name):\\\""
],
"description": "Import-Module ..\ConfigurationManager.psd1"
}
SCCM; SQL; Checklist для переноса SQL-баз 2012 на 2017
Это не полноценный How To по переносу баз SCCM, WSUS на новый сервер, это Checklist в OneNote, с шагами и ссылками на документацию, который я обычно составляю в лабораторных условиях, чтобы в боевых он проходил быстрее и с меньшими проблемами:
Move SQL DB from 2012 to 2017.one
Happy migration
SCCM; Approve Application via email на русском языке и Status Filter Rule
С версии SCCM 1810, появилась возможность использовать утверждение запроса приложения через e-mail. Если необходимо получать уведомление на языке отличным от Английского, можно изменить язык в подписке на Уведомления (Subscription) в мониторинг: \Monitoring\Overview\Alerts\Subscriptions.
Автоматизируем этот процесс, повесив Status Filter Rule на Status Message ID: 30240
SCCM; WSUS; Third-Party Updates; Удаляем устаревший контент
Если используете обновления из каталогов обновления стороннего программного обеспечения в SUP, не забывайте подчищать устаревший и уже не используемый контент. Если вы счастливый обладатель PatchMyPC Publishing Service, то это его встроенная возможность, надо только включить ключик в реестре.
Ну а для автоматизации процесса, в скрипт из «The complete guide to Microsoft WSUS and Configuration Manager SUP maintenance«, можно добавить еще одну операцию.
$VerbosePreference = 'Continue' If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(` [Security.Principal.WindowsBuiltInRole] "Administrator")) { Write-Warning “You do not have Administrator rights to run this script!`nPlease re-run this script as an Administrator!” Break } function Get-CurrentDiskSpace ($Drive = $env:SystemDrive) { $Drive = $Drive.Substring(0, 2) $disk = Get-WmiObject Win32_LogicalDisk -Filter "DeviceID='$Drive'" return " - on $($disk.DeviceID)" -f (Get-Date), [uint64]($disk.FreeSpace / 1MB), [uint64]($disk.Size / 1MB) } Write-Verbose "Remove Orphaned WSUS Content:" $ContentDir = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Update Services\Server\Setup" -Name ContentDir -ErrorAction Stop).ContentDir $TargetDir = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Update Services\Server\Setup" -Name TargetDir -ErrorAction Stop).TargetDir Get-CurrentDiskSpace (Split-Path $ContentDir) | Write-Verbose $WsusUtilPath = Join-Path $TargetDir "Tools\WsusUtil.exe" if ( (Test-Path $WsusUtilPath) -and $ContentDir) { Write-Verbose "'$WsusUtilPath' found.`n Starting..." $Out = . $WsusUtilPath "listunreferencedpackagefolders" $Orphaned = $Out | Where-Object { $_.StartsWith($ContentDir) -and (Test-Path $_) } Write-Verbose "Orphaned:`n$($Orphaned | Out-String)" if ($Orphaned.Count) { Write-Verbose "Removing..." Remove-Item $Orphaned -force -recurse -ErrorAction Continue } } else { Write-Error "'$WsusUtilPath' not found" } Get-CurrentDiskSpace (Split-Path $ContentDir) | Write-Verbose
Выполнять надо на сервере WSUS с повышением прав.
Почитать:
- The complete guide to Microsoft WSUS and Configuration Manager SUP maintenance: https://support.microsoft.com/en-us/help/4490644/complete-guide-to-microsoft-wsus-and-configuration-manager-sup-maint;
- Windows Server Update Services Best Practices: https://support.microsoft.com/help/4490414/windows-server-update-services-best-practices;
- Управление обновлениями через ConfigMgr – часть 1, часть 2, часть 3
- The spDeleteUpdate stored procedure runs slowly
SCCM; Коллекция устройств с данными о приложении из Application;
Коллекция устройств с установленным приложением в которой Name, Publisher и Software version подставим из Application.
select SMS_R_SYSTEM.ResourceID,SMS_R_SYSTEM.ResourceType,SMS_R_SYSTEM.Name,SMS_R_SYSTEM.SMSUniqueIdentifier,SMS_R_SYSTEM.ResourceDomainORWorkgroup,SMS_R_SYSTEM.Client from SMS_R_System inner join SMS_G_System_INSTALLED_SOFTWARE on SMS_G_System_INSTALLED_SOFTWARE.ResourceID = SMS_R_System.ResourceId inner join SMS_ApplicationLatest on SMS_ApplicationLatest.Manufacturer = SMS_G_System_INSTALLED_SOFTWARE.Publisher and SMS_ApplicationLatest.SoftwareVersion = SMS_G_System_INSTALLED_SOFTWARE.ProductVersion and SMS_ApplicationLatest.LocalizedDisplayName = SMS_G_System_INSTALLED_SOFTWARE.ProductName where SMS_ApplicationLatest.ModelName = 'ScopeId_844C9ED5-F96B-4CEF-AD14-23ED6EF7E0F9/Application_da479ffe-9a82-4708-b9c4-50a4aa6ebeb4'
SCCM; SUG; RCT; & SuExt; для работы с обновлениями; Часть 3
Поработал ConsoleBuilder-ом и объединил два своих проекта по управлению обновлениями в CM, RCT и «SuExt» или Software Update Console Extension, как я его назвал. SuExt — то чем я больше всего пользуюсь в микроменеджменте обновлений %)
Как это выглядит в консоли можно оценить по скриншотам на GitHab-е.
Так как консоль не поддерживает аддоны как добавления к уже существующим «Нодам» и «Табам», и в каждой версии консоли xml-ки консоли разные, поддерживается только те версии консоли, билды которых есть в папке «Xml-SuExtension» (на текущий момент — 1906/1910). Если вам понадобиться под другую – пишите мне в телеграмм-чатик https://t.me/configmgr или твиттер https://twitter.com/sekorotkov.
… и не забывайте делать бэкап папки консоли.
Happy updates! :)
SCCM; «Community, help me please» или как получить грамотную помощь от комьюнити
- Лирическое отступление
- Куда обращаться
- Что написать, что приложить
- Логи или как собрать информацию о проблеме
- Как скрыть чувствительную информацию
Лирическое отступление
Большинство инцидентов возникающие при первоначальном знакомстве с продуктом типа ConfigMgr удается идентифицировать по общему описанию. На эту тему есть несколько мемов типа — «Это всегда DNS» или «Это всегда «Границы». Проблемы чуть сложнее потребуют уже понимания как работает система, как она настроена, что происходило до, во время и после возникновения инцидента. Эффективность и скорость решения напрямую зависит от правильной постановки вопроса, его полноты и точности. Попытаюсь набросать тезисно общие подходы при решении вопросов с ConfigMgr, на что обязательно обратить внимания и зачем.
SCCM; SUG; Коллекция устройств, которые “требуют” обновлений из SUG;
И так, в очередной раз формулируется задача – “Дайте устройства на которых не установлены обновления KBxxxxxxx”, например, из последнего – “CVE-2019-0708”. Мы бережно собираем SUG (По-моему, надо добавить в мой RCT функцию создание SUG по CVE#, с портала https://portal.msrc.microsoft.com), видим всякие статусы, и точно прикидываем, что отчёты нам уже пригодятся в ближайшее время (а отчёты по обновлениям в SCCM хороши). Но можно просто создать коллекцию устройств, которые хотят (Required) поставить обновления. Коллекция по обновлениям из SUG:
SELECT SMS_R_SYSTEM.ResourceID, SMS_R_SYSTEM.ResourceType, SMS_R_SYSTEM.Name, SMS_R_SYSTEM.SMSUniqueIdentifier, SMS_R_SYSTEM.ResourceDomainORWorkgroup, SMS_R_SYSTEM.Client FROM SMS_R_System JOIN SMS_UpdateComplianceStatus ON SMS_R_System.ResourceID = SMS_UpdateComplianceStatus.MachineID AND SMS_UpdateComplianceStatus.Status = 2 JOIN SMS_CIRelation ON SMS_CIRelation.FromCIID = 18779769 AND SMS_UpdateComplianceStatus.CI_ID=SMS_CIRelation.ToCIID AND SMS_CIRelation.RelationType=1
где “18779769” — CI_ID SUG, в консоли это называется “Сonfig Item ID”:
Недавние комментарии