Page 1 of 1

Run PSEXEC

Posted: 02 Apr 2020 12:35
by Docfxit
I would like to run a program on a remote PC.
I'm signed on to PC#1 at 192.168.168.7 with a user that has admin rights.
I would like to run the program on my LAN on PC#2 at 192.168.168.9. The same user is on this PC with admin rights and the same password.
I'm running a bat file that creates another bat file to run on PC#1.
I run this bat file called UpdateMacriumCreate.bat on PC#1:

Code: Select all

@Echo On
for /f "delims=[] tokens=2" %%a in ('ping -4 -n 1 %ComputerName% ^| findstr [') do set NetworkIP=%%a
echo Network IP: %NetworkIP%
(
echo: @Echo On
echo: If not exist "C:\Dnload\9xAddons\Macrium" md "C:\Dnload\9xAddons\Macrium"
echo: cd "C:\Dnload\9xAddons\Macrium"
Echo: Echo "Test 1>UpdateMacrium.log"
Echo: tasklist /fi "imagename eq UpdateMacrium.exe" 2>NUL | find /I /N "no tasks are running">NUL
Echo: if "%errorlevel%"=="0" ^(
Echo:    echo Task Found
Echo: 	taskkill /f /im UpdateMacrium.exe
Echo: ^)
Echo: Echo "Test 2>>UpdateMacrium.log"
Echo: tasklist /fi "imagename eq ReflectDLHF.exe" 2>NUL | find /I /N "no tasks are running">NUL
Echo: if "%errorlevel%"=="0" ^(
Echo:    echo Task Found
Echo: 	taskkill /f /im ReflectDLHF.exe
Echo: ^)
Echo: Echo "Test 3>>UpdateMacrium.log"
echo: xcopy /y /f "\\%NetworkIP%\Dnload\9xAddons\Macrium\ReflectDLHF.exe" "C:\Dnload\9xAddons\Macrium\ReflectDLHF.exe"
Echo: Echo "Test 4>>UpdateMacrium.log"
echo: xcopy /y /f "\\%NetworkIP%\Dnload\9xAddons\Macrium\UpdateMacrium.exe" "C:\Dnload\9xAddons\Macrium\UpdateMacrium.exe"
Echo: Echo "Test 5>>UpdateMacrium.log"
Echo: Call UpdateMacrium.exe
) > %~dp0UpdateMacriumRun.bat

c:\batch\psexec.exe @"C:\Batch\PushFileAndRunItComputerList.txt" -i -c -v -s "C:\Dnload\9xAddons\Macrium\UpdateMacriumRun.bat" 

cmd /k
It creates this bat file called UpdateMacriumRun.bat on PC#1:

Code: Select all

 @Echo On
 If not exist "C:\Dnload\9xAddons\Macrium" md "C:\Dnload\9xAddons\Macrium"
 cd "C:\Dnload\9xAddons\Macrium"
 Echo "Test 1>UpdateMacrium.log"
 if "0"=="0" (
    echo Task Found
 	taskkill /f /im UpdateMacrium.exe
 )
 Echo "Test 2>>UpdateMacrium.log"
 if "0"=="0" (
    echo Task Found
 	taskkill /f /im ReflectDLHF.exe
 )
 Echo "Test 3>>UpdateMacrium.log"
 xcopy /y /f "\\192.168.168.7\Dnload\9xAddons\Macrium\ReflectDLHF.exe" "C:\Dnload\9xAddons\Macrium\ReflectDLHF.exe"
 Echo "Test 4>>UpdateMacrium.log"
 xcopy /y /f "\\192.168.168.7\Dnload\9xAddons\Macrium\UpdateMacrium.exe" "C:\Dnload\9xAddons\Macrium\UpdateMacrium.exe"
 Echo "Test 5>>UpdateMacrium.log"
 net use U: "\\192.168.168.7\Dnload\9xAddons\Macrium"
 Call UpdateMacrium.exe
When I run the create bat file it brings up a CMD window and shows that it does run:

Code: Select all

PsExec v2.2 - Execute processes remotely
Copyright (C) 2001-2016 Mark Russinovich
Sysinternals - www.sysinternals.com

\\192.168.168.9:

cmd.exe started on 192.168.168.9 with process ID 3952.

C:\Dnload\9xAddons\Macrium>cmd /k
When I look on PC#2 at 192.168.168.9 it shows that it's running in Task Manager.
The log file "UpdateMacrium.log" is not created.
This is part of the cmd window:

Code: Select all

C:\Dnload\9xAddons\Macrium>Echo "Test 4>>UpdateMacrium.log"
"Test 4>>UpdateMacrium.log"
C:\Dnload\9xAddons\Macrium>xcopy /y /f "\\192.168.168.7\Dnload\9xAddons\Macrium\
UpdateMacrium.exe" "C:\Dnload\9xAddons\Macrium\UpdateMacrium.exe"
\\192.168.168.7\Dnload\9xAddons\Macrium\UpdateMacrium.exe -> C:\Dnload\9xAddons\
Macrium\UpdateMacrium.exe
1 File(s) copied
C:\Dnload\9xAddons\Macrium>Echo "Test 5>>UpdateMacrium.log"
"Test 5>>UpdateMacrium.log"
C:\Dnload\9xAddons\Macrium>net use U: "\\192.168.168.7\Dnload\9xAddons\Macrium"
System error 85 has occurred.
The local device name is already in use.
C:\Dnload\9xAddons\Macrium>Call UpdateMacrium.exe
I do not have the windows firewall running on either PC.
I'm running Win7 32bit Ultimate on PC#1
I'm running Win7 64bit Ultimate on PC#2
Bitdefender did stop it from running on PC#2 the first time and I added that to exceptions.
I have turned off the Bitdefender Antivirus on PC#2

I have fixed most of the problems.
I have two problems left.
1. Echo "Test 5>>UpdateMacrium.log" Is not writing out the file.
2. net use U: "\\192.168.168.7\Dnload\9xAddons\Macrium"
System error 85 has occurred.
The local device name is already in use.

Can anyone help me figure out the solutions for these two problems?

Thank you,
Docfxit

Re: Run PSEXEC

Posted: 03 Apr 2020 10:43
by aGerman
There seem to be a couple of un-escaped characters in your echo commands
E.g. the red marked here:
Echo: tasklist /fi "imagename eq UpdateMacrium.exe" 2>NUL | find /I /N "no tasks are running">NUL
Did you ever try to create the file locally in order to investigate what script content is written?

Can't tell about other errors caused by psexec. Just one note: Belonging to the admin group doesn't mean that you run the script elevated.

Steffen

Re: Run PSEXEC

Posted: 03 Apr 2020 12:23
by Docfxit
aGerman wrote:
03 Apr 2020 10:43
There seem to be a couple of un-escaped characters in your echo commands
E.g. the red marked here:
Echo: tasklist /fi "imagename eq UpdateMacrium.exe" 2>NUL | find /I /N "no tasks are running">NUL
Did you ever try to create the file locally in order to investigate what script content is written?

Can't tell about other errors caused by psexec. Just one note: Belonging to the admin group doesn't mean that you run the script elevated.

Steffen
Thanks Steffen,

That line is currently working.

This line is not working;
Echo "Test 5>>UpdateMacrium.log" Is not writing out the file.

Docfxit

Re: Run PSEXEC

Posted: 04 Apr 2020 06:04
by aGerman
That line is currently working.
Nope. It's not working at all.
Running this piece of code ...

Code: Select all

@echo off &setlocal
(
Echo: tasklist /fi "imagename eq UpdateMacrium.exe" 2>NUL | find /I /N "no tasks are running">NUL
)>"foo.bat"
... results in an empty foo.bat because the text is redirected to NUL in the Echo line.

Running this instead ...

Code: Select all

@echo off &setlocal
(
Echo: tasklist /fi "imagename eq UpdateMacrium.exe" 2^>NUL ^| find /I /N "no tasks are running"^>NUL
)>"foo.bat"
... writes ...

Code: Select all

 tasklist /fi "imagename eq UpdateMacrium.exe" 2>NUL | find /I /N "no tasks are running">NUL
... into foo.bat.
That's the reason why I strongly recommend you to make tests locally in order to investigate what you're doing.
Echo "Test 5>>UpdateMacrium.log" Is not writing out the file.
No wonder. The whole redirection is quoted and thus, it's only a string instead of executable code.

Steffen

Re: Run PSEXEC

Posted: 04 Apr 2020 20:37
by Docfxit
Hi Steffen,

You are 100% correct. I didn't catch that it wasn't writing the code to the run.bat file.
I am not good with writing .bat scripts. I'm trying to learn. Now that you showed me how to correct the code
Should I change the post above or should I create a new post with the correct code below?

I removed the quotes in this code:

Code: Select all

@echo off &setlocal
(
Echo: Echo Test 1 >%~dp0UpdateMacrium.log
)>"foo.bat"
And nothing gets written out to foo.bat

What is the correct way to get it to write to the foo.bat file?

Thank you very much,
Docfxit

Re: Run PSEXEC

Posted: 05 Apr 2020 06:01
by aGerman
What is the correct way to get it to write to the foo.bat file?
Probably

Code: Select all

@echo off &setlocal
(
Echo: Echo Test 1 ^>%%~dp0UpdateMacrium.log
)>"foo.bat"
Batch101 for escaping:
^ to ^^
< to ^<
> to ^>
| to ^|
& to ^&
% to %%

Every single character of those has to be escaped this way, unless they occur in a quoted string.
Also refer to https://ss64.com/nt/syntax-esc.html

Steffen

Re: Run PSEXEC

Posted: 05 Apr 2020 19:39
by Docfxit
When I run this bat file:

Code: Select all

 @Echo On
 setlocal enableDelayedExpansion

 set "cmd=tasklist.exe /fi "imagename eq UpdateMacrium.exe" /FI "IMAGENAME eq %1" /FI "PID eq %2""
 for /F "delims=*" %%p in ('!cmd! ^| findstr "%2" ') do (
    echo Task Found
 	taskkill /f /im UpdateMacrium.exe
 )
This is what is produced in the cmd window:

Code: Select all

C:\Dnload\9xAddons\Macrium>set "cmd=tasklist.exe /fi "imagename eq UpdateMacrium.exe" /FI "IMAGENAME eq " /FI "PID eq ""

C:\Dnload\9xAddons\Macrium>for /F "delims=*" %p in ('!cmd! | findstr "" ') do (
echo Task Found
 taskkill /f /im UpdateMacrium.exe
)
FINDSTR: No search strings
ERROR: The search filter cannot be recognized.
How can the code be changed to make this work?

Thank you,
Docfxit

Re: Run PSEXEC

Posted: 05 Apr 2020 23:28
by ShadowThief
The code isn't broken, you just never gave it the PID to search for. As written, the script expects two arguments: the application name as it appears in tasklist and the PID of the running task, in that order.

Re: Run PSEXEC

Posted: 06 Apr 2020 10:48
by Docfxit
ShadowThief wrote:
05 Apr 2020 23:28
The code isn't broken, you just never gave it the PID to search for. As written, the script expects two arguments: the application name as it appears in tasklist and the PID of the running task, in that order.
I'm trying to figure out if the program is running. I found the original way I was doing it with tasklist it doesn't produce errorlevel so I tried adapting it to the above code from this link:
https://stackoverflow.com/questions/496 ... batch-file

If the program isn't running there won't be a PID. Does anyone know how to test to see if a program is running, and if it is kill it?

Thank you,

Docfxit

Re: Run PSEXEC

Posted: 06 Apr 2020 17:43
by ShadowThief

Code: Select all

taskkill /IM UpdateMacrium.exe
If it's running, it gets killed. If it's not running, you get an error message and nothing else happens. You can even stick a 2>nul at the end of the code if you don't want the error message.