Created
November 19, 2020 02:17
-
-
Save RaRaRatchet/00fcf44fdc8184fe4be671329bec4221 to your computer and use it in GitHub Desktop.
[PSexec] RunPsexec #psexec
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@echo off | |
:: by Ralph Buchfelder, thanks to Mark Russinovich and Rob van der Woude for their work! | |
:: requires PsExec.exe to be in the same directory (download from http://technet.microsoft.com/de-de/sysinternals/bb897553.aspx) | |
:: troubleshoot remote commands with PsExec arguments -i or -s if neccessary (see http://forum.sysinternals.com/pstools_forum8.html) | |
:: will run *in parallel* on a list of remote pcs (if given); to run serially please remove 'START "" CMD.EXE /C' from the psexec call | |
:: help | |
if '%1' =='-h' ( | |
echo. | |
echo %~n0 | |
echo. | |
echo Runs a command on one or many remote machines. If no input parameters | |
echo are given you will be asked for a target remote machine. | |
echo. | |
echo You will be prompted for remote credentials with elevated privileges. | |
echo. | |
echo UNC paths and local paths can be supplied. | |
echo Commands will be executed on the remote side just the way you typed | |
echo them, so be sure to mind extensions and the path variable! | |
echo. | |
echo Please note that PsExec.exe must be allowed on remote machines, i.e. | |
echo not blocked by firewall or antivirus solutions. | |
echo. | |
echo Syntax: %~n0 [^<inputfile^>] | |
echo. | |
echo inputfile = a plain text file ^(one hostname or ip address per line^) | |
echo. | |
echo. | |
echo Example: | |
echo %~n0 mylist.txt | |
exit /b 0 | |
) | |
:checkAdmin | |
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" | |
if '%errorlevel%' neq '0' ( | |
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs" | |
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs" | |
"%temp%\getadmin.vbs" | |
del "%temp%\getadmin.vbs" | |
exit /B | |
) | |
set ADMINTESTDIR=%WINDIR%\System32\Test_%RANDOM% | |
mkdir "%ADMINTESTDIR%" 2>NUL | |
if errorlevel 1 ( | |
cls | |
echo ERROR: This script requires elevated privileges! | |
echo. | |
echo Launch by Right-Click / Run as Administrator ... | |
pause | |
exit /b 1 | |
) else ( | |
rd /s /q "%ADMINTESTDIR%" | |
echo Running with elevated privileges... | |
) | |
echo. | |
:checkRequirements | |
if not exist "%~dp0PsExec.exe" ( | |
echo PsExec.exe from Sysinternals/Microsoft not found | |
echo in %~dp0 | |
echo. | |
echo Download from http://technet.microsoft.com/de-de/sysinternals/bb897553.aspx | |
echo. | |
pause | |
exit /B | |
) | |
:environment | |
setlocal | |
echo. | |
echo %~n0 | |
echo _____________________________ | |
echo. | |
echo Working directory: %cd%\ | |
echo Script directory: %~dp0 | |
echo. | |
SET /P REMOTE_USER=Domain\Administrator : | |
SET "psCommand=powershell -Command "$pword = read-host 'Kennwort' -AsSecureString ; ^ | |
$BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^ | |
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)"" | |
for /f "usebackq delims=" %%p in (`%psCommand%`) do set REMOTE_PASS=%%p | |
if NOT DEFINED REMOTE_PASS SET /P REMOTE_PASS=Password : | |
echo. | |
if '%1' =='' goto menu | |
SET REMOTE_LIST=%1 | |
:inputMultipleTargets | |
if not exist %REMOTE_LIST% ( | |
echo File %REMOTE_LIST% not found | |
goto menu | |
) | |
type %REMOTE_LIST% >nul | |
if '%errorlevel%' neq '0' ( | |
echo Access denied %REMOTE_LIST% | |
goto menu | |
) | |
set batchProcessing=true | |
echo Batch processing: %REMOTE_LIST% ... | |
ping -n 2 127.0.0.1 >nul | |
goto runOnce | |
:menu | |
if exist "%~dp0last.computer" set /p LAST_COMPUTER=<"%~dp0last.computer" | |
if exist "%~dp0last.listing" set /p LAST_LISTING=<"%~dp0last.listing" | |
if exist "%~dp0last.directory" set /p LAST_DIRECTORY=<"%~dp0last.directory" | |
if exist "%~dp0last.command" set /p LAST_COMMAND=<"%~dp0last.command" | |
if exist "%~dp0last.timestamp" set /p LAST_TIMESTAMP=<"%~dp0last.timestamp" | |
echo. | |
echo. | |
echo (1) select target computer [default] | |
echo (2) select multiple computers | |
echo ----------------------------------- | |
echo last target : %LAST_COMPUTER% | |
echo last listing: %LAST_LISTING% | |
echo last path : %LAST_DIRECTORY% | |
echo last command: %LAST_COMMAND% | |
echo last run : %LAST_TIMESTAMP% | |
echo ----------------------------------- | |
echo (0) exit | |
echo. | |
echo ENTER your choice. | |
echo. | |
echo. | |
:mychoice | |
SET /P mychoice=(0, 1, ...): | |
if NOT DEFINED mychoice goto promptSingleTarget | |
if "%mychoice%"=="1" goto promptSingleTarget | |
if "%mychoice%"=="2" goto promptMultipleTargets | |
if "%mychoice%"=="0" goto end | |
goto mychoice | |
:promptMultipleTargets | |
echo. | |
echo Please provide an input file | |
echo [one IP address or hostname per line] | |
SET /P REMOTE_LIST=Filename : | |
goto inputMultipleTargets | |
:promptSingleTarget | |
SET batchProcessing= | |
echo. | |
echo Please provide a hostname | |
SET /P REMOTE_COMPUTER=Target computer : | |
goto runOnce | |
:runOnce | |
cls | |
echo Note: Paths are mandatory for CMD-commands (e.g. dir,copy) to work! | |
echo Paths are provided on the remote machine via PUSHD. | |
echo. | |
SET /P REMOTE_PATH=UNC-Path or folder : | |
SET /P REMOTE_CMD=Command with params: | |
SET REMOTE_TIMESTAMP=%DATE% %TIME:~0,8% | |
echo. | |
echo Remote command starting (%REMOTE_PATH%\%REMOTE_CMD%) on %REMOTE_TIMESTAMP%... | |
if not defined batchProcessing goto runOnceSingle | |
:runOnceMulti | |
REM do for each line; this circumvents PsExec's @file to have stdouts separately | |
SET REMOTE_LOG=%~dp0\log\%REMOTE_LIST% | |
if not exist %REMOTE_LOG% md %REMOTE_LOG% | |
for /F "tokens=*" %%A in (%REMOTE_LIST%) do ( | |
if "%REMOTE_PATH%" =="" START "" CMD.EXE /C ^(%~dp0PSEXEC -u %REMOTE_USER% -p %REMOTE_PASS% -h -accepteula \\%%A cmd /c "%REMOTE_CMD%" ^>"%REMOTE_LOG%\%%A.log" 2^>"%REMOTE_LOG%\%%A_debug.log" ^) | |
if not "%REMOTE_PATH%" =="" START "" CMD.EXE /C ^(%~dp0PSEXEC -u %REMOTE_USER% -p %REMOTE_PASS% -h -accepteula \\%%A cmd /c "pushd %REMOTE_PATH% && %REMOTE_CMD% & popd" ^>"%REMOTE_LOG%\%%A.log" 2^>"%REMOTE_LOG%\%%A_debug.log" ^) | |
) | |
goto restart | |
:runOnceSingle | |
SET REMOTE_LOG=%~dp0\log | |
if not exist %REMOTE_LOG% md %REMOTE_LOG% | |
if "%REMOTE_PATH%" =="" %~dp0PSEXEC -u %REMOTE_USER% -p %REMOTE_PASS% -h -accepteula \\%REMOTE_COMPUTER% cmd /c "%REMOTE_CMD%" >"%REMOTE_LOG%\%REMOTE_COMPUTER%.log" 2>"%REMOTE_LOG%\%REMOTE_COMPUTER%_debug.log" | |
if not "%REMOTE_PATH%" =="" %~dp0PSEXEC -u %REMOTE_USER% -p %REMOTE_PASS% -h -accepteula \\%REMOTE_COMPUTER% cmd /c "pushd %REMOTE_PATH% && %REMOTE_CMD% & popd" >"%REMOTE_LOG%\%REMOTE_COMPUTER%.log" 2>"%REMOTE_LOG%\%REMOTE_COMPUTER%_debug.log" | |
goto restart | |
:restart | |
echo. | |
echo. | |
echo Batch completed. Finished with last errorlevel %errorlevel% . | |
echo All outputs have been saved to %~dp0log\%REMOTE_TIMESTAMP%\. | |
echo %REMOTE_PATH% >"%~dp0last.directory" | |
echo %REMOTE_CMD% >"%~dp0last.command" | |
echo %REMOTE_LIST% >"%~dp0last.listing" | |
echo %REMOTE_COMPUTER% >"%~dp0last.computer" | |
echo %REMOTE_TIMESTAMP% >"%~dp0last.timestamp" | |
SET REMOTE_PATH= | |
SET REMOTE_CMD= | |
SET REMOTE_LIST= | |
SET REMOTE_COMPUTER= | |
SET REMOTE_LOG= | |
SET REMOTE_TIMESTAMP= | |
ping -n 2 127.0.0.1 >nul | |
goto menu | |
:end | |
SET REMOTE_USER= | |
SET REMOTE_PASS= |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment