niby nic skomplikowanego i jest masa różnych tooli do tego celu. podstawowym ograniczeniem w większości jakie testowałem był brak możliwości podania user/pass. czyżby było to niemożliwe? eeee tam… oczywiście, że się da. Oto skrypcik, który pokazuje jak stworzyć moniker WMI tak, aby podać odpowiednie credsy i wykonać restart:
CONST SH_LOGOFF = 0
CONST SH_FLOGOFF = 4
CONST SH_SHUTDOWN = 1
CONST SH_FSHUTDOWN= 5
CONST SH_REBOOT = 2
CONST SH_FREBOOT = 6
CONST SH_POWEROFF = 8
CONST SH_FPOWEROFF=12
strComputer = "192.168.1.123"
'tak to sie robi normalnie:
'Set OpSysSet = GetObject("winmgmts:{impersonationLevel=impersonate,(Shutdown)}//"&strComputer&"/root/cimv2")
'a tak jest to samo, podajac credsy:
set objLocator = CreateObject("WbemScripting.SWbemLocator")
set objWMI = objLocator.ConnectServer(strComputer, "rootcimv2", "nexor", "PASSWORD")
objWMI.Security_.ImpersonationLevel = 3
objWMI.Security_.Privileges.AddAsString "SeShutdownPrivilege", True
Set colOperatingSystems = objWMI.ExecQuery("SELECT * FROM " & "Win32_OperatingSystem WHERE Primary = true")
For Each objOperatingSystem in colOperatingSystems
ObjOperatingSystem.Win32Shutdown(SH_FSHUTDOWN)
Next
jak widać cały myk jest w zamianie standardowego monikera na złożony, poprzez utworzenie obiektu SWbemLocator a potem.. no właśnie – zalezienie sposobu na definicje obiektu security i specjalnych uprawnień – wypisane w skrypcie „seShutdownPrivilege” wyszperałem w necie bo te natechnecie są jakby na odwrót – metoda AddAsString przyjmuje najwyrazniej wartości opisane w kolumnie 'descritpion’ a nie 'Wbemdisp.tlb Constant’ co wydawałoby się logiczniejsze.
Kodak
nExoR