Позвольте мне попытаться объяснить мою проблему. У меня оффлайн система (несколько серверов виртуальных и физических), которые предоставляются с обновлениями через SCCM. Мы регулярно получаем обновления от вышестоящего отдела. Контент копируется с помощью robocopy, а метаданные импортируются с помощью WSUSUTIL.exe
. Проблема в том, что контент уменьшается с помощью (предположительно) сценария отделом, поэтому у нас больше метаданных, чем фактических файлов. Это приводит к множеству проблем при попытке загрузить группу обновлений программного обеспечения. Нам предоставляется руководство для фильтрации обновлений, которые не включены, но это трудоемкий и не всегда надежный способ сделать это.
Я не знаю, есть ли технические или организационные трудности, которые привели к все так, как есть, но я боюсь, что не буду это менять.
Однако я придумал, как автоматически просто получать все обновления, которые у меня есть, в виде файла.
$list = [System.Collections.ArrayList] @()
$Finallist = [System.Collections.ArrayList] @()
net use Z: \\<WSUSServer_Content> /persistent:no
Function Select-FolderDialog
{
param([string]$Description="Select Folder",[string]$RootFolder="Desktop")
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") |
Out-Null
$objForm = New-Object System.Windows.Forms.FolderBrowserDialog
$objForm.Rootfolder = $RootFolder
$objForm.Description = $Description
$Show = $objForm.ShowDialog()
If ($Show -eq "OK")
{
Return $objForm.SelectedPath
}
Else
{
Write-Error "Operation cancelled by user."
}
}
$Folder = Select-FolderDialog
$updates1 = get-childitem -path $folder -file -r
$updates = $Updates1.name
[void][reflection.assembly]::loadwithpartialname("Microsoft.Updateservices.administration")
$updatescope = New-Object Microsoft.UpdateServices.Administration.UpdateScope
$updatescope.FromArrivalDate = [datetime]"12/31/2018"
$Getupdate = (get-wsusserver).getupdates($updatescope)
foreach ($Update in $Getupdate)
{
$cab = $update.getinstallableitems().files.fileuri.segments | select-object -last 1
foreach ($item in $updates) {if ($item -eq $cab) {$list = $list + $Update.id.updateid} }
}
import-module 'd:\"SCCMServer"\ConfigurationManager.psd1'
cd S01:
$Softwareupdates = get-cmsoftwareupdate -datepostedmin "31.12.2018"
foreach ($Softwareupdate in $Softwareupdates) {
Unique=Softwareupdate.CI_UniqueID
foreach ($li in $list){
if ($li -eq $Unique) {$Finallist = $Finallist + $Softwareupdate.CI_ID}
}
}
New-CMSoftwareUpdateGroup -name "Test" -UpdateId $Finallist
Идея в том, что я собираю все имена файлов содержимого, которое у меня есть, запускают их на сервере WSUS, поэтому я могу определить Unique_ID. Затем я запускаю Unique_ID для SCCM, чтобы получить идентификаторы, с помощью которых я могу создать группу обновления программного обеспечения. Пока что теория.
Если я запускаю скрипт, я получаю около 800 файлов обновления. В результате получается около 250 идентификаторов Unique_ID, что дает около 35 идентификаторов для SCCM. Когда я попытаюсь загрузить их, у меня возникнет ошибка загрузки.
Если моя логика верна, этого не должно было случиться, верно?
Моя логика верна? или это было плохое кодирование, поскольку я не специалист по PowerShell?
Спасибо за ваше мнение и извините за беспорядочное форматирование кода, а также за мой плохой английский.
Хорошего дня.
Во-первых, если вы используете SCCM для развертывания обновлений программного обеспечения, вам никогда не придется копировать файлы обновлений из WSUS, поскольку SCCM автоматически управляет файлами обновлений и сохраняет их в точке распространения. . Все, что вам нужно сделать, это добавить точку распространения для места, где вы хотите распространять. Я бы порекомендовал вам классифицировать обновления на основе ежемесячных / квартальных / накопительных. Это упростило бы вашу жизнь фильтрация обновлений. То, как SCCM ссылается на обновления в своей базе данных, отличается от WSUS. Как предлагает DavidW, вышестоящий отдел должен попытаться найти новый рабочий процесс и сделать его более простым и легким в развертывании и управлении.