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

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

Raistlin 25-01-2012 19:14 1844376

Удаленное удаление MSI-пакетов
 
Наткнулся на такой скрипт:
Код:

'Uninstalls a remote MSI package.
'http://vbscriptwmi.uw.hu/ch31lev1sec4.html

'get remote computer name
Dim sMachine
sMachine = InputBox("Computer name?")
'get admin credentials
Dim sAdminUser, sPassword
sAdminUser = InputBox("Enter the admin user name.")
sPassword = InputBox("Enter the users password. ")
'get a WMI Locator
Dim oLocator
Set oLocator = CreateObject("WbemScripting.SWbemLocator")
'connect to remote machine
Dim oService
Set oService = oLocator.ConnectServer(sMachine, "root\cimv2", _
    sAdminUser, sPassword)
'get a list of installed products
Dim sMsg, sName
For Each oProduct in GetObject( _
 "winmgmts:{impersonationLevel=impersonate,(Debug)}" _
 ).InstancesOf("win32_Product")
 'is this the product we want?
 sMsg = "Product: " & vbCrLf
 sMsg = sMsg & oProduct.Name
      sMsg = sMsg & vbCrLf & "Uninstall this product?"
 If MsgBox(sMsg, 4) = 6 Then
  sName = oProduct.Name
  Exit For
 End If
Next
'Get the named package
For each oProduct in GetObject( _
 "winmgmts:{impersonationLevel=impersonate}" _
 ).ExecQuery _
      ("Select * from Win32_Product where Name='" & sName & "'")
 'uninstall it
      oProduct.Uninstall
      'done!
      MsgBox "Uninstalled " & sName
Next

По замыслу автора, он должен удалять msi-пакеты удаленно. Удаляет-то, может, он и удаленно, а вот список формирует из локально установленных пакетов. Не подскажет ли кто, что в нем не так?

Petya V4sechkin 25-01-2012 19:53 1844400

Raistlin, пример есть в этой теме.

Iska 26-01-2012 02:07 1844609

Цитата:

Цитата Raistlin
Удаляет-то, может, он и удаленно, »

Тоже локально.

Raistlin, проверить в данный конкретный момент нет возможности, но вот Вам примерная болванка кода:
Код:

Option Explicit

Dim strProductName
Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim collSWbemObjectSet
Dim objSWbemObjectEx


strProductName = "Google Toolbar for Internet Explorer"
strComputer    = "MyServer"

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

objSWbemServicesEx.Security_.Privileges.AddAsString "SeDebugPrivilege"

Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery( _
        "SELECT * FROM Win32_Product " & _
        "WHERE Name = '" & strProductName & "'")

For Each objSWbemObjectEx In collSWbemObjectSet
        objSWbemObjectEx.Uninstall
Next

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

WScript.Quit 0


Raistlin 29-01-2012 01:01 1846667

Petya V4sechkin, не могу сообразить, как реализовать поиск пакетов на удаленной машине. Изменил код в соответствии с имеющимся в той теме:
Код:

'Uninstalls a remote MSI package.
'http://vbscriptwmi.uw.hu/ch31lev1sec4.html

'get remote computer name
Dim sMachine
sMachine = InputBox("Computer name?")
'get admin credentials
Dim sAdminUser, sPassword
sAdminUser = InputBox("Enter the admin user name.")
sPassword = InputBox("Enter the users password. ")
'get a WMI Locator
Dim oLocator
Set oLocator = CreateObject("WbemScripting.SWbemLocator")
'connect to remote machine
Dim oService
Set oService = oLocator.ConnectServer(sMachine, "root\cimv2", _
    sAdminUser, sPassword)
'get a list of installed products
Dim sMsg, sName
For Each oProduct in GetObject( _
 "winmgmts:{impersonationLevel=impersonate}!\\" & sMachine & "\root\cimv2" _
 ).InstancesOf("win32_Product")
 'is this the product we want?
 sMsg = "Product: " & vbCrLf
 sMsg = sMsg & oProduct.Name
      sMsg = sMsg & vbCrLf & "Uninstall this product?"
 If MsgBox(sMsg, 4) = 6 Then
  sName = oProduct.Name
  Exit For
 End If
Next
'Get the named package
For each oProduct in GetObject( _
 "winmgmts:{impersonationLevel=impersonate}" _
 ).ExecQuery _
      ("Select * from Win32_Product where Name='" & sName & "'")
 'uninstall it
      oProduct.Uninstall
      'done!
      MsgBox "Uninstalled " & sName
Next

Собственно, изменил всего одну строку:
Код:

For Each oProduct in GetObject( _
 "winmgmts:{impersonationLevel=impersonate}!\\" & sMachine & "\root\cimv2" _
 ).InstancesOf("win32_Product")

На ней же и спотыкаемся:
Цитата:

Uninstall.vbs(20, 1) Microsoft VBScript runtime error: The remote server machine does not exist
or is unavailable: 'GetObject'
Iska, ваш скрипт работает, но, к сожалению, адаптировать его к "моему" ума не хватает.

Iska 29-01-2012 17:20 1846963

Цитата:

Цитата Raistlin
Iska, ваш скрипт работает, но, к сожалению, адаптировать его к "моему" ума не хватает. »

Опишите подробно, что Вам потребно.

Raistlin 29-01-2012 17:22 1846967

Нужно получить список msi-пакетов, установленных на удаленной машине, и удалить выбранные (или выбранный).

Iska 29-01-2012 21:33 1847155

Raistlin, проще говоря, Вы хотите интерфейс.

Зачем?

Raistlin 29-01-2012 21:39 1847161

Допустим, пришел я в контору, где есть домен, но все приложения ставились вручную, без использования групповых политик. Хочу сделать через GP. Без предварительного удаления msi-пакетов установка через GP завершится неудачно (по крайней мере, для некоторых пакетов). При этом версии той же Java везде разные, поэтому жестко прошивать названия пакетов в скрипт бессмысленно.

Iska 29-01-2012 22:02 1847178

Raistlin, раз Вы знаете, что будете удалять (хотя бы частичное имя), можно проще, наподобие:
Код:

wmic.exe /node:@"c:\MachineList.txt" Product where "name like '%%XML Notepad%%'" call UnInstall
либо разбор «MachineList.txt» и асинхронный вызов «wmic.exe» посредством «start» для каждой машины из «MachineList.txt».

Raistlin 29-01-2012 22:10 1847188

Да, я такое уже накопал и даже смог воспроизвести. Правда, не скажу, что это проще :) .

Iska 30-01-2012 00:09 1847283

То же самое можно написать и на WSH/PoSH. Просто у меня, скажем, к сему нет особого стимула.


Время: 01:47.

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