Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Наборы обновлений для Windows XP/2003/Windows 7 » Наборы - Updates4TargatePC|Выборка обновлений из образов безопасности по списку Windows Update

Ответить
Настройки темы
Наборы - Updates4TargatePC|Выборка обновлений из образов безопасности по списку Windows Update

Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


Салют!
Наверняка многие знают про наборы обновлений в ISO образах. Всё ставить с него не имеет смысла. Лучше предварительно запускать Windows Update, дабы знать какие именно обновления требуются для целевой системы.
Выборку с образа, по рапорту Windows Update, можно производить не вручную, а например с помощью
небольшой консольной программы на Microsoft .NET
Код: Выделить весь код
@echo off
SET FileName=Updates4TargatePC

IF EXIST %FileName%.exe goto RunEXE
IF EXIST %FileName%.vb goto setNetVersion

REM Start VbCode
echo Imports System' >%FileName%.vb
echo Imports System.IO' >>%FileName%.vb
echo Imports System.Collections' >>%FileName%.vb
echo Imports Microsoft.VisualBasic' >>%FileName%.vb
echo ' >>%FileName%.vb
echo Class Updates4TargatePC 'Make a list with paths to Updates for targate PC' >>%FileName%.vb
echo     Shared WinVer As String' >>%FileName%.vb
echo     Shared Extention As String' >>%FileName%.vb
echo     Shared Platform As String' >>%FileName%.vb
echo     Shared Lang As String' >>%FileName%.vb
echo     Shared KbList As New ArrayList()' >>%FileName%.vb
echo     Shared KbListCounts As New ArrayList()' >>%FileName%.vb
echo ' >>%FileName%.vb
echo     Shared Sub Main(ByVal CmdArgs() As String)' >>%FileName%.vb
echo         If CmdArgs.Length ^< 1 Then' >>%FileName%.vb
echo             Console.WriteLine(vbNewLine ^& "Use next (for example):" ^& vbNewLine ^& " ?:\<FolderWithUpdates>\ win2k|winxp|vista|win2k8|seven|win2k8r2|<Your Os Name> x86|x64 ENU|RUS|NEU ?:\File\Consist\Windows_Update\Raport.txt")' >>%FileName%.vb
echo             Return' >>%FileName%.vb
echo         End If' >>%FileName%.vb
echo         'Windows-KB913086-201004.iso ^>=    'Windows-KB913086-201003.iso ^<=' >>%FileName%.vb
echo         If CmdArgs.Length ^> 1 Then' >>%FileName%.vb
echo             Select Case CmdArgs(1)' >>%FileName%.vb
echo                 Case "win2k"' >>%FileName%.vb
echo                     WinVer = "Windows2000"          '"WINDOWS2000"' >>%FileName%.vb
echo                 Case "winxp"' >>%FileName%.vb
echo                     WinVer = "WindowsXP"            '"WINDOWSXP"' >>%FileName%.vb
echo                 Case "win2k3"' >>%FileName%.vb
echo                     WinVer = "WindowsServer2003"    '"WINDOWSSERVER2003"' >>%FileName%.vb
echo                 Case "vista"' >>%FileName%.vb
echo                     WinVer = "WindowsVista"         '"WINDOWSVISTA"' >>%FileName%.vb
echo                 Case "win2k8"' >>%FileName%.vb
echo                     WinVer = "WindowsServer2008"    '"WINDOWSSERVER2008"' >>%FileName%.vb
echo                 Case "seven"' >>%FileName%.vb
echo                     WinVer = "Windows7"             '"WINDOWS7"' >>%FileName%.vb
echo                 Case "win2k8r2"' >>%FileName%.vb
echo                     WinVer = "WindowsServer2008R2"  '"WINDOWSSERVER2008R2"' >>%FileName%.vb
echo                 Case Else' >>%FileName%.vb
echo                     WinVer = CmdArgs(1)' >>%FileName%.vb
echo             End Select' >>%FileName%.vb
echo             If (CmdArgs(1) = "win2k" Or CmdArgs(1) = "winxp" Or CmdArgs(1) = "win2k3") Then' >>%FileName%.vb
echo                 Extention = ".EXE"' >>%FileName%.vb
echo             Else 'vista win2k8 seven win2k8R2' >>%FileName%.vb
echo                 Extention = ".MSU"' >>%FileName%.vb
echo             End If' >>%FileName%.vb
echo         End If' >>%FileName%.vb
echo ' >>%FileName%.vb
echo         If CmdArgs.Length ^> 2 Then' >>%FileName%.vb
echo             Platform = CmdArgs(2) '"x86" '"X86"' >>%FileName%.vb
echo         Else' >>%FileName%.vb
echo             Platform = "x64"' >>%FileName%.vb
echo         End If' >>%FileName%.vb
echo ' >>%FileName%.vb
echo         If Extention ^<^> ".MSU" And CmdArgs.Length ^> 3 Then' >>%FileName%.vb
echo             Lang = CmdArgs(3)' >>%FileName%.vb
echo         ElseIf Extention = ".MSU" Then' >>%FileName%.vb
echo             Lang = "NEU"' >>%FileName%.vb
echo         ElseIf CmdArgs.Length ^< 4 Then' >>%FileName%.vb
echo             Lang = "ENU"' >>%FileName%.vb
echo         End If' >>%FileName%.vb
echo ' >>%FileName%.vb
echo         If CmdArgs.Length ^> 4 Then' >>%FileName%.vb
echo             ListFileWithKB(CmdArgs(4))' >>%FileName%.vb
echo         End If' >>%FileName%.vb
echo         DirFiles(CmdArgs(0))' >>%FileName%.vb
echo         If CmdArgs.Length ^> 5 Then' >>%FileName%.vb
echo             For i As Integer = 0 To Math.Min(KbList.Count, KbListCounts.Count) - 1' >>%FileName%.vb
echo                 If KbListCounts(i) = 0 Then Console.WriteLine("::Rem: KB{0} not found in current place with updates", KbList(i))' >>%FileName%.vb
echo             Next i' >>%FileName%.vb
echo         End If' >>%FileName%.vb
echo     End Sub' >>%FileName%.vb
echo ' >>%FileName%.vb
echo     Shared Sub DirFiles(ByVal FilePath As String)' >>%FileName%.vb
echo         Dim di As New IO.DirectoryInfo(FilePath)' >>%FileName%.vb
echo ' >>%FileName%.vb
echo         Dim files As IO.FileInfo() = di.GetFiles()' >>%FileName%.vb
echo         For Each curFile As IO.FileInfo In files' >>%FileName%.vb
echo             Dim FileFullName As String = curFile.FullName' >>%FileName%.vb
echo             If WinVer = Nothing Then' >>%FileName%.vb
echo                 Console.WriteLine(FileFullName)' >>%FileName%.vb
echo             ElseIf (InStr(FileFullName, WinVer) ^> 0 Or InStr(FileFullName, ToUp(WinVer)) ^> 0) And curFile.Extension = Extention And (InStr(FileFullName, Platform) ^> 0 Or InStr(FileFullName, ToUp(Platform)) ^> 0) And (InStr(FileFullName, Lang) ^> 0 Or InStr(FileFullName, ToUp(Lang)) ^> 0) Then' >>%FileName%.vb
echo                 If KbList.Count = 0 Then' >>%FileName%.vb
echo                     Console.WriteLine(FileFullName)' >>%FileName%.vb
echo                 Else' >>%FileName%.vb
echo                     For i As Integer = 0 To KbList.Count - 1' >>%FileName%.vb
echo                         If InStr(FileFullName, CType(KbList(i), String)) Then' >>%FileName%.vb
echo                             'Console.WriteLine(KbList(i))' >>%FileName%.vb
echo                             Console.WriteLine(FileFullName)' >>%FileName%.vb
echo                             KbListCounts(i) += 1' >>%FileName%.vb
echo                         End If' >>%FileName%.vb
echo                     Next i' >>%FileName%.vb
echo                 End If' >>%FileName%.vb
echo             End If' >>%FileName%.vb
echo         Next' >>%FileName%.vb
echo ' >>%FileName%.vb
echo         Dim directories As IO.DirectoryInfo() = di.GetDirectories()' >>%FileName%.vb
echo         For Each curDir As IO.DirectoryInfo In directories' >>%FileName%.vb
echo             DirFiles(curDir.FullName.ToString)' >>%FileName%.vb
echo         Next' >>%FileName%.vb
echo     End Sub' >>%FileName%.vb
echo ' >>%FileName%.vb
echo     Shared Sub ListFileWithKB(ByVal FileWithKBList As String)' >>%FileName%.vb
echo         If FileWithKBList = Nothing Then' >>%FileName%.vb
echo             Return' >>%FileName%.vb
echo         End If' >>%FileName%.vb
echo         Dim r As IO.StreamReader = New IO.StreamReader(FileWithKBList, Text.Encoding.Default)' >>%FileName%.vb
echo         Dim Buff() As Char = r.ReadToEnd' >>%FileName%.vb
echo         r.Close()' >>%FileName%.vb
echo         For i As Integer = 2 To Buff.Length - 1' >>%FileName%.vb
echo             If (Buff(i - 2) = "K" And Buff(i - 1) = "B" And Buff(i) ^<^> " ") Then' >>%FileName%.vb
echo                 Dim KB_Update As String = vbNullString '= "KB"' >>%FileName%.vb
echo                 While Char.IsDigit(Buff(i)) And i ^< Buff.Length - 1' >>%FileName%.vb
echo                     KB_Update = KB_Update ^& Buff(i)' >>%FileName%.vb
echo                     i += 1' >>%FileName%.vb
echo                 End While' >>%FileName%.vb
echo                 If (KB_Update ^<^> Nothing) And Not (KbList.Contains(KB_Update)) Then' >>%FileName%.vb
echo                     'Console.WriteLine(KB_Update)' >>%FileName%.vb
echo                     KbList.Add(KB_Update)' >>%FileName%.vb
echo                     KbListCounts.Add(0)' >>%FileName%.vb
echo                 End If' >>%FileName%.vb
echo             End If' >>%FileName%.vb
echo         Next i' >>%FileName%.vb
echo     End Sub' >>%FileName%.vb
echo ' >>%FileName%.vb
echo     Shared Function ToUp(ByVal str As String) As String' >>%FileName%.vb
echo         Dim _str As String = Nothing' >>%FileName%.vb
echo         For Each ch As Char In str' >>%FileName%.vb
echo             _str = _str ^& Char.ToUpper(ch)' >>%FileName%.vb
echo         Next ch' >>%FileName%.vb
echo         Return _str' >>%FileName%.vb
echo     End Function' >>%FileName%.vb
echo End Class' >>%FileName%.vb
echo ' >>%FileName%.vb
REM End VbCode

:setNetVersion
if exist %SYSTEMROOT%\Microsoft.NET\Framework\v4.0.30319\vbc.exe goto net40
if exist %SYSTEMROOT%\Microsoft.NET\Framework\v3.5\vbc.exe goto net35
if exist %SYSTEMROOT%\Microsoft.NET\Framework\v2.0.50727\vbc.exe goto net20
if exist %SYSTEMROOT%\Microsoft.NET\Framework\v1.1.4322\vbc.exe goto net11
if exist %SYSTEMROOT%\Microsoft.NET\Framework\v1.0.3705\vbc.exe goto net10

echo Error: .NET Framework 4.0, 3.5, 3.0, 2.0, 1.1 or 1.0 required.
echo.
goto end

:net10
set VBC_PATH=%SYSTEMROOT%\Microsoft.NET\Framework\v1.0.3705
goto compile

:net11
set VBC_PATH=%SYSTEMROOT%\Microsoft.NET\Framework\v1.1.4322
goto compile

:net20
set VBC_PATH=%SYSTEMROOT%\Microsoft.NET\Framework\v2.0.50727
goto compile

:net35
set VBC_PATH=%SYSTEMROOT%\Microsoft.NET\Framework\v3.5
goto compile

:net40
set VBC_PATH=%SYSTEMROOT%\Microsoft.NET\Framework\v4.0.30319
goto compile

:compile
%VBC_PATH%\vbc %FileName%.vb /target:exe

:RunEXE
%FileName%.exe

:end
В коде выше программа завёрнута в батник, и для её сборки данный код необходимо скопировать в блокнот, сохранить в файле с расширением .cmd или .bat, и запустить его на выполнение.
Через мгновение получится исполняющий файл, с которым можно работать в консоли следующим образом.
Код: Выделить весь код
Updates4TargatePC.exe I: - пролистать все файлы, аналогично dir /s
Updates4TargatePC.exe win2k - платформа и язык не заданы - будет использоваться x64 ENU. Вот только в данном случаи ничего не будет найдено. Windows 2000 не выходил в х64 варианте. Справедливости ради вариант win2k8r2 x86, с явным указанием платформы x86, по аналогичной причине тоже ничего не найдёт.
Updates4TargatePC.exe I: winxp x86  - язык явно не задан, будет использоваться ENU
Updates4TargatePC.exe I: vista x86 NEU raport.txt - идёт выборка по списку Windows Update
Updates4TargatePC.exe I: seven x86 NEU raport.txt ? – где ? любой символ хоть тот же знак вопроса, будет предоставлен отчёт о ненайденных обновлениях
Сам файл raport.txt получается путём копирования содержимого страницы Windows Update (в win2k, winxp, win2k3), а в Висте и выше из окна Центра обновления (как быть в Core версиях Win2k8(R2) не скажу. Да и .Net Frameworks, необходимого для работы программы, в Core может не быть.).

(копировать подробности -> сохранить в блокноте в файл -> указать путь к файлу четвёртым параметром Updates4TargatePC)

Все параметры, кроме первого (на не существование пути программа не проверяет) являются, опциональными. Однако выборка по списку будет работать только при указании всех параметров в чёткой последовательности:
  1. путь к папке с обновлениями
  2. префикс версии Виндовс (распознаются win2k|winxp|vista|win2k8|seven|win2k8r2 в нижних регистрах) или полностью имя папки с образа (например Windows7, WindowsEmbeddedStandard7 и т.д.)
  3. платформа (x86, x64, ia64)
  4. язык (для висты и выше данный параметр игнорируется, но если необходимо указать путь к файлу, параметр должен быть указан, например как NEU) для версий ранее Висты это может быть RUS, ENU и другой наличный в образе
  5. ну и конечно путь к файлу с рапортом
  6. последний параметр может быть абсолютно любым, если он указан будет сформирован список не найденных на образе обновлений

Образы нужно смонтировать отдельной программой например DAEMON Tools Lite или WinCDEmu, в примерах выше точка монтирования диск I:

После получения путей их можно скопировать в батник, выделив их в консоли.
Можно также не выделяя ничего в консоли, а сразу получить файл с путями, если после последнего параметра указать >"имя файла.bat". Перед запуском сформированного батника его необходимо подправить, добавить параметры файлам, для автоматизации установки обновлений:
  • для win2k/winxp/win2k3 -u -q –norestart
  • для vista/win2k8/seven/win2k8r2 /quiet /norestart
Будьте внимательны, на некоторых образах присутствуют обновления к IE. Убедитесь что оставляете путь именно к той версии IE, который есть в системе на данный момент. Например в августовском образе для системы xp в обновлении KB2183461 доступно три версии: для IE6, IE7, IE8.

P.S.
Помимо рапорта Windows Update подойдёт любой список обновлений. Например тот, что размешён в шапках тем форума по наборам обновлений a.k.a PreSP, к разным системам.

Процесс обновления посредством данных образов достаточно избыточен, если необходимо обновить всего один ПК.
Не подходит, если безопасность превыше всего - образы естественно выходят несколько позже, нежели сами заплатки, включенные в них.
В обоих случаях наиболее предпочитаемым остаётся Windows Update.
Однако для централизированного обновления нескольких ПК, при невозможности развёртывания специализированных средств от MS, видится именно этот.
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:25, 03-09-2010

 


Компьютерный форум OSzone.net » Автоматическая установка Windows » Наборы обновлений для Windows XP/2003/Windows 7 » Наборы - Updates4TargatePC|Выборка обновлений из образов безопасности по списку Windows Update

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - Сохранение обновлений Windows Update ozone Microsoft Windows 2000/XP 76 02-07-2011 23:08
Прочее - [решено] WS 2003 R2 проблемы сетью после наката Sp2 и обновлений безопасности RUVATA Сетевые технологии 11 03-09-2010 13:53
WS 2003 R2 проблемы после наката Sp2 и обновлений безопасности RUVATA Microsoft Windows NT/2000/2003 0 01-09-2010 16:05
Создание образов Windows kop4enyi Microsoft Windows 2000/XP 34 22-10-2006 20:03
[решено] При поиске обновлений на веб-узле Windows Update выдается ошику 0x80240030 lwolf Microsoft Windows 2000/XP 5 03-09-2006 23:27




 
Переход