Категории: Сети и серверы

Сисадмину: использование Powershell для управления SCCM

Мы все привыкли использовать Powershell для решения повседствевных задач автоматизации. Однако, использование Powershell для управления SCCM по прежнему остается непривиальной задачей.

Я сразу приведу несколько популярных примеров использования Powershell с WMI, чтобы выполнить типовые задачи администрирования CCM клиента:

Получить данные SCCM клиента: версию, сайт-код, MP сервер:

([wmiclass]"ROOT\ccm:SMS_Client").GetAssignedSite().sSiteCode

 ([wmi]"ROOT\ccm:SMS_Client=@").ClientVersion

 ([wmi]"ROOT\ccm:SMS_Authority.Name='SMS:PRI'").CurrentManagementPoint

Получить машинную политику (machine policy) с сервера, а также сбросить политику:

 ([wmiclass]'ROOT\ccm:SMS_Client').TriggerSchedule('{00000000-0000-0000-0000-000000000021}')

Получить список доступных advertisements  с SCCM сервера:

get-wmiobject -query "SELECT * FROM CCM_SoftwareDistribution" -namespace "root\ccm\policy\machine\actualconfig"

или фильтруя по самым необходиымы полям

get-wmiobject -query "SELECT * FROM CCM_SoftwareDistribution" -namespace "root\ccm\policy\machine\actualconfig" | select ADV_AdvertisementID, ADV_ExpirationTime, ADV_RepeatRunBehavior, PKG_Name, PKG_PackageID, PRG_CommandLine, PKG_SourceVersion, PRG_ProgramID

Также приведу несколько строк кода, которые могут быть полезны для администрирования самого SCCM сервера.

Вот этим простейшим кодом вы можете получть пакетов, дистрибуция которых выполнилась не успешно на опредленном DP сервере (сайт-код положим CEN):

Import-Module "$($ENV:SMS_ADMIN_UI_PATH)\..\ConfigurationManager.psd1" # Import the ConfigurationManager.psd1 module 
$SiteCode = "CEN"
$SitePath = "CEN:"

$primary_server = "prim_srv"
$DP = Read-Host "Enter DP FQDN"
$query = Get-WmiObject –NameSpace Root\SMS\Site_$SiteCode –Class SMS_DistributionDPStatus -ComputerName $primary_server -Filter "Name='$DP'" | where MessageState -NE '1'| Select PackageID, MessageID, MessageState, LastUpdateDate, ObjectTypeID

Удалить контент определенного пакета со всех DP севреров:

Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process
if((Get-Module ConfigurationManager) -eq $null) {
    Import-Module "$($ENV:SMS_ADMIN_UI_PATH)\..\ConfigurationManager.psd1"
}
# Set the current location to be the site code.
Set-Location "CEN:\"
    $date = Get-Date
    $log = "c:\temp\remove_cmcontent_all_dp.txt"
    "" | Out-File $log -Append
    "==== $date ==== " | Out-File $log -Append
$pkg = Read-Host "Enter PackageID"
$query = Get-WmiObject –NameSpace Root\SMS\Site_CEN –Class SMS_DistributionDPStatus -ComputerName PRIM_SRV –Filter "PackageID='$pkg'" | Select Name, ObjectTypeID

$ObjType = $query.ObjectTypeID
$dplist = $query.Name

if ($ObjType -eq "2") {
"Package Type is Regular package"
    try
    {
    foreach ($DPname in $dplist)
    {
        Write-host "Working on package $pkg --> $DPname" -ForegroundColor Yellow
        "Working on package $pkg --> $DPname">>$log
        Remove-CMContentDistribution  -DistributionPointName $DPname -Force -PackageId $pkg -ErrorAction Continue
        Write-host "Completed the package $pkg Removal from $DPname" -ForegroundColor green
        "Completed the package $pkg Removal from $DPname">>$log
    }
}
    catch
    {
            #Catch the exception here
            Write-host "-Exeception error on $DPname. Check logFile more details" -ForegroundColor Red
            #Write the server name to $log
            "$pkg has thrown asn error $($_.exception)" >> $log
    }
}

if ($ObjType -eq "18") {
"Package Type is OS Image"
    try
    {
    foreach ($DPname in $dplist)
    {
        Write-host "Working on package $pkg --> $DPname" -ForegroundColor Yellow
        "Working on package $pkg --> $DPname">>$log
        Remove-CMContentDistribution  -DistributionPointName $DPname -Force -OperatingSystemImageId $pkg -ErrorAction Continue
        Write-host "Completed the package $pkg Removal from $DPname" -ForegroundColor green
        "Completed the package $pkg Removal from $DPname">>$log
    }
}
    catch
    {
            #Catch the exception here
            Write-host "-Exeception error on $DPname. Check logFile more details" -ForegroundColor Red
            #Write the server name to $log
            "$pkg has thrown asn error $($_.exception)" >> $log
    }
}

if ($ObjType -eq "19") {
"Package Type is Boot Image"
    try
    {
    foreach ($DPname in $dplist)
    {
        Write-host "Working on package $pkg --> $DPname" -ForegroundColor Yellow
        "Working on package $pkg --> $DPname">>$log
        Remove-CMContentDistribution  -DistributionPointName $DPname -Force -BootImageId $pkg -ErrorAction Continue
        Write-host "Completed the package $pkg Removal from $DPname" -ForegroundColor green
        "Completed the package $pkg Removal from $DPname">>$log
    }
}
    catch
    {
            #Catch the exception here
            Write-host "-Exeception error on $DPname. Check logFile more details" -ForegroundColor Red
            #Write the server name to $log
            "$pkg has thrown asn error $($_.exception)" >> $log
    }
}
if ($ObjType -eq "14") {
"Package Type is OS Upgrade Package"
    try
    {
    foreach ($DPname in $dplist)
    {
        Write-host "Working on package $pkg --> $DPname" -ForegroundColor Yellow
        "Working on package $pkg --> $DPname">>$log
        Remove-CMContentDistribution  -DistributionPointName $DPname -Force -OperatingSystemInstallerId $pkg -ErrorAction Continue
        Write-host "Completed the package $pkg Removal from $DPname" -ForegroundColor green
        "Completed the package $pkg Removal from $DPname">>$log
    }
}
    catch
    {
            #Catch the exception here
            Write-host "-Exeception error on $DPname. Check logFile more details" -ForegroundColor Red
            #Write the server name to $log
            "$pkg has thrown asn error $($_.exception)" >> $log
    }
}
if ($ObjType -eq "23") {
"Package Type is Driver Package"
    try
    {
    foreach ($DPname in $dplist)
    {
        Write-host "Working on package $pkg --> $DPname" -ForegroundColor Yellow
        "Working on package $pkg --> $DPname">>$log
        Remove-CMContentDistribution  -DistributionPointName $DPname -Force -DriverPackageId $pkg -ErrorAction Continue
        Write-host "Completed the package $pkg Removal from $DPname" -ForegroundColor green
        "Completed the package $pkg Removal from $DPname">>$log
    }
}
    catch
    {
            #Catch the exception here
            Write-host "-Exeception error on $DPname. Check logFile more details" -ForegroundColor Red
            #Write the server name to $log
            "$pkg has thrown an error $($_.exception)" >> $log
    }
}

Примеров использования Powershell для управления SCCM серверами и клиентом достаточно много, но все они основываются на использовании классов SMS, зарегистрированных при установке SCCM сервера, и WMI.

[Посещений: 631, из них сегодня: 1]

Свежие посты

Расширение Wi-Fi сети на примере Mikrotik

Существует несколько способов расширить зону покрытия Wi-Fi сетей: использовать усилители Wi-Fi сигнала (репитеры), настроить WDS…

22 июля 2025

Замена аккумуляторов в ноутбуках

Заменять аккумулятор в ноутбуках необходимо, когда он перестает удерживать заряд достаточное время или же когда…

16 июля 2025

Проблема с обнаружением Wi-Fi сетей Mikrotik

Проблема: в роутере Mikrotik настроены Wi-Fi 6 сети на частоте 2.4 и 5 ГГц, они…

14 июля 2025

Апгрейд и замена SSD диска в MacBook: тонкости

Апгрейд и замена диска в Макбук практически всегда возможны, но в зависимости от поколения ноутбука…

11 июля 2025

Увеличение памяти компьютера: как выбрать китайскую память

Апгрейд памяти в компьютере дело не такое уж и сложное: выбрать совместимую планку и установить…

11 июля 2025

Как проапгрейдить WiFi и Bluetooth в ноутбуке: полное руководство

В этой статье мы озадачились апгрейдом Wi-Fi и Bluetooth в ноутбуке. Казалось бы, процедура не…

10 июля 2025