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 ''
}

Работает крайне медленно, так что запускайте на сервере :)

Рубрики:PowerShell, SCCM, Troubleshooting

SCCM; Base Security; Или что можно потерять если нарушать рекомендации

Сколько пишут рекомендаций про недопустимость использования учётных записей (далее УЗ) доменного админа в сервисных УЗ ConfigMgr, а все равно через раз кто-то попадается на этом. Может ленятся или любимое — «знал, но забыл…», или — «да и так сойдёт…».

Видимо пространные рассуждения о рисках без демонстрации не сильно пугают, так что попробую на примерах показать, что, откуда и как можно «выловить» в ConfigMgr.

Тег «Далее»
Рубрики:SCCM, Security, Tricks

PowerShell; VS Code; snippet for SCCM;

VS Code SCCM-snippet

Сниппет по подгрузке 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"
}
Рубрики:PowerShell, SCCM, Tricks

SCCM; SQL; Checklist для переноса SQL-баз 2012 на 2017

Это не полноценный How To по переносу баз SCCM, WSUS на новый сервер, это Checklist в OneNote, с шагами и ссылками на документацию, который я обычно составляю в лабораторных условиях, чтобы в боевых он проходил быстрее и с меньшими проблемами:

OneNoteIcon Move SQL DB from 2012 to 2017.one

Happy migration

Рубрики:SCCM, SQL, SSRS

SCCM; Approve Application via email на русском языке и Status Filter Rule

С версии SCCM 1810, появилась возможность использовать утверждение запроса приложения через e-mail. Если необходимо получать уведомление на языке отличным от Английского, можно изменить язык в подписке на Уведомления (Subscription) в мониторинг: \Monitoring\Overview\Alerts\Subscriptions.

image

Автоматизируем этот процесс, повесив Status Filter Rule на Status Message ID: 30240

Тег «Далее»

Рубрики:SCCM, Tricks

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 с повышением прав.

Почитать:

Рубрики:PowerShell, SCCM

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, Tricks

SCCM; SUG; RCT; & SuExt; для работы с обновлениями; Часть 3

image

Поработал 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! :)

Рубрики:RCT, SCCM

SCCM; «Community, help me please» или как получить грамотную помощь от комьюнити

Лирическое отступление

Большинство инцидентов возникающие при первоначальном знакомстве с продуктом типа ConfigMgr удается идентифицировать по общему описанию. На эту тему есть несколько мемов типа — «Это всегда DNS» или «Это всегда «Границы». Проблемы чуть сложнее потребуют уже понимания как работает система, как она настроена, что происходило до, во время и после возникновения инцидента. Эффективность и скорость решения напрямую зависит от правильной постановки вопроса, его полноты и точности. Попытаюсь набросать тезисно общие подходы при решении вопросов с ConfigMgr, на что обязательно обратить внимания и зачем.

Тег «Далее»

Рубрики:SCCM, Troubleshooting

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”:

Тег «Далее»

Рубрики:SCCM, Updates