• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 2421
  • Last Modified:

execute cmd script on multiple computers

I have a script script.cmd which I want to execute on half of the computers in our organization.
Could you tell me how to do it?
Most of workstations are XP SP3, and a couple win7
0
dedri
Asked:
dedri
  • 6
  • 4
  • 4
1 Solution
 
Steven HarrisPresidentCommented:
Try using a PowerShell .ps1 file with this script from Mohamed Garrana:

# ============================================================================================== 
#   
# Script Name : Run Remote cmd.exe Commands 
#  
# AUTHOR: Mohamed Garrana  
# DATE  : 4/12/2010 
#  
# COMMENT:  
# this script invokes whatever command you can use in cmd.exe on one or more computers 
#you input the command name as a screen input when you run the script 
#you can use all cmd.exe command like [del,ipconfig /flushdns,ipconfig /registerdns,gpupdate /force ,notepad.exe,defrag c:, ... 
#..wuauclt /detectnow,powercfg,net start ,net stop,copy,arp,wscript.exe ....] 
#if you can do it from cmd.exe you can do it here on multiple computers at the same time 
# ============================================================================================== 
 
 
function Run-RemoteCMD { 
 
    param( 
    [Parameter(Mandatory=$true,valuefrompipeline=$true)] 
    [string]$compname) 
    begin { 
        $command = Read-Host " Enter command to run" 
        [string]$cmd = "CMD.EXE /C " +$command 
                        } 
    process { 
        $newproc = Invoke-WmiMethod -class Win32_process -name Create -ArgumentList ($cmd) -ComputerName $compname 
        if ($newproc.ReturnValue -eq 0 ) 
                { Write-Output " Command $($command) invoked Sucessfully on $($compname)" } 
                # if command is sucessfully invoked it doesn't mean that it did what its supposed to do 
                #it means that the command only sucessfully ran on the cmd.exe of the server 
                #syntax errors can occur due to user input  
     
     
     
     
    } 
    End{Write-Output "Script ...END"} 
                 } 
     
 
#---------------- 
#you can use this script to run any command that can be run on CMD.EXE 
#the following is only to give you an idea how can you use it 
#----------------- 
#for copying files from many remote computers to a single 
# get-content c:\servers.txt | Run-Remotecommand 
#Enter command to run: copy c:\log\log.txt d:\ 
#you only input "copy c:\log\log.txt d:\" 
#--------------------------------------- 
#for forcing group policy update on multiple computers 
# get-content c:\servers.txt | Run-Remotecommand 
#Enter command to run: gpupdate /force 
#-------------------------------------- 
#for stopping the Bits service on multiple computers 
# get-content c:\servers.txt | Run-Remotecommand 
#Enter command to run: Net stop bits 
#--------- 
#you can always run it against a single server using  
#Run-RemoteCommand server1 
#Enter command to run: enter whatever you'd normally enter in cmd.exe shell 
 
 
 

Open in new window

1
 
Steven HarrisPresidentCommented:
If you want to stay away from PowerShell, you can use PsExec from the Sysinternals toolkit:

Make a list of servers/machines - Servers.txt  and then run -

psexec @Servers.txt -c Script.cmd

This will copy over the script and then execute on each machine.
0
 
McKnifeCommented:
3rd possible way: simply wrap that script into an msi using any msi wrapper like exetomsi or wiww. That way, you don't even need to power on those machines, they will do "install" that setting whenever they power on and decide to accept that policy.
0
The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!

 
dedriAuthor Commented:
ThinkSpaceSolutions, could you explain how to work with first script.
I found a script in this link which uses psexec, but I have a problem running it.
http://community.spiceworks.com/scripts/show/446-remote-execution-on-multiple-computers

If I run it manually here is the result
C:\temp\ExecMC>psexec \\computer1 -c \\server\share\scripts\Unreg.cmd

Here is the content of the cmd file
########

@Echo off

Echo *
Echo * SIGNME AS COM SERVER
Echo *

signme.exe /unregserver

Echo *
Echo * REGISTER ASSEMBLY
Echo *

%WINDIR%\Microsoft.NET\Framework\v1.1.4322\regasm /unregister signme.base.dll /tlb /v

rem fin:

##########

------------Here is the result from execution of the command---------

PsExec v1.98 - Execute processes remotely
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com


*
'signme.exe' is not recognized as an internal or external command,
operable program or batch file.
* SIGNME AS COM SERVER
*
*
* REGISTER ASSEMBLY
*
Microsoft (R) .NET Framework Assembly Registration Utility 1.1.4322.573
Copyright (C) Microsoft Corporation 1998-2002.  All rights reserved.

RegAsm error: Unable to locate input assembly: 'signme.base.dll'
Unreg.cmd exited on computer1 with error code 0.

--------------------------------

If I psexec the computer, browse the script on local folder and run it , it's executed successful.
Any idea how to fix it?
0
 
Steven HarrisPresidentCommented:
This is how I use it:

First, you should navigate to the location of the folder that file is located on your local machine.  For example, my scripts are stored on my file server 'TSShare' (mapped as T:\) under the Scripts folder.

T:\Scripts>

Then I call my list of servers, add -c to copy to the servers, then the script:

T:\Scripts> @T:\Servers\ServerSet1.txt -c Script1.bat

Is this the same format you are using?
0
 
dedriAuthor Commented:
sorry, I didn't understand your answer.

What I am doing is the following:
psexec \\computer1 -c \\server\share\scripts\Unreg.cmd
or
psexec \\computer1 Unreg.cmd
or anything similar

And the output is

------------Here is the result from execution of the command---------

PsExec v1.98 - Execute processes remotely
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com


*
'signme.exe' is not recognized as an internal or external command,
operable program or batch file.
* SIGNME AS COM SERVER
*
*
* REGISTER ASSEMBLY
*
Microsoft (R) .NET Framework Assembly Registration Utility 1.1.4322.573
Copyright (C) Microsoft Corporation 1998-2002.  All rights reserved.

RegAsm error: Unable to locate input assembly: 'signme.base.dll'
Unreg.cmd exited on computer1 with error code 0.

--------------------------------

If I do this:

psexec \\computer1 cmd
and on the prompt I run Unreg.cmd it is executed successful.

Anything different on both cases and idea how to make it working.
0
 
Steven HarrisPresidentCommented:
Try creating a copy of your .cmd and changing the association to .bat.
0
 
dedriAuthor Commented:
I tried changing the script file from .cmd to .bat , but the problem still exist, the same error message as above.
0
 
McKnifeCommented:
Why not use a wrapper like I recommended? As I described: it holds even more advantaged compared to psexec.
0
 
dedriAuthor Commented:
McKnife, could you explain in more details your solution.
I cannot understand what to do when I  create a msi package for this script.
0
 
McKnifeCommented:
An MSI-Wrapper creates MSI-packages of a special kind: those packages execute commands or as a second option, start setup.exe files using parameters for silent installation. In your case, we want to execute a custom script.
So download wiww from vinsvision and install it. Create your custom MSI package from your script, assign it to computers and there you go: next time the computers start, the MSI gets installed and with it, your script gets executed using the installation account (=system account) once on every system.
0
 
dedriAuthor Commented:
sorry for late response. I haven't got any time recently. I'll try your solution and give you reply.
0
 
McKnifeCommented:
Please respond or finalize it, this question is growing old :)
0
 
dedriAuthor Commented:
sorry, I didn't have time to test your solution. I was appointed to another project
0

Featured Post

[Webinar] Kill tickets & tabs using PowerShell

Are you tired of cycling through the same browser tabs everyday to close the same repetitive tickets? In this webinar JumpCloud will show how you can leverage RESTful APIs to build your own PowerShell modules to kill tickets & tabs using the PowerShell command Invoke-RestMethod.

  • 6
  • 4
  • 4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now