|
|
Удаленное удаление 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
Удаляет-то, может, он и удаленно, »
|
Тоже локально.
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
|
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, ваш скрипт работает, но, к сожалению, адаптировать его к "моему" ума не хватает.
|
Цитата:
Цитата Raistlin
Iska, ваш скрипт работает, но, к сожалению, адаптировать его к "моему" ума не хватает. »
|
Опишите подробно, что Вам потребно.
|
Нужно получить список msi-пакетов, установленных на удаленной машине, и удалить выбранные (или выбранный).
|
Raistlin, проще говоря, Вы хотите интерфейс.
Зачем?
|
Допустим, пришел я в контору, где есть домен, но все приложения ставились вручную, без использования групповых политик. Хочу сделать через GP. Без предварительного удаления msi-пакетов установка через GP завершится неудачно (по крайней мере, для некоторых пакетов). При этом версии той же Java везде разные, поэтому жестко прошивать названия пакетов в скрипт бессмысленно.
|
Raistlin, раз Вы знаете, что будете удалять (хотя бы частичное имя), можно проще, наподобие:
Код:
wmic.exe /node:@"c:\MachineList.txt" Product where "name like '%%XML Notepad%%'" call UnInstall
либо разбор «MachineList.txt» и асинхронный вызов «wmic.exe» посредством «start» для каждой машины из «MachineList.txt».
|
Да, я такое уже накопал и даже смог воспроизвести. Правда, не скажу, что это проще :) .
|
То же самое можно написать и на WSH/PoSH. Просто у меня, скажем, к сему нет особого стимула.
|
Время: 01:47.
© OSzone.net 2001-