1

Тема: VBA создание процесса WMI

Собсно есть код, простой как 3 копейки.

Const SW_NORMAL = 1
strComputer = "."          'локальная машина
strCommand = "Notepad.exe" 
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")

' настройка окна для показа блокнота
Set objStartup = objWMIService.Get("Win32_ProcessStartup")
Set objConfig = objStartup.SpawnInstance_
objConfig.ShowWindow = SW_NORMAL

' создаем блокнот через Win32_Process
Set objProcess = objWMIService.Get("Win32_Process")
intReturn = objProcess.Create _
    (strCommand, Null, objConfig, intProcessID)
If intReturn <> 0 Then
    Wscript.Echo "Process could not be created." & _
        vbNewLine & "Command line: " & strCommand & _
        vbNewLine & "Return value: " & intReturn
Else
    Wscript.Echo "Process created." & _
        vbNewLine & "Command line: " & strCommand & _
        vbNewLine & "Process ID: " & intProcessID
End If

Нужно выполнить его на удаленной машине, на что он ругается, кричит про доступ и GetObject, и это логично. На удаленной машине используется учетка отличная от моей, и комп не в домене. Покопавшись нашел что-то близкое, по идее:

strComputer = "acapulco" 'name of a remote computer
wmiNS = "\root\cimv2"
wmiClass = "win32_NetworkProtocol"
wmiWhere = " where name like '%TCP/IP%'"
wmiQuery = "Select * from " & wmiClass & wmiWhere
[b]strUsr ="nwtraders\LondonAdmin"'Domain\Username
strPWD = "P@ssw0rd"'UserNames password[/b]
Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objLocator.ConnectServer(strComputer, wmiNS, _
strUsr, strPWD)
Set colItems = objWMIService.ExecQuery(wmiQuery)

Но, к сожалению, тут подключение идет через SWbemLocator, в виду чего для запуска процесса я потом не могу использовать objWMIService, как быть?

2

Re: VBA создание процесса WMI

можешь, точно так же как и в первом скрипте

Я конечно далек от мысли... (с)

3

Re: VBA создание процесса WMI

т.е.

Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2", user, pass)

?
Тогда ругается, что у GetObject слишком много параметров.

4

Re: VBA создание процесса WMI

Пример:

Const IMPERSONATE = 3
Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Set objService = objLocator.ConnectServer(strComputer, "root\cimv2", strDomain & "\" & strUser, strUserPass)
objService.Security_.ImpersonationLevel = IMPERSONATE
Set objInstance = objService.Get("Win32_Process")
intResult = objInstance.Create(strProcess, Null, Null, intProcID)

Учтите, что с помощью класса Win32_Process невозможно запустить интерактивный процесс на удалённой станции.
Сам-то процесс запустится, но текущий пользователь удалённой станции не сможет с ним взаимодействовать.
Для запуска интерактивного процесса необходимо использовать планировщик, то есть класс Win32_ScheduledJob.

5

Re: VBA создание процесса WMI

Благодарствую, буду пробовать.
По поводу интерактивности - оно и не требовалось, как раз юзверям мешать и не надо