Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Наборы обновлений для Windows XP/2003/Windows 7 (http://forum.oszone.net/forumdisplay.php?f=62)
-   -   Updates4TargatePC|Выборка обновлений из образов безопасности по списку Windows Update (http://forum.oszone.net/showthread.php?t=184598)

Admiral 03-09-2010 22:25 1488156

Updates4TargatePC|Выборка обновлений из образов безопасности по списку Windows Update
 
Салют!
Наверняка многие знают про наборы обновлений в 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, видится именно этот.


Время: 01:12.

Время: 01:12.
© OSzone.net 2001-