Page 1 of 1

Interactive Remote command execution through wmic

Posted: 18 May 2012 11:48
by MKANET
I'm very new to using wmic. I would like to redirect the output of a remotely executed command to my local PC. Currently, I have to write to a temp file located on the remote machine in order to see the result.


wmic /node:S8DCAB1 process call create "cmd.exe /c dir c:\ >C:\Windows\Temp\result.txt"

find "file.txt" \\S8dcab1\C$\Windows\Temp\result.txt
if not errorlevel 1 echo -found file.txt
if errorlevel 1 echo -didn't find file.txt


Ideally, I would like to to do this in one go; where the output is redirected directly to my local find command.

Something like this (if it were to work)
wmic /node:S8DCAB1 process call create "cmd.exe /c dir c:\" | find "file.txt"

Re: Interactive Remote command execution through wmic

Posted: 18 May 2012 12:21
by MKANET
In case there's no way to do what I want within wmic, I would like to make something that does it for me; however, I'm still running into a problem... I can't take the result from call :Remoteexec and redirect it to the find command. :(



call :RemoteExec "dir c:\" | find file.txt




REM REMOTE EXECUTION
:RemoteExec
wmic /node:%UserInput% process call create "cmd.exe /c %~1 >C:\Windows\Temp\rexec.tmp"
type \\%UserInput%\C$\Windows\Temp\rexec.tmp
del /q \\%UserInput%\C$\Windows\Temp\rexec.tmp >nul
exit /b

Re: Interactive Remote command execution through wmic

Posted: 18 May 2012 13:50
by aGerman
The "call create" creates a cmd process on the remote machine. You can't redirect the output of the remote process to the local cmd process.
Seems you just need to find a specific file. Try:

Code: Select all

wmic /node:"S8DCAB1" datafile where name="c:\\file.txt" get status | find "OK"
echo %errorlevel%

Regards
aGerman

Re: Interactive Remote command execution through wmic

Posted: 18 May 2012 15:08
by MKANET
Thanks for the quick reply aGerman. I just used finding a file as an example to make things simpler to explain.

Since I have your attention, maybe you can still help.


I am ultimately trying to to execute commands on remote machines conveniently. I thought psexec would work (System Internals utility), however, I kept getting the below errors even when the syntax was correct
ERROR: Input redirection is not supported, exiting the process immediately.

So, I thought I would make my own psexec replacement revolved around wmic. I am able to use psexec.cmd (code below). However, if a file takes too long to process, I get the error message that the temp file is still being used by the process (temp file is still being written).

I figured out a way to detect when the file is no longer in use. But then to my horror.. I realized I AM GET THE SAME DAMN ERROR I did using the System Internals utility!!!
ERROR: Input redirection is not supported, exiting the process immediately.

aGerman, could you please help me to avoid that error. I don't even know exactly why it's happening. I just want a reasonable solution to return the output of a command I execute on a remote machine; even if the output takes several seconds to finish.

Code for PSexec.cmd

usage syntax Examples:
\\servername command arg arg arg
servername command blah blah blah

Code: Select all

@echo off
FOR /F "tokens=1,*" %%A in ("%*") do (
    set UserInput=%%A
    set command=%%B
)

if %UserInput:~0,2%==\\ (
        set UserInput=%UserInput:~2%
)

wmic /node:%UserInput% process call create "cmd.exe /c %command% >C:\Windows\Temp\rexec.tmp" 1>NUL 2>&1

:tryagain
move \\%UserInput%\C$\Windows\Temp\rexec.tmp \\%UserInput%\C$\Windows\Temp\rexec.tmp 2>NUL >NUL
if %errorlevel%==1 timeout /t 1 >nul &goto tryagain

type \\%UserInput%\C$\Windows\Temp\rexec.tmp
del /q \\%UserInput%\C$\Windows\Temp\rexec.tmp >nul
exit /b

Re: Interactive Remote command execution through wmic

Posted: 18 May 2012 16:48
by aGerman
Well I don't have a network and I don't have the permissions to try those on our companys network. All I can test is using my own %USERDOMAIN% where your code works whithout problems.

BTW I can't find an "input redirection" in your code. No idea why the error occurs. Try to run with "echo on" to figure out which line causes the error.

Regards
aGerman

Re: Interactive Remote command execution through wmic

Posted: 18 May 2012 17:33
by MKANET
AGerman, I think that error must come from wmi. Maybe Microsoft's Psexec.exe uses wmi as well? I guess it also very important what's being sent to the remote console that needs to be echoed back. One of the commands I send to psexec has a comma in it. It appears that the wmi command gets confused even though the comma is within the two double quotes for the command line it needs to execute.

Re: Interactive Remote command execution through wmic

Posted: 18 May 2012 21:20
by MKANET
Edit:

For whatever reasons, there seems to be some limitations using microsoft's psexec.exe and even WMI. The problems may be either related to permissions/timing during redirected output, etc.

My solution.... remote execution with the help of windows scheduler! Command execution is much more reliable and also instant! I also added a -d switch for executing commands that don't need to wait for output. I think this might be the first time I made a useful command line tool that works better than anything I could find available online :)

Same usage syntax; pretty much identical to psexec.exe from MS:

Code: Select all

@echo off
set count=""
set noredirectout=""

FOR /F "tokens=1,*" %%A in ("%*") do (
    set UserInput=%%A
    set command=%%B
)

if %UserInput%==-d (
        FOR /F "tokens=1*" %%A in ("%command%") do (
        set UserInput=%%A
        set command=%%B
        set noredirectout=yes
)
)


if %UserInput:~0,2%==\\ (
        set UserInput=%UserInput:~2%
)



if not %noredirectout%==yes goto redirect

SCHTASKS /S %UserInput% /Create /F /SC DAILY /ST 00:00 /TN "tempTASK" /RU "" /TR "cmd.exe /c %command% >C:\Windows\Temp\rexec.tmp"

>nul
SCHTASKS /END /S %UserInput% /TN "tempTASK" >nul
SCHTASKS /RUN /S %UserInput% /TN "tempTASK" >nul
SCHTASKS /S %UserInput% /TN "tempTASK" /DELETE /F >nul


goto end
:redirect
SCHTASKS /S %UserInput% /Create /F /SC DAILY /ST 00:00 /TN "tempTASK" /RU "" /TR "cmd.exe /c %command% >C:\Windows\Temp\rexec.tmp"

>nul
SCHTASKS /END /S %UserInput% /TN "tempTASK" >nul
SCHTASKS /RUN /S %UserInput% /TN "tempTASK" >nul
SCHTASKS /S %UserInput% /TN "tempTASK" /DELETE /F >nul


:tryagain
move \\%UserInput%\C$\Windows\Temp\rexec.tmp \\%UserInput%\C$\Windows\Temp\rexec.tmp 2>NUL >NUL
if %errorlevel%==1 (
    timeout /t 1 >nul
    set /a count=count+1
    if %count%==20 echo Remote command could not complete &goto end
    goto tryagain
)
type \\%UserInput%\C$\Windows\Temp\rexec.tmp
del /q \\%UserInput%\C$\Windows\Temp\rexec.tmp >nul


:end
exit /b


Re: Interactive Remote command execution through wmic

Posted: 01 Mar 2013 12:36
by pschuetze
I have the same error that you had. I turned the echo on and the result see below. The timeout command is complaining. That should be easy to fix, since I only needed a sleep.

E:\....>IF 1 == 1 (timeout /t 5 /nobreak )
ERROR: Input redirection is not supported, exiting the process immediately.