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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Установка через GPO определённой KB (943729). WSUS нет. (http://forum.oszone.net/showthread.php?t=237572)

PIL123 29-06-2012 21:41 1943022

Установка через GPO определённой KB (943729). WSUS нет.
 
Доброго времени суток, коллеги.
Необходимо через GPO развернуть KB943729. WSUS в сети нет. В теории хотелось бы какой-нибудь скриптик, который бы запускался из GPO в startup-скрипте и проверял на наличие этого KB в системе. Если ОНО уже есть - ничего бы не делал дальше, а если его нет на каком-то компьютере - устанавливал бы эту KB'шку.

Или может кто подскажет какие-то другие варианты, как разворачивать в сети эту KB?

Iska 29-06-2012 23:26 1943083

1. Проверьте как определяется это KB, будучи установленным.

Так:
Код:

wmic.exe QFE WHERE "HotFixID='File 1' AND ServicePackInEffect = 'KB943729'"
определяется?

2. Приведите имена файлов отсюда: Information about new Group Policy preferences in Windows Server 2008 в зависимости от Вашего перечня ОС и языков.

PIL123 30-06-2012 16:33 1943378

1. Определяется так:



2. Это немного не понял - извините. В сети используются Windows XP, Vista, Windows Server 2003. Все 32-bit, все Русские.

Разворачивать этот KB через GPO я уже научился: стартап-скриптом с ключём /quiet. Для каждой ОС будет (в теории) свой WMI фильтр. Сейчас такой фильтр есть пока только для Windows XP. Вот бы ещё проверочку сделать, чтобы при каждой загрузке не устанавливать :-)

На самом деле, наверное, было бы классно иметь возможность обойтись без WMI фильров - только одним скриптом для всех. Чтобы скрипт сам проверял наличие и в случае отсутствия - сам ставил бы нужную KB в соответствии с ОС, платформой, языком :-) Но это я губу раскатал уже :-)

Iska 30-06-2012 17:48 1943408

Цитата:

Цитата Incognitus
возможность обойтись без WMI фильров - только одним скриптом для всех. Чтобы скрипт сам проверял наличие и в случае отсутствия - сам ставил бы нужную KB в соответствии с ОС, платформой, языком »

Ну, так, в общем-то, и планируется.

P.S. Зачем задаваться излишними платформами и языками, ежели:
Цитата:

Цитата Incognitus
В сети используются Windows XP, Vista, Windows Server 2003. Все 32-bit, все Русские. »

и только?

Iska 30-06-2012 19:08 1943441

Incognitus, вот, с учётом вышеизложенного Вами, примерный шаблон:
читать дальше »
Код:

Option Explicit

Dim objDictionary

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim collSWbemObjectSet
Dim objSWbemObjectEx


Set objDictionary = WScript.CreateObject("Scripting.Dictionary")

With objDictionary
        .Add "5.1.2600", "WindowsXP-KB943729-x86-RUS.exe"
        .Add "5.2.3790", "WindowsServer2003-KB943729-x86-RUS.exe"
        .Add "6.0.6000", "Windows6.0-KB943729-x86.msu"
        .Add "6.0.6001", "Windows6.0-KB943729-x86.msu"
        .Add "6.0.6002", "Windows6.0-KB943729-x86.msu"
End With


strComputer = "."

Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery( _
        "SELECT * FROM Win32_QuickFixEngineering WHERE HotFixID='File 1' AND ServicePackInEffect = 'KB943729'")

If collSWbemObjectSet.Count = 0 Then
        For Each objSWbemObjectEx In objSWbemServicesEx.InstancesOf("Win32_OperatingSystem")
                With objSWbemServicesEx.Get("Win32_Process")
                        If .Create("""\\Server\Share$\" & objDictionary.Item(objSWbemObjectEx.Version) & _
                                """ /passive /norestart /log:""\\Server\Logs$\KB2647516_" & WScript.CreateObject("WScript.Network").ComputerName & ".log""") = 0 Then
                               
                        Else
                                'Error
                        End If
                End With
               
                Exit For
        Next
End If

Set collSWbemObjectSet = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

objDictionary.RemoveAll
Set objDictionary      = Nothing

WScript.Quit 0


У компьютеров домена должен быть доступ на чтение к ресурсу «\\Server\Share$» и на запись — к ресурсу «\\Server\Logs$». Корректные имена файлов обновления подставьте сами. Скрипт задавать для исполнения с параметром «//b»:
Код:

wscript.exe //b "\\server\gpo…\Script.vbs"

PIL123 01-07-2012 11:24 1943728

Спасибо огромное! Скрипт офигенный, правда его работоспособность я ещё не проверил. Сейчас этим займусь. Подскажите, пожалуйста, если я буду использовать этот скрипт как стартап - аргумент "//b" надо указывать?



Ещё вопрос уже не относящийся к моей конкретной проблеме, но по Вашему скрипту: возможна его реализация с учётом платформы (x86, x64), языка (Rus, Eng), ОС (Windows XP, Vista, 7, Windows Server 2003, 2003 R2, 2008, 2008 R2 и т.д.)? "И т.д." - в том плане, что я с удовольствием подписался бы на обновления и актуализацию этого замечательного скрипта.

Ещё раз спасибо!

PIL123 01-07-2012 15:11 1943809

Что-то не захотел работать у меня скрипт. Для простоты отладки выполнял тестирование локально на новой Windows XP Eng 32-bit.

Код выглядит
так:

Код:

Option Explicit

Dim objDictionary

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim collSWbemObjectSet
Dim objSWbemObjectEx


Set objDictionary = WScript.CreateObject("Scripting.Dictionary")

With objDictionary
        .Add "5.1.2600", "WindowsXP-KB943729-x86-ENU.exe"
        .Add "5.2.3790", "WindowsServer2003-KB943729-x86-RUS.exe"
        .Add "6.0.6000", "Windows6.0-KB943729-x86.msu"
        .Add "6.0.6001", "Windows6.0-KB943729-x86.msu"
        .Add "6.0.6002", "Windows6.0-KB943729-x86.msu"
End With


strComputer = "."

Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery( _
        "SELECT * FROM Win32_QuickFixEngineering WHERE HotFixID='File 1' AND ServicePackInEffect = 'KB943729'")

If collSWbemObjectSet.Count = 0 Then
        For Each objSWbemObjectEx In objSWbemServicesEx.InstancesOf("Win32_OperatingSystem")
                With objSWbemServicesEx.Get("Win32_Process")
                        If .Create("""C:\KB\" & objDictionary.Item(objSWbemObjectEx.Version) & _
                                """ /passive /norestart /log:""C:\Logs" & WScript.CreateObject("WScript.Network").ComputerName & ".log""") = 0 Then
                               
                        Else
                                'Error
                        End If
                End With
               
                Exit For
        Next
End If

Set collSWbemObjectSet = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

objDictionary.RemoveAll
Set objDictionary      = Nothing

WScript.Quit 0



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



При этом лог выполнения запуска KB'шки упал в корень C:\, а не C:\Logs, куда должен был бы по идее и выглядит
так:

Код:

[LogsTESTCLIENTXP2.log]
0.156: ================================================================================
0.156: 2012/07/01 14:42:36.938 (local)
0.156: c:\0fa018c457c1f8431be21b0e09e8b2e2\update\update.exe (version 6.3.4.1)
0.156: Failed To Enable SE_BACKUP_PRIVILEGE
0.156: Setup encountered an error: You do not have permission to update Windows XP. Please contact your system administrator.
0.156: You do not have permission to update Windows XP. Please contact your system administrator.
0.156: Update.exe extended error code = 0xf004 0.156: Update.exe return code was masked to 0x643 for MSI custom action compliance.





Все манипуляции выполнялись под локальным администратором.

Прошу Вашей помощи в восстановлении работоспособности скрипта!

Iska 01-07-2012 15:18 1943813

Цитата:

Цитата PIL123
если я буду использовать этот скрипт как стартап - аргумент "//b" надо указывать? »

Желательно. Дабы подавить любые сообщения, в том числе и об ошибках времени исполнения. Т.е., «Script name» [кстати, а говорили, что все машины — «RUS»?!]:
Код:

wscript.exe //b "Install GPP Extension.vbs"
Цитата:

Цитата PIL123
возможна его реализация с учётом платформы (x86, x64), языка (Rus, Eng), ОС (Windows XP, Vista, 7, Windows Server 2003, 2003 R2, 2008, 2008 R2 и т.д.)? »

Реализация не представляет собой каких-то сложностей. Могу попробовать. Не в том дело. Было бы кому проверять — у меня в ниличии весьма ограниченный круг вариантов ОС, платформ и языков.

Цитата:

Цитата PIL123
…этого замечательного скрипта. »

Не вижу в нём ничего замечательного. Лога нет, обработки ошибок нет, работоспособность ограничена малым перечнем платформ и языков.

PIL123 01-07-2012 15:26 1943821

Цитата:

Цитата Iska
[кстати, а говорили, что все машины — «RUS»?!]: »

Так и есть - все русские в рабочей среде. В моей тестовой среде - все английские. Но по идее, для данного скрипта это неважно, если правильно прописать соответствие в objDictionary - насколько я понимаю. В моём скрипте для тестовой среды я указал, что для "5.1.2600" надо брать "WindowsXP-KB943729-x86-ENU.exe", который как раз и лежит в папке C:\KB.

Цитата:

Цитата Iska
Желательно. Дабы подавить любые сообщения, в том числе и об ошибках времени исполнения. »

В окошке добавления скрипта для GPO (см. это окошко выше в топике) это значит что в поле "Script Parameters" надо прописать "//b" - верно?

Iska 01-07-2012 15:33 1943827

Цитата:

Цитата PIL123
Что-то не захотел работать у меня скрипт. »

Я посмотрю.


Цитата:

Цитата PIL123
При этом лог выполнения запуска KB'шки упал в корень C:\, а не C:\Logs, куда должен был бы по идее »

Не должен. Вы пропустили завершающий слэш в:
Код:

… /log:""C:\Logs\" & WScript.CreateObject("WScript.Network").ComputerName & ".log""") = 0 …
Цитата:

Failed To Enable SE_BACKUP_PRIVILEGE
Учтём, попробуем запросить привилегию:
Код:


Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
objSWbemServicesEx.Security_.Privileges.AddAsString "SeBackupPrivilege", True

Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery( _
  "SELECT * FROM Win32_QuickFixEngineering WHERE HotFixID='File 1' AND ServicePackInEffect = 'KB943729'")

Цитата:

Цитата PIL123
Так и есть - все русские в рабочей среде. В моей тестовой среде - все английские. »

Спасибо, ясно.

Цитата:

Цитата PIL123
Но по идее, для данного скрипта это неважно, если правильно прописать соответствие в objDictionary - насколько я понимаю. В моём скрипте для тестовой среды я указал, что для "5.1.2600" надо брать "WindowsXP-KB943729-x86-ENU.exe", который как раз и лежит в папке C:\KB. »

Да. Вы совершенно правы.

Цитата:

Цитата PIL123
В окошке добавления скрипта для GPO (см. это окошко выше в топике) это значит что в поле "Script Parameters" надо прописать "//b" - верно? »

Можно и так. Двойной слэш перед параметром указывает на то, что он не будет обрабатываться самим сценарием, а будет передан серверу сценариев («cscript.exe» или «wscript.exe»).

PIL123 01-07-2012 16:08 1943844

Отлично! Всё заработало в локальной машине! Теперь буду тестировать работу в связке с GPO.
KB'шка запросила ещё ряд привилегий. Я прописал их по аналогии. Сейчас скрипт выглядит
так:
Код:

Option Explicit

Dim objDictionary

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim collSWbemObjectSet
Dim objSWbemObjectEx


Set objDictionary = WScript.CreateObject("Scripting.Dictionary")

With objDictionary
        .Add "5.1.2600", "WindowsXP-KB943729-x86-ENU.exe"
        .Add "5.2.3790", "WindowsServer2003-KB943729-x86-RUS.exe"
        .Add "6.0.6000", "Windows6.0-KB943729-x86.msu"
        .Add "6.0.6001", "Windows6.0-KB943729-x86.msu"
        .Add "6.0.6002", "Windows6.0-KB943729-x86.msu"
End With


strComputer = "."

Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
objSWbemServicesEx.Security_.Privileges.AddAsString "SeBackupPrivilege", True
objSWbemServicesEx.Security_.Privileges.AddAsString "SeRestorePrivilege", True
objSWbemServicesEx.Security_.Privileges.AddAsString "SeShutdownPrivilege", True
objSWbemServicesEx.Security_.Privileges.AddAsString "SeSecurityPrivilege", True
objSWbemServicesEx.Security_.Privileges.AddAsString "SeTakeOwnershipPrivilege", True
Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery( _
        "SELECT * FROM Win32_QuickFixEngineering WHERE HotFixID='File 1' AND ServicePackInEffect = 'KB943729'")

If collSWbemObjectSet.Count = 0 Then
        For Each objSWbemObjectEx In objSWbemServicesEx.InstancesOf("Win32_OperatingSystem")
                With objSWbemServicesEx.Get("Win32_Process")
                        If .Create("""C:\KB\" & objDictionary.Item(objSWbemObjectEx.Version) & _
                                """ /quiet /norestart /log:""C:\Logs\" & WScript.CreateObject("WScript.Network").ComputerName & ".log""") = 0 Then
                               
                        Else
                                'Error
                        End If
                End With
               
                Exit For
        Next
End If

Set collSWbemObjectSet = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

objDictionary.RemoveAll
Set objDictionary      = Nothing

WScript.Quit 0



Ещё от себя Я изменил ключ /passive на /quiet - мне так больше подходит.

Спасибо Вам большущее за Вашу компетентность и оперативность! Если у Вас есть желание и время развить этот код для работы с учётом платформы и языка - с удовольствием буду Вашим тестером. Уверен, что этот код будет полезен многим нашим коллегам.

Решённой тему пока не отмечаю до окончательного тестирования.

Iska 01-07-2012 17:12 1943874

Цитата:

Цитата PIL123
Отлично! Всё заработало в локальной машине! Теперь буду тестировать работу в связке с GPO. »

Вот и славненько. Отпишитесь по результатам, пожалуйста.

Цитата:

Цитата PIL123
KB'шка запросила ещё ряд привилегий.»

Действительно все перечисленные?

Цитата:

Цитата PIL123
Ещё от себя Я изменил ключ /passive на /quiet - мне так больше подходит. »

Я стараюсь не скрывать от пользователя, что происходит процесс установки. Но сие действительно дело вкуса.


читать дальше »
Цитата:

Цитата PIL123
Если у Вас есть желание и время развить этот код для работы с учётом платформы и языка - с удовольствием буду Вашим тестером. »

С Вами приятно работать: Вы приводите исполняемый на Вашей стороне код, приводите полученные результаты, по потребности — скриншоты. Пишете грамотно, по-русски, по существу и к месту.

Обычно бывает с точностью до наоборот — «ничё неработает».

PIL123 01-07-2012 20:23 1943961

Цитата:

Цитата Iska
Отпишитесь по результатам, пожалуйста. »

Обязательно ;-)
Цитата:

Цитата Iska
Действительно все перечисленные? »

Да - всё что запросила KB'шка - прописал, ничего лишнего.
Цитата:

Цитата Iska
Я стараюсь не скрывать от пользователя, что происходит процесс установки. »

Я предполагаю у себя запускать это starup-скриптом, т.е. на этом этапе никакого пользователя не предполагается. Отсюда использование /quiet ключа.
читать дальше »
Цитата:

Цитата Iska
С Вами приятно работать: Вы приводите исполняемый на Вашей стороне код, приводите полученные результаты, по потребности — скриншоты. Пишете грамотно, по-русски, по существу и к месту. »

Спасибо :-) Просто я "спрашиватель" со стажем и прекрасно понимаю, что чем грамотнее буду задавать вопросы, тем быстрее найду на них ответы.

Iska 02-07-2012 05:52 1944158

PIL123, посмотрите на этот код:
читать дальше »
Код:

Option Explicit

Dim strHotFixID
Dim strServicePackInEffect

Dim strPath2HotFix
Dim strPath2Log


Dim objDictionary
Dim objFSO

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim collSWbemObjectSet
Dim objSWbemObjectEx

Dim strPrivilege
Dim strOSVersion
Dim strHotFixFullPath


strHotFixID            = "File 1"
strServicePackInEffect = "KB943729"

strPath2HotFix        = "C:\KB"
strPath2Log            = "C:\Logs"

Set objDictionary = WScript.CreateObject("Scripting.Dictionary")

With objDictionary
        .Add "Windows XP x86 ENU",            "WindowsXP-KB943729-x86-ENU.exe"
        .Add "Windows XP x86 RUS",            "WindowsXP-KB943729-x86-RUS.exe"
       
       
        .Add "Windows XP x64 ENU",            "WindowsXP64-KB943729-x86-ENU.exe"
        .Add "Windows XP x64 RUS"        ,    "WindowsXP64-KB943729-x86-RUS.exe"
       
        .Add "Windows Server 2003 x86 ENU",    "WindowsServer2003-KB943729-x86-ENU.exe"
        .Add "Windows Server 2003 x86 RUS",    "WindowsServer2003-KB943729-x86-RUS.exe"
        .Add "Windows Server 2003 x64 ENU",    "WindowsServer2003-KB943729-x64-ENU.exe"
        .Add "Windows Server 2003 x64 RUS",    "WindowsServer2003-KB943729-x64-RUS.exe"
       
       
        .Add "Windows Vista x86 ENU",          "Windows6.0-KB943729-x86-ENU.msu"
        .Add "Windows Vista x86 RUS",          "Windows6.0-KB943729-x86-RUS.msu"
        .Add "Windows Vista x64 ENU",          "Windows6.0-KB943729-x64-ENU.msu"
        .Add "Windows Vista x64 RUS",          "Windows6.0-KB943729-x64-RUS.msu"
       
        .Add "Windows Server 2008 x86 ENU",    "Windows6.0-KB943729-x86-ENU.msu"
        .Add "Windows Server 2008 x86 RUS",    "Windows6.0-KB943729-x86-RUS.msu"
        .Add "Windows Server 2008 x64 ENU",    "Windows6.0-KB943729-x64-ENU.msu"
        .Add "Windows Server 2008 x64 RUS",    "Windows6.0-KB943729-x64-RUS.msu"
       
       
        .Add "Windows 7 x86 ENU",              "Windows6.1-KB943729-x86-ENU.msu"
        .Add "Windows 7 x86 RUS",              "Windows6.1-KB943729-x86-RUS.msu"
        .Add "Windows 7 x64 ENU",              "Windows6.1-KB943729-x64-ENU.msu"
        .Add "Windows 7 x64 RUS",              "Windows6.1-KB943729-x64-RUS.msu"
       
        .Add "Windows Server 2008 R2 x64 ENU", "Windows6.1-KB943729-x64-ENU.msu"
        .Add "Windows Server 2008 R2 x64 RUS", "Windows6.1-KB943729-x64-RUS.msu"
End With

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")


strComputer = "."

Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")

For Each strPrivilege In Array("SeBackupPrivilege", "SeRestorePrivilege", "SeShutdownPrivilege", "SeSecurityPrivilege", "SeTakeOwnershipPrivilege")
        objSWbemServicesEx.Security_.Privileges.AddAsString strPrivilege, True
Next

Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery( _
        "SELECT * FROM Win32_QuickFixEngineering WHERE HotFixID='" & strHotFixID & "' AND ServicePackInEffect = '" & strServicePackInEffect & "'")

If collSWbemObjectSet.Count = 0 Then
        strOSVersion = GetStandardWindowsVersion(objSWbemServicesEx)
       
        If objDictionary.Exists(strOSVersion) Then
                strHotFixFullPath = objFSO.BuildPath(strPath2HotFix, objDictionary.Item(strOSVersion))
               
                WScript.Echo """" & strHotFixFullPath & """" & _
                        " /passive /norestart /log:""" & strPath2Log & "\" & _
                        strHotFixID & "_" & strServicePackInEffect & " [" & _
                        WScript.CreateObject("WScript.Network").ComputerName & "].log"""
               
                If objFSO.FileExists(strHotFixFullPath) Then
                        With objSWbemServicesEx.Get("Win32_Process")
                                If .Create("""" & strHotFixFullPath & """" & _
                                        " /passive /norestart /log:""" & strPath2Log & "\" & _
                                        strHotFixID & "_" & strServicePackInEffect & " [" & _
                                        WScript.CreateObject("WScript.Network").ComputerName & "].log""") = 0 Then
                                       
                                        ' Success execute
                                Else
                                        'Can't execute
                                End If
                        End With
                Else
                        ' File not found
                End If
        Else
                ' OS <--> HotFix link not found
        End If
End If

Set collSWbemObjectSet = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

objDictionary.RemoveAll
Set objDictionary      = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Function GetStandardWindowsVersion(objSWbemServicesEx)
        Dim objDictionary
       
        Dim objSWbemObjectEx_Win32_OperatingSystem
        Dim objSWbemObjectEx_Win32_ComputerSystem
       
        Dim strOS
       
       
        Set objDictionary = WScript.CreateObject("Scripting.Dictionary")
       
        With objDictionary
                .Add "32-bit",      "x86"
                .Add "64-bit",      "x64"
               
                .Add "X86-based PC", "x86"
                .Add "X64-based PC", "x64"
        End With
       
       
        For Each objSWbemObjectEx_Win32_OperatingSystem In objSWbemServicesEx.InstancesOf("Win32_OperatingSystem")
                With objSWbemObjectEx_Win32_OperatingSystem
                        Select Case .Version
                                '==========================================================================
                                Case "5.1.2600"
                                        strOS = "Windows XP x86"
                                '==========================================================================
                                Case "5.2.3790"
                                        Select Case .ProductType
                                                Case 1
                                                        strOS = "Windows XP x64"
                                                Case 2, 3
                                                        For Each objSWbemObjectEx_Win32_ComputerSystem In .InstancesOf("Win32_ComputerSystem")
                                                                strOS = "Windows Server 2003 " & objDictionary.Item(objSWbemObjectEx_Win32_OperatingSystem.SystemType)
                                                               
                                                                Exit For
                                                        Next
                                        End Select
                                '==========================================================================
                                Case "6.0.6000", "6.0.6001", "6.0.6002"
                                        Select Case .ProductType
                                                Case 1
                                                        strOS = "Windows Vista "          & objDictionary.Item(.OSArchitecture)
                                                Case 2, 3
                                                        strOS = "Windows Server 2008 "    & objDictionary.Item(.OSArchitecture)
                                        End Select
                                '==========================================================================
                                Case "6.1.7600", "6.1.7601"
                                        Select Case objSWbemObjectEx.ProductType
                                                Case 1
                                                        strOS = "Windows 7 "              & objDictionary.Item(.OSArchitecture)
                                                Case 2, 3
                                                        strOS = "Windows Server 2008 R2 " & objDictionary.Item(.OSArchitecture)
                                        End Select
                                '==========================================================================
                                Case Else
                                        ' Other
                        End Select
                       
                        Select Case .OSLanguage
                                Case 1033
                                        strOS = strOS & " ENU"
                                Case 1049
                                        strOS = strOS & " RUS"
                                Case Else
                                        ' Other
                        End Select
                       
                        Exit For
                End With
        Next
       
        objDictionary.RemoveAll
        Set objDictionary = Nothing
       
        WScript.Echo strOS
       
        GetStandardWindowsVersion = strOS
End Function
'=============================================================================


Здесь мы в начале скрипта перечисляем (по-хорошему, надо сие перечисление выносить во внешний ini/xml-файл) файлы обновлений соответственно версий, платформ и языка ОС. Основной вопрос, как обычно — правильно ли сии составляющие определяются.

PIL123 02-07-2012 16:38 1944402

Цитата:

Цитата Iska
PIL123, посмотрите на этот код: »

ОК, отлично, спасибо! Обязательно посмотрю. Сейчас столкнулся немного с другой проблемой - не могу запустить через GPO стартап-скрип тот скрипт, который для AIDA64. На контроллере домена скрипт из GPO отработал нормально, а на тестовом клиенте (Windows XP) работать не хочет. Пока не знаю почему.

Попутно вот нашёл по этой теме: http://www.heidelbergit.dk/2008/03/h...g-startup.html - зарубежный опыт.
А это: http://social.technet.microsoft.com/...5-6958d02c63c1 - отечественный.

PIL123 02-07-2012 22:04 1944612

Iska, Ваш код отлично работает!!! Правда имел возможность потестить пока только на Windows XP x86 ENG. Позже постараюсь потестить на других ОС в более сложных условиях.

Я немного его адаптировал под себя и у меня он сейчас выглядит
так

Код:

Option Explicit

Dim strHotFixID
Dim strServicePackInEffect

Dim strPath2HotFix
Dim strPath2Log


Dim objDictionary
Dim objFSO

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim collSWbemObjectSet
Dim objSWbemObjectEx

Dim strPrivilege
Dim strOSVersion
Dim strHotFixFullPath


strHotFixID            = "File 1"
strServicePackInEffect = "KB943729"

strPath2HotFix        = "\\TestDC.Company.Local\Distributives\KB943729"
strPath2Log            = "\\TestDC.Company.Local\Distributives\KB943729\Logs"

Set objDictionary = WScript.CreateObject("Scripting.Dictionary")

With objDictionary
        .Add "Windows XP x86 ENU",            "WindowsXP-KB943729-x86-ENU.exe"
        .Add "Windows XP x86 RUS",            "WindowsXP-KB943729-x86-RUS.exe"
       
        .Add "Windows XP x64 ENU",            "WindowsXP-KB943729-x64-ENU-RUS.exe"
        .Add "Windows XP x64 RUS",            "WindowsXP-KB943729-x64-ENU-RUS.exe"

       
        .Add "Windows Server 2003 x86 ENU",    "WindowsServer2003-KB943729-x86-ENU.exe"
        .Add "Windows Server 2003 x86 RUS",    "WindowsServer2003-KB943729-x86-RUS.exe"

        .Add "Windows Server 2003 x64 ENU",    "WindowsServer2003-KB943729-x64-ENU.exe"
        .Add "Windows Server 2003 x64 RUS",    "WindowsServer2003-KB943729-x64-RUS.exe"
       
       
        .Add "Windows Vista x86 ENU",          "WindowsVista6.0-KB943729-x86-ENU.msu"
        .Add "Windows Vista x86 RUS",          "WindowsVista6.0-KB943729-x86-RUS.msu"

        .Add "Windows Vista x64 ENU",          "WindowsVista6.0-KB943729-x64-ENU.msu"
        .Add "Windows Vista x64 RUS",          "WindowsVista6.0-KB943729-x64-RUS.msu"
End With

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")


strComputer = "."

Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")

For Each strPrivilege In Array("SeBackupPrivilege", "SeRestorePrivilege", "SeShutdownPrivilege", "SeSecurityPrivilege", "SeTakeOwnershipPrivilege")
        objSWbemServicesEx.Security_.Privileges.AddAsString strPrivilege, True
Next

Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery( _
        "SELECT * FROM Win32_QuickFixEngineering WHERE HotFixID='" & strHotFixID & "' AND ServicePackInEffect = '" & strServicePackInEffect & "'")

If collSWbemObjectSet.Count = 0 Then
        strOSVersion = GetStandardWindowsVersion(objSWbemServicesEx)
       
        If objDictionary.Exists(strOSVersion) Then
                strHotFixFullPath = objFSO.BuildPath(strPath2HotFix, objDictionary.Item(strOSVersion))
               
                WScript.Echo """" & strHotFixFullPath & """" & _
                        " /quiet /norestart /log:""" & strPath2Log & "\" & _
                        strHotFixID & "_" & strServicePackInEffect & " [" & _
                        WScript.CreateObject("WScript.Network").ComputerName & "].log"""
               
                If objFSO.FileExists(strHotFixFullPath) Then
                        With objSWbemServicesEx.Get("Win32_Process")
                                If .Create("""" & strHotFixFullPath & """" & _
                                        " /quiet /norestart /log:""" & strPath2Log & "\" & _
                                        strHotFixID & "_" & strServicePackInEffect & " [" & _
                                        WScript.CreateObject("WScript.Network").ComputerName & "].log""") = 0 Then
                                       
                                        ' Success execute
                                Else
                                        'Can't execute
                                End If
                        End With
                Else
                        ' File not found
                End If
        Else
                ' OS <--> HotFix link not found
        End If
End If

Set collSWbemObjectSet = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

objDictionary.RemoveAll
Set objDictionary      = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Function GetStandardWindowsVersion(objSWbemServicesEx)
        Dim objDictionary
       
        Dim objSWbemObjectEx_Win32_OperatingSystem
        Dim objSWbemObjectEx_Win32_ComputerSystem
       
        Dim strOS
       
       
        Set objDictionary = WScript.CreateObject("Scripting.Dictionary")
       
        With objDictionary
                .Add "32-bit",      "x86"
                .Add "64-bit",      "x64"
               
                .Add "X86-based PC", "x86"
                .Add "X64-based PC", "x64"
        End With
       
       
        For Each objSWbemObjectEx_Win32_OperatingSystem In objSWbemServicesEx.InstancesOf("Win32_OperatingSystem")
                With objSWbemObjectEx_Win32_OperatingSystem
                        Select Case .Version
                                '==========================================================================
                                Case "5.1.2600"
                                        strOS = "Windows XP x86"
                                '==========================================================================
                                Case "5.2.3790"
                                        Select Case .ProductType
                                                Case 1
                                                        strOS = "Windows XP x64"
                                                Case 2, 3
                                                        For Each objSWbemObjectEx_Win32_ComputerSystem In .InstancesOf("Win32_ComputerSystem")
                                                                strOS = "Windows Server 2003 " & objDictionary.Item(objSWbemObjectEx_Win32_OperatingSystem.SystemType)
                                                               
                                                                Exit For
                                                        Next
                                        End Select
                                '==========================================================================
                                Case "6.0.6000", "6.0.6001", "6.0.6002"
                                        Select Case .ProductType
                                                Case 1
                                                        strOS = "Windows Vista "          & objDictionary.Item(.OSArchitecture)
                                                Case 2, 3
                                                        strOS = "Windows Server 2008 "    & objDictionary.Item(.OSArchitecture)
                                        End Select
                                '==========================================================================
                                Case "6.1.7600", "6.1.7601"
                                        Select Case objSWbemObjectEx.ProductType
                                                Case 1
                                                        strOS = "Windows 7 "              & objDictionary.Item(.OSArchitecture)
                                                Case 2, 3
                                                        strOS = "Windows Server 2008 R2 " & objDictionary.Item(.OSArchitecture)
                                        End Select
                                '==========================================================================
                                Case Else
                                        ' Other
                        End Select
                       
                        Select Case .OSLanguage
                                Case 1033
                                        strOS = strOS & " ENU"
                                Case 1049
                                        strOS = strOS & " RUS"
                                Case Else
                                        ' Other
                        End Select
                       
                        Exit For
                End With
        Next
       
        objDictionary.RemoveAll
        Set objDictionary = Nothing
       
        WScript.Echo strOS
       
        GetStandardWindowsVersion = strOS
End Function
'=============================================================================



Эта, конкретная KB'шка не нужна для Windows 7, Windows Server 2008, Windows Server 2008 R2, поэтому из objDictionary я убрал упоминания о них для этого конкретного случая.
А вообще, судя по
Код:

strHotFixID = "File 1"
strServicePackInEffect = "KB943729"

у меня сложилось ощущение, что внутрь этого скрипта можно засунуть и другие KB'шки, т.е. Вы делали некий универсальный инструментарий для развёртывания KB - верно? Также косвенно об этом говорит имя файла логов, получившегося у меня: File 1_KB943729 [TESTCLIENT].log Было бы неплохо в таком случае, если бы Вы приложили бы к нему небольшое описание - инструкцию по эксплуатации - как его масштабировать для нескольких KB, как быть в случае, если KB'шки есть только для некоторых ОС (как в случае с KB943729).
Я не смог понять и разобраться для чего мне в коде для конкретной KB'шки, которой нет под Win 7, Win 2008, 2008R, вот эти строки.
Код:

                                                Case 2, 3
                                                        strOS = "Windows Server 2008 "    & objDictionary.Item(.OSArchitecture)
                                        End Select
                                '==========================================================================
                                Case "6.1.7600", "6.1.7601"
                                        Select Case objSWbemObjectEx.ProductType
                                                Case 1
                                                        strOS = "Windows 7 "              & objDictionary.Item(.OSArchitecture)
                                                Case 2, 3
                                                        strOS = "Windows Server 2008 R2 " & objDictionary.Item(.OSArchitecture)

удалять их не стал, ибо "не понятно".

Верно ли я понимаю, что скрипт предполагает только одно место хранения для KB'шек?

Код:

strPath2HotFix        = "\\TestDC.Company.Local\Distributives\KB943729"
Если это так, то это не очень универсально, ибо предполагает, что KB должны ВСЕ храниться в одном месте. Это не очень удобно. Нельзя ли для каждой KB указывать свой путь?

Если я вообще не правильно понял Ваш скрипт и несу ерунду, объясните, пожалуйста, как правильно в теории должно быть.

UPD:
Кстати, вот содержимое лога. Может из него удастся как-то что-то улучшить
Лог

Код:

[File 1_KB943729 [TESTCLIENT].log]
0.250: ================================================================================
0.250: 2012/07/02 21:29:05.140 (local)
0.250: c:\52fa1b1dbf5491ca582ac4\update\update.exe (version 6.3.4.1)
0.250: Hotfix started with following command line: /quiet /norestart /log:\\TestDC.Company.Local\Distributives\KB943729\Logs\File 1_KB943729 [TESTCLIENT].log
0.250: In Function GetBuildType, line 1170, RegQueryValueEx failed with error 0x2
0.266:  C:\WINDOWS\system32\xmllite.dll is Present
0.266: Condition succeeded for section Test.PresentOp.Section in Line 1 of PreRequisite
0.266: DoInstallation: HpInitializeLibrary failed; status=0xe0000106, location=2749
0.266: Hotpatching Initialization Failed: Disabling Hotpatch functionality.
1.516: In Function TestVolatileFlag, line 12013, RegOpenKeyEx failed with error 0x2
1.516: In Function TestVolatileFlag, line 12045, RegOpenKeyEx failed with error 0x2
1.516: DoInstallation: CleanPFR failed: 0x2
1.516: In Function GetBuildType, line 1170, RegQueryValueEx failed with error 0x2
1.516: SetProductTypes: InfProductBuildType=BuildType.Sel
1.531: SetAltOsLoaderPath: No section uses DirId 65701; done.
1.594: DoInstallation: FetchSourceURL for c:\52fa1b1dbf5491ca582ac4\Update\update_wxp.inf failed
1.594: CreateUninstall = 1,Directory = C:\WINDOWS\$NtUninstallKB943729$
1.594: LoadFileQueues: UpdSpGetSourceFileLocation for halmacpi.dll failed: 0xe0000102
1.594: BuildCabinetManifest: update.url absent
1.594: Starting AnalyzeComponents
1.594: AnalyzePhaseZero used 0 ticks
1.594: No c:\windows\INF\updtblk.inf file.
1.594: OEM file scan used 0 ticks
1.594: AnalyzePhaseOne: used 0 ticks
1.594: AnalyzeComponents: Hotpatch analysis disabled; skipping.
1.594: AnalyzeComponents: Hotpatching is disabled.
1.625: AnalyzePhaseTwo used 15 ticks
1.625: AnalyzePhaseThree used 0 ticks
1.625: AnalyzePhaseFive used 0 ticks
1.625: AnalyzePhaseSix used 0 ticks
1.625: AnalyzeComponents used 31 ticks
1.625: Downloading 0 files
1.625: bPatchMode = FALSE
1.625: Inventory complete: ReturnStatus=0, 31 ticks
1.625: Num Ticks for invent : 31
1.625: Allocation size of drive C: is 4096 bytes, free space = 40797515776 bytes
1.641: AnalyzeDiskUsage:  Skipping EstimateDiskUsageForUninstall.
1.641: Drive C: free 38907MB req: 8MB w/uninstall: NOT CALCULATED.
1.641: CabinetBuild complete
1.641: Num Ticks for Cabinet build : 16
1.641: DynamicStrings section not defined or empty.
1.641: Starting process:  msiexec /x {376B771D-8C14-4AFF-874B-677C3423F8F8} /quiet
2.172:  Return Code = 1605
2.172: Starting process:  msiexec /x {5A01A639-CF6C-441D-9EF3-B59C4375FF87} /quiet
2.406:  Return Code = 1605
2.406: Starting process:  msiexec /x {337240B1-42C2-4384-AAFF-D347A6D2CC5E} /quiet
2.641:  Return Code = 1605
2.641: Starting process:  msiexec /x {362C838B-54FF-4197-847B-8927FF1742EE} /quiet
2.875:  Return Code = 1605
2.875: Starting process:  msiexec /x {E606D790-404B-46F7-8DE6-C1FAE06CAC67} /quiet
3.219:  Return Code = 1605
3.219: Starting process:  msiexec /x {4583EB96-6167-4B87-8F0E-A12A128B3EB0} /quiet
3.453:  Return Code = 1605
3.453: Starting process:  msiexec /x {200B6216-5FA0-4DAA-BC41-500CE1ADCF97} /quiet
3.688:  Return Code = 1605
3.688: Starting process:  msiexec /x {B01ED954-EB4F-401F-9CDE-98895FE6F367} /quiet
3.906:  Return Code = 1605
3.906: Starting process:  msiexec /x {2765750D-7888-4D77-AD27-A71EC00AFF53} /quiet
4.141:  Return Code = 1605
4.141: Starting process:  msiexec /x {D787C24E-809D-4C48-BF53-EC5C76689A13} /quiet
4.375:  Return Code = 1605
4.391: FileInUse:: Detection disabled.
5.391: LoadFileQueues: UpdSpGetSourceFileLocation for halmacpi.dll failed: 0xe0000102
5.516: Num Ticks for Backup : 3875
5.578: Num Ticks for creating uninst inf : 62
5.578: Registering Uninstall Program for -> KB943729, KB943729 , 0x0
5.625: LoadFileQueues: UpdSpGetSourceFileLocation for halmacpi.dll failed: 0xe0000102
7.266: System Restore Point set.
7.297: Copied file:  C:\WINDOWS\system32\spmsg.dll
9.000: PFE2: Not avoiding Per File Exceptions.
9.047: GetCatVersion:  Failed to retrieve version information from C:\WINDOWS\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\KB943729.cat with error 0x57
9.328: Copied file:  C:\WINDOWS\system32\gpprefcl.dll
9.485: Copied file:  C:\WINDOWS\system32\WBEM\polprocl.mof
9.547: Copied file:  C:\WINDOWS\system32\WBEM\polprocl.mfl
9.578: Copied file:  C:\WINDOWS\system32\WBEM\POLBASE.MOF
9.610: Copied file:  C:\WINDOWS\system32\WBEM\POLPRO.MOF
9.641: Copied file:  C:\WINDOWS\system32\WBEM\POLPROC.MOF
9.656: Copied file:  C:\WINDOWS\system32\WBEM\POLPROU.MOF
9.672: DoInstallation: Installing assemblies with source root path: c:\52fa1b1dbf5491ca582ac4\
9.672: Num Ticks for Copying files : 4094
9.969: Num Ticks for Reg update and deleting 0 size files : 297       
9.969: Starting process:  C:\WINDOWS\system32\wbem\mofcomp.exe C:\WINDOWS\system32\wbem\polprocl.mof
10.813:  Return Code = 0
13.953: UpdateSpUpdSvcInf: Source [ProcessesToRunAfterReboot] section is empty; nothing to do.
13.985: RebootNecessary = 0,WizardInput = 1 , DontReboot = 1, ForceRestart = 0


Iska 02-07-2012 22:38 1944630

Цитата:

Цитата PIL123
Эта, конкретная KB'шка не нужна для Windows 7, Windows Server 2008, Windows Server 2008 R2, поэтому из objDictionary я убрал упоминания о них для этого конкретного случая. »

Можно и просто оставить пустые строки или закомментировать:
Код:

        .Add "Windows 7 x86 ENU",              ""
        '.Add "Windows 7 x86 RUS",              "Windows6.1-KB943729-x86-RUS.msu"

Названия файлов я, понятное дело, брал наобум. И версию 6.1 оставил просто для демонстрации.

Я всё-таки думаю, удобнее будет вынести сие во внешний файл.

Цитата:

Цитата PIL123
А вообще, судя по
Код:
strHotFixID = "File 1"
strServicePackInEffect = "KB943729"
у меня сложилось ощущение, что внутрь этого скрипта можно засунуть и другие KB'шки, т.е. Вы делали некий универсальный инструментарий для развёртывания KB - верно? Также косвенно об этом говорит имя файла логов, получившегося у меня: File 1_KB943729 [TESTCLIENT].log »

В общем-то, да. Одного хотфикса. Значения:
Код:

strHotFixID
strServicePackInEffect
strPath2HotFix
strPath2Log

и планируемый «strPath2OSHotfixLinks» (путь ко внешнему файлу, содержащему то, что нынче присваивается в самом скрипте посредством «objDictionary») — должны будут передаваться аргументами скрипта. Либо и вовсе всё это держать в одном XML файле, путь к которому передавать аргументом.

Цитата:

Цитата PIL123
Было бы неплохо в таком случае, если бы Вы приложили бы к нему небольшое описание - инструкцию по эксплуатации »

Можно будет попробовать.

Цитата:

Цитата PIL123
как его масштабировать для нескольких KB »

Пока — никак. Только — несколько скриптов. Оттого я и хочу отделить мух от котлет код от данных, вынеся последние во внешний файл. Тогда скрипт будет один, а к нему — потребное число XML с данными на хотфикс (или даже один XML с несколькими хотфиксами). Попробую поработать над этим.

Сейчас мне важнее другое: правильно ли определяется версия/платформа/язык для разных ОС. А я, например, совершенно не представляю, как обстоят дела с MUI — как там правильно определять язык ОС, какие языкозависимые обновления вообще надо ставить под ним — RUS или ENU.

PIL123 02-07-2012 23:45 1944649

Цитата:

Цитата Iska
Сейчас мне важнее другое: правильно ли определяется версия/платформа/язык для разных ОС. А я, например, совершенно не представляю, как обстоят дела с MUI — как там правильно определять язык ОС, какие языкозависимые обновления вообще надо ставить под ним — RUS или ENU. »

Я потестирую и отпишусь Вам. Если завтра всё будет по плану и скрипт отработает - будут результаты по разным русским ОС.

Цитата:

Цитата Iska
Либо и вовсе всё это держать в одном XML файле »

XML-файл этот нужно будет руками составлять? Насколько это юзерфрендли? Я, например, имею очень скромные знания о формате XML и как подобный файл создавать самому в блокноте.

PIL123 04-07-2012 23:34 1946051

Сегодня запустил в рабочей среде скрипт. На Windows XP русской всё прошло хорошо без запинки, а вот на Windows Server 2003 R2 SP2 ставиться из скрипта не стало по каким-то причинам.



Причём руками тот KB, который соответствует в коде Windows Server 2003
Код:

.Add "Windows Server 2003 x86 RUS",    "WindowsServer2003-KB943729-x86-RUS.exe"
поставился.

Запустить руками скрипт сразу не догадался. Если нужно - запущу.

Есть у Вас какие-нибудь идеи, как поправить код?

P.S. Картинка кликабельная.

Iska 05-07-2012 01:37 1946110

Цитата:

Цитата PIL123
Сегодня запустил в рабочей среде скрипт. На Windows XP русской всё прошло хорошо без запинки, а вот на Windows Server 2003 R2 SP2 ставиться из скрипта не стало по каким-то причинам. »

Ага. Есть такое дело. Сам понял, когда увидел у себя, что на 2003-м вылетает с ошибкой (я, правда, пускал не через GPO, а перебором). Я там в скрипте малость переборщил с упрощениями кода. Поправлю на днях.

PIL123 05-07-2012 23:15 1946787

Цитата:

Цитата Iska
Поправлю на днях. »

ОК, спасибо! Возлагаю на Вас и Ваш скрипт большие надежды, ибо уже продакшн :-)

PIL123 18-07-2012 00:51 1953972

Iska, :-( Вернитесь, пожалуйста, в мой топик...

PIL123 18-07-2012 01:25 1953985

Iska, я решил использовать Ваш скрипт для разворачивания в сети Internet Explorer'ов. Начал с того, что на своей домашней машине опробовал этот Ваш хитрый запрос:



При этом вводил заведомо имеющиеся у меня KB'шки:



В ответ на команду получал, что данный KB не установлен. Подскажите, что я делаю не так? Ну, и следом, подскажите, пожалуйста, как, используя Ваш хитрый запрос определить установлен ли Internet Explorer на компьютере?

Iska 18-07-2012 02:28 1953995

Цитата:

Цитата PIL123
Iska, :-( Вернитесь, пожалуйста, в мой топик... »

Я вернусь, когда появится достаточное количество потребного времени в нужном месте. Пока что эти обстоятельства не совпадают. Сожалею.


Цитата:

Цитата PIL123
При этом вводил заведомо имеющиеся у меня KB'шки:

В ответ на команду получал, что данный KB не установлен. »

Вот краткая выдержка типичных значений из:
Код:

wmic.exe QFE get HotFixID, ServicePackInEffect
читать дальше »
Код:

HotFixID    ServicePackInEffect 
File 1      KB2510581           
File 1      KB888111WXPSP2     
File 1      KB932716-v2         
File 1      KB942288-v3         
File 1      KB952011           
File 1      KB954550-v5         
Q147222                         
Q282784                         
S867460      1.1                 
KB968930    SP10               
Q282784      SP1                 
KB969084    SP10               
KB952011    SP3                 
KB2647516    SP4                 
KB932716-v2  SP4                 
KB942288-v3  SP4                 
KB954550-v5  SP4                 
KB955704    SP4


Пара «HotFixID/ServicePackInEffect» однозначно идентифицируют установленное обновление в коллекции класса. И Вам надо для каждой конкретно взятой версии каждого обновления предварительно определить эти квалификаторы.

Выполните такую команду:
Код:

wmic.exe QFE get HotFixID, ServicePackInEffect | find.exe "KB2719985"
на машине с установленным обновлением KB2719985. Вы должны увидеть пару значений. Первое — это квалификатор «HotFixID», второе — «ServicePackInEffect». Их и используйте.

Цитата:

Цитата PIL123
Ну, и следом, подскажите, пожалуйста, как, используя Ваш хитрый запрос определить установлен ли Internet Explorer на компьютере? »

А может быть такое, что он не установлен под Windows?!

PIL123 18-07-2012 12:53 1954161

Цитата:

Цитата Iska
А может быть такое, что он не установлен под Windows?! »

Он конечно в любом случае (почти) будет установлен, но какой-либо предыдущей версии. Хотелось бы проверять установлен ли та версия, которая нужна (последняя для каждой конкретной ОС) и, в случае, если не установлена последняя версия - ставить её.

Ввёл Ваши команды, но пары значений у меня не вывалилось почему-то :-(





Подскажите, пожалуйста, как быть?

Iska 18-07-2012 13:15 1954181

Проверьте так:
Код:

wmic.exe QFE where "HotFixID='KB2719985' AND ServicePackInEffect=''" get HotFixID, ServicePackInEffect, Description
Если находится экземпляр класса — то так и пробуйте:
Код:

strHotFixID = "KB2719985"
strServicePackInEffect = ""


PIL123 18-07-2012 13:31 1954188

Iska, всё получилось:



Спасибо! Смотрю теперь как это знание прикрутить к возможности определения факта наличия/отсутствия требуемого IE.

PIL123 18-07-2012 14:32 1954216

Iska, Вы случайно не знаете какой HotFixID имеют IE 8 и IE9. Не знаю как их определить. Щас гуглю и в технете уже копаюсь, но пока безрезультатно. Может быть IE нужно определять как-то, используя какой-то другой WMI-запрос?

Тема уходит в сторону от темы топика - как считаете, может создать новый топик, посвящённый определению установленного/не установленного последнего IE для каждой отдельно взятой ОС?

Iska 19-07-2012 19:52 1954995

Цитата:

Цитата PIL123
Iska, Вы случайно не знаете какой HotFixID имеют IE 8 и IE9. Не знаю как их определить. Щас гуглю и в технете уже копаюсь, но пока безрезультатно. Может быть IE нужно определять как-то, используя какой-то другой WMI-запрос? »

PIL123, вот потому-то у меня и не возникало ни малейшего желания лепить свой WSUS — ибо я знал, что такой вопрос, рано или поздно, возникнет. Вы хотите устанавливать кумулятивные обновления для IE?

PIL123 19-07-2012 22:27 1955071

Нет - не кумулятивные обновления, а только IE. Я работаю у заказчика и, как часть работ, надо установить последний IE для каждой ОС - Для Seven - это IE9, для XP - IE8 и т.д. Отсюда желание развернуть эти вещи скриптом. А WSUS у заказчика нет - такой вот хреновый заказчик :-(

sattva 31-05-2013 11:19 2159781

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

' --------------------------------------------- '
' ----- By Jakob H. Heidelberg 29-02-2008 ----- '
' ----- - - - - - - - - - - - - - - - - - ----- '
' -----    Install GP Preference CSEs    ----- '
' -----          Developed for:          ----- '
' ----- http://heidelbergit.blogspot.com  ----- '
' ----- - - - - - - - - - - - - - - - - - ----- '
' -----          version 1.01            ----- '
' -----    Last rev. date: 01-03-2008    ----- '
' --------------------------------------------- '
' Changes:
'---------
' v1.0 Basic functionality:
' - Developed to be combined with a Startup Script (or admin rights)
' - Check if the CSEs are installed already, using local WMI call
' - Check OS Version (Windows XP, Windows Server 2003, Windows Vista), using local WMI call
' - Check OS Architecture (32 or 64 bit), just checking for a folder as WMI call was kinda strange
' - Check OS Service Pack Level, using local WMI call
' - Check for GPP CSE Pre-requisite on XP/2003 systems, using local WMI call
' - Installation of GPP CSE Pre-reqs on XP/2003 systems
' - Handles install on Windows XP SP2/SP3 32-bit (EXE file)
' - Handles install on Windows XP 64-bit, any SP level (EXE file)
' - Handles install on Windows Server 2003 SP1/SP2 32-bit (EXE file)
' - Handles install on Windows Server 2003 64-bit, any SP level (EXE file)
' - Handles install on Windows Vista RTM/SP1 32-bit (MSU package)
' - Handles install on Windows Vista RTM/SP1 64-bit (MSU package)
'
'More info:
'----------
' 1) Place ALL GPP CSE and GPP CSE Pre-Req files in the same directory (strBasePath), eg. \\DC1\UPDATES\
' 2) Description of the Windows Update Stand-alone Installer (Wusa.exe) and of .msu files in Windows Vista:
'    http://support.microsoft.com/kb/934307/en-us
' 3) NB! You might need other language version for the XmlLite GPP CSE Pre-requisites, so watch out!

Option Explicit
On Error Resume Next

'The Group Policy Preference CSE HotfixID
Dim strCSEFixID : strCSEFixID ="943729"

'Path to main update share/folder - place the 4 GPP CSE and the 3 GPP CSE Pre-Req binaries here!
Dim strBasePath : strBasePath = "\\192.168.1.92\SoftInstall$\Update\KB943729\" 'NB! with trailing backslash!

'GPP CSE filename for: Windows XP 32-bit / Windows Server 2003 32-bit (MD5: dfa20e51141af67ec49d574428c38fb8)
'http://www.microsoft.com/downloads/details.aspx?FamilyID=e60b5c8f-d7dc-4b27-a261-247ce3f6c4f8&DisplayLang=en
'http://www.microsoft.com/downloads/details.aspx?FamilyID=bfe775f9-5c34-44d0-8a94-44e47db35add&DisplayLang=en
Dim strXP2K332CSE : strXP2K332CSE = "WindowsXP-KB943729-x86-RUS.exe"

'GPP CSE filename for: Windows XP 64-bit / Windows Server 2003 64-bit (MD5: 5803c6f4b4bc02ea29d934d839e0a66f)
'http://www.microsoft.com/downloads/details.aspx?FamilyID=b10a7af4-8bee-4adc-8bbe-9949df77a3cf&DisplayLang=en
'http://www.microsoft.com/downloads/details.aspx?FamilyID=29e83503-7686-49f3-b42d-8e5ed23d5d79&DisplayLang=en
Dim strXP2K364CSE : strXP2K364CSE = "WindowsXP-KB943729-x64-RUS.exe"

'GPP CSE filename for: Windows Vista 32-bit (MD5: 22a42082473b3c8bc3b22ad095c6c31f)
'http://www.microsoft.com/downloads/details.aspx?FamilyID=ab60dc87-884c-46d5-82cd-f3c299dac7cc&DisplayLang=en
Dim strVIS32CSE : strVIS32CSE = "Windows6.0-KB943729-x86.msu"

'GPP CSE filename for: Windows Vista 64-bit (MD5: d92e107cdffa51d5943f1861f28178e7)
'http://www.microsoft.com/downloads/details.aspx?FamilyID=b10a7af4-8bee-4adc-8bbe-9949df77a3cf&DisplayLang=en
Dim strVIS64CSE : strVIS64CSE = "Windows6.0-KB943729-x64.msu"

'----------------------------------------------------------------------'
'PRE-REQUISITES - 'http://support.microsoft.com/default.aspx/kb/914783 '
'----------------------------------------------------------------------'
'GPP PreReq KB914783 filename for: Windows XP SP2 32-bit = KB915865  (MD5: 656657aeaea02d3a1069d52c4593e6e8)
'http://www.microsoft.com/downloads/details.aspx?FamilyId=D7B5DC81-AD14-4DE2-8AD5-8C4A9AAB5992&displaylang=en
Dim strXP32PRE  : strXP32PRE  = "WindowsXP-KB915865-v11-x86-RUS.exe"
Dim strPREFixID1 : strPREFixID1 = "915865"

'GPP PreReq KB914783 filename for: Windows Server 2003 SP1 32-bit = KB914783 (MD5: 830c6163fa113b782aa3cd9eb54ee549)
'http://www.microsoft.com/downloads/details.aspx?FamilyId=611D1FDE-C8D0-4D80-96DA-B5B20F7BA159&displaylang=en
Dim str2K332PRE  : str2K332PRE  = "WindowsServer2003-KB914783-v10-x86-RUS.exe"
Dim strPREFixID2 : strPREFixID2 = "914783"

'GPP PreReq KB914783 filename for: Windows XP 64-bit = KB915865 (MD5: 7fd3fc3fb21566fd97750d98e41bca0d)
'http://www.microsoft.com/downloads/details.aspx?FamilyId=C7CB26E9-68F1-4F80-B231-79D044431E8E&displaylang=en
Dim strPREFixID3  : strPREFixID3  = "915865" 'exact same install file as Windows Server 2003 SP1 64-bit (KB914783)

'GPP PreReq KB914783 filename for: Windows Server 2003 SP1 64-bit = KB914783 (MD5: 7fd3fc3fb21566fd97750d98e41bca0d)
'http://www.microsoft.com/downloads/details.aspx?FamilyId=406777E6-79DA-4414-A329-22A435A95D9D&displaylang=en
Dim strXP2K364PRE : strXP2K364PRE = "WindowsServer2003.WindowsXP-KB914783-v10-x64-ENU.exe"
Dim strPREFixID4  : strPREFixID4  = "914783"

'Commandline stuff                                                                                                                                                                                                       
Dim strArgusMSU : strArgusMSU  = "/quiet /norestart"
Dim strArgusEXE : strArgusEXE  = "/quiet /passive /norestart"
Dim strArgusLOG : strArgusLOG = "/log:\\192.168.1.92\SoftInstall$\Update\KB943729\Logs\KB943729_" & WScript.CreateObject("WScript.Network").ComputerName & ".log"

Dim objFso : Set objFso = CreateObject("Scripting.FileSystemObject")

'Get SYSTEM folder, eg. C:\Windows\System32
Dim strSys : strSys = objFSO.GetSpecialFolder(1)

'Is the GPP CSE already installed? Is so, then just quit!
If IsThisHotfixInstalled(strCSEFixID) Then WScript.Quit(0)

'Is this a 64-bit windows OS?
'Get WINDOWS folder, eg. C:\Windows
Dim strWin : strWin = objFSO.GetSpecialFolder(0)
Dim strBit : strBit = "32"
If objFso.FolderExists(strWin & "\SysWOW64") Then strBit = "64"

Set objFso = Nothing

'Get OS version and Service Pack level using WMI
Dim strCSDVers, strCaption
Dim objWMI : Set objWMI = GetObject("winmgmts:\\.\root\CIMV2")
Dim colItm : Set colItm = objWMI.ExecQuery("SELECT * FROM Win32_OperatingSystem")
Dim objItm
For Each objItm In colItm
  strCSDVers = objItm.CSDVersion
  strCaption = objItm.Caption
Next
Set objWMI = Nothing
Set colItm = Nothing

'GET OS ARCHITECTURE
If Instr(strBit, "32") Then
  strBit = "32"
ElseIf Instr(strBit, "64") Then
  strBit = "64"
Else
  'We don't know what OS architecture it is, let's beat it...
  WScript.Quit()
End If

'GET SP LEVEL (number only)
If strCSDVers <> "" Then
  strCSDVers = Right(strCSDVers,1)
End If

Dim strCommandLineCSE, strCommandLinePRE
'GET OS VERSION (CAPTION) and Build CommandLine
If Instr(UCASE(strCaption), "VISTA") Then
  'We are dealing with a Windows Vista system
  If strBit = "32" Then
    'This is 32 bit (no SP level check)
    'No pre-req check for Windows Vista
    strCommandLineCSE = strSys & "\WUSA.EXE " & Chr(34) & strBasePath & strVIS32CSE & Chr(34) & " " & strArgusMSU & " " & strArgusLOG
  ElseIf strBit = "64" Then
    'This is 64 bit (no SP level check)
    'No pre-req check for Windows Vista
    strCommandLineCSE = strSys & "\WUSA.EXE " & Chr(34) & strBasePath & strVIS64CSE & Chr(34) & " " & strArgusMSU  & " " & strArgusLOG
  End If
 
ElseIf Instr(UCASE(strCaption), "XP") Then
  'We are dealing with a Windows XP system
  If (strCSDVers = "2" Or strCSDVers = "3")And strBit = "32" Then
    'This is SP2 or SP3 - 32 bit
    'Install pre-req if it's not already there
    If Not IsThisHotfixInstalled(strPREFixID1) Then strCommandLinePRE = Chr(34) & strBasePath & strXP32PRE & Chr(34) & " " & strArgusEXE  & " " & strArgusLOG
    strCommandLineCSE = Chr(34) & strBasePath & strXP2K332CSE & Chr(34) & " " & strArgusEXE & " " & strArgusLOG
  ElseIf strBit = "64" Then
    'This is 64 bit (no SP level check)
    'Install pre-req if it's not already there
    If Not IsThisHotfixInstalled(strPREFixID3) Then strCommandLinePRE = Chr(34) & strBasePath & strXP2K364PRE & Chr(34) & " " & strArgusEXE & " " & strArgusLOG
    strCommandLineCSE = Chr(34) & strBasePath & strXP2K364CSE & Chr(34) & " " & strArgusEXE & " " & strArgusLOG
  End If

ElseIf Instr(strCaption, "2003") Then
  'We are dealing with a Windows Server 2003 system
  If (strCSDVers = "1" Or strCSDVers = "2") And strBit = "32" Then
    'This is SP1 or SP2 - 32 bit
    'Install pre-req if it's not already there
    If Not IsThisHotfixInstalled(strPREFixID2) Then strCommandLinePRE = Chr(34) & strBasePath & str2K332PRE & Chr(34) & " " & strArgusEXE & " " & strArgusLOG
    strCommandLineCSE = Chr(34) & strBasePath & strXP2K332CSE & Chr(34) & " " & strArgusEXE & " " & strArgusLOG
  ElseIf strBit = "64" Then
    'This is 64 bit (no SP level check)
    'Install pre-req if it's not already there
    If Not IsThisHotfixInstalled(strPREFixID4) Then strCommandLinePRE = Chr(34) & strBasePath & strXP2K364PRE & Chr(34) & " " & strArgusEXE
    strCommandLineCSE = Chr(34) & strBasePath & strXP2K364CSE & Chr(34) & " " & strArgusEXE
  End If
Else
  'It's some other OS, let's beat it...
  Wscript.Quit()
End If

'Install GPP CSE Pre-req if strCommandLinePRE is defined
If strCommandLinePRE <> "" Then
  ExecuteThis(strCommandLinePRE)
End If

'Install GPP CSE if strCommandLineCSE is defined
If strCommandLineCSE <> "" Then
  ExecuteThis(strCommandLineCSE)
End If

Function ExecuteThis(FULLSTRING)
  Dim objShell : Set objShell = CreateObject("Wscript.Shell")
  ExecuteThis = objShell.Run(FULLSTRING,,1)
  Set objShell = Nothing
End Function

Function IsThisHotfixInstalled(KBNUMBER)
  Dim objWMI : Set objWMI = GetObject("winmgmts:\\.\root\CIMV2")
  Dim colItm : Set colItm = objWMI.ExecQuery("SELECT * FROM Win32_OperatingSystemQFE")
  IsThisHotfixInstalled = False
  Dim objItm
  For Each objItm In colItm
      If Instr(objItm.Dependent,KBNUMBER) Then
        IsThisHotfixInstalled = True
        Exit For
      End If
  Next
  Set colItm = Nothing
  Set objWMI = Nothing
End Function



Время: 18:49.

Время: 18:49.
© OSzone.net 2001-