Janni: Often one needs to execute a command on a remote Windows computer,
WMI &
tcom can be used to do just that.
Together with
Jaf, we came up with this:
package require tcom; # If not already done elsewhere
proc remote_exec {command machine} {
# The impersonation part execs with your current credentials, well...as far as I understood...
# if you use "." or "localhost" as machine then the execution is in-situ
set wmistr "winmgmts:\{impersonationLevel=impersonate\}!"
append wmistr "\\\\$machine\\root\\cimv2:Win32_Process"
# get the Win32_Process class
if {[catch {::tcom::ref getobject $wmistr} wmiproc]} {
return -code error -1
}
# there is a method called Methods_, get it
set wmiprocmeth [$wmiproc Methods_]
# it contains an array, get the Create method out of it
set wmiprocmethcreat [$wmiprocmeth Item "Create"]
# get the inparameters
set inparams [[$wmiprocmethcreat InParameters] SpawnInstance_]
# The properties_ of inparams are what we are after
set cmdline [[$inparams Properties_] Item "CommandLine"]
set cwd [[$inparams Properties_] Item "CurrentDirectory"]
set pstart [[$inparams Properties_] Item "ProcessStartupInformation"]
# Set the properties
$cmdline Value $command
# cwd and pstart contain a NULL upon creation, left "as is"
# Now exec
set result [$wmiproc ExecMethod_ "Create" $inparams]
return [[[$result Properties_] Item "ReturnValue"] Value]
}
For a list of return values see here: [
1]
Description of the
Win32_Process class.