0

I am doing some research to find out the best and most efficient method for this. I will need to execute remote scripts on a number of Window Servers/Computers (while we are building them).

I have a web application that is going to automate this task, I currently have my prototype working to use PsExec to execute remote scripts. This requires PsExec to be installed on the system. A colleague suggested I should use WMI for this.

I did some research in WMI and I couldn't find what I'm looking for. I want to either upload the script to the server and execute it and read the results, or already have the script on the server and execute it and read the results. I would prefer the first option though!

Which is more ideal, PsExec or WMI?

For reference, this is my prototype PsExec code. This script is only executing a small script to get the Windows OS and Service Pack Info.

Protected Sub windowsScript(ByVal COMPUTERNAME As String)
        ' Create an array to store VBScript results
        Dim winVariables(2) As String
        nameLabel.Text = Name.Text
        ' Use PsExec to execute remote scripts
        Dim Proc As New System.Diagnostics.Process
        ' Run PsExec locally
        Proc.StartInfo = New ProcessStartInfo("C:\Windows\psexec.exe")

        ' Pass in following arguments to PsExec
        Proc.StartInfo.Arguments = COMPUTERNAME & " -s cmd /C c:\systemInfo.vbs"
        Proc.StartInfo.RedirectStandardInput = True
        Proc.StartInfo.RedirectStandardOutput = True
        Proc.StartInfo.UseShellExecute = False
        Proc.Start()
        ' Pause for script to run
        System.Threading.Thread.Sleep(1500)
        Proc.Close()

        System.Threading.Thread.Sleep(2500) 'Allows the system a chance to finish with the process.
        Dim filePath As String = COMPUTERNAME & "\TTO\somefile.txt"
        'Download file created by script on Remote system to local system
        My.Computer.Network.DownloadFile(filePath, "C:\somefile.txt")
        System.Threading.Thread.Sleep(1000) ' Pause so file gets downloaded
        ''Import data from text file into variables
        textRead("C:\somefile.txt", winVariables)
        WindowsOSLbl.Text = winVariables(0).ToString()
        SvcPckLbl.Text = winVariables(1).ToString()
        System.Threading.Thread.Sleep(1000)
        ' ''Delete the file on server - we don't need it anymore
        Dim Proc2 As New System.Diagnostics.Process
        Proc2.StartInfo = New ProcessStartInfo("C:\Windows\psexec.exe")
        Proc2.StartInfo.Arguments = COMPUTERNAME & " -s cmd /C del c:\somefile.txt"
        Proc2.StartInfo.RedirectStandardInput = True
        Proc2.StartInfo.RedirectStandardOutput = True
        Proc2.StartInfo.UseShellExecute = False
        Proc2.Start()
        System.Threading.Thread.Sleep(500)
        Proc2.Close()
        ' Delete file locally
        File.Delete("C:\somefile.txt")
 End Sub
Envin
  • 1,463
  • 8
  • 32
  • 69

2 Answers2

0

From additional research, for this type of project it looks like PsExec is the best route to go.

Envin
  • 1,463
  • 8
  • 32
  • 69
0

Yes, PsExec is by far the best route to go. PsExec uses RPC to access the ADMIN$ share. However, if RPC is disabled, like in default Win7, and WMI is enabled, and there is a shared folder available to your account with read/write access, then you can use a workaround created by Frank White a few months ago using this "cmd /c echo ..." approach:

strCommand = "cmd /c echo myTextCommands > c:\temp\testscript.txt"

To see a fully-fleshed out VBScript, see my solution here

Community
  • 1
  • 1
Lizz
  • 1,442
  • 5
  • 25
  • 51