Is the remote machine running Windows? If so, you can always call "psexec" from Delphi. Or you can use WMI to remotely execute a process (assuming the remote host is running some version of Windows)
Here is a complete example in Delphi, taken from here. You need the WbemScripting_TLB unit, which you can create by installing the type library %windir%\System32\wbem\wbemdisp.tlb using the "Component|Import Component|Import a Type Library" menu options within Delphi 2007.
unit Unit1;
interface
uses
Windows,
Messages,
SysUtils,
Variants,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
StdCtrls,
ComCtrls;
type
TForm1 = class(TForm)
btnExecute: TButton;
edtProgramToExecute: TEdit;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
edtRemoteMachine: TEdit;
edtUser: TEdit;
edtPassword: TEdit;
procedure btnExecuteClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses WbemScripting_TLB;
function remoteExecute(programName: string; machine: string = ''; user: string = '';
password: string = ''): string;
var
SWbemLocator1: TSWbemLocator;
Service: ISWbemServices;
InParam,
OutParam, SObject: ISWbemObject;
Method: ISWbemMethod;
SProp1
, SProp2, MyProperty
: ISWbemProperty;
s, methodName: string;
PropValue: OleVariant;
begin
methodName := 'Create';
// CoInitialize(nil);
SWbemLocator1 := TSWbemLocator.Create(nil);
if machine = '' then
machine := '.';
Service := SWbemLocator1.ConnectServer(machine, 'root\CIMV2', user, password, '', '',
0, nil);
Service.Security_.Set_ImpersonationLevel(wbemImpersonationLevelImpersonate);
SObject := Service.Get('Win32_Process', 0, nil);
Method := SOBject.Methods_.Item(methodName, 0);
InParam := Method.InParameters.SpawnInstance_(0);
MyProperty := InParam.Properties_.Add('CommandLine', wbemCimtypeString, False, 0);
PropValue := programName;
MyProperty.Set_Value(PropValue);
MyProperty := InParam.Properties_.Add('CurrentDirectory', wbemCimtypeString, False, 0);
PropValue := Null;
MyProperty.Set_Value(PropValue);
MyProperty := InParam.Properties_.Add('ProcessStartupInformation', wbemCimtypeObject,
False, 0);
PropValue := Null;
MyProperty.Set_Value(PropValue);
OutParam := SObject.ExecMethod_(methodName, InParam, 0, nil);
// OutParam:= SObject.ExecMethod_(methodName, nil, 0, nil);
SProp1 := outParam.Properties_.Item('ReturnValue', 0);
SProp2 := outParam.Properties_.Item('ProcessId', 0);
case SProp1.Get_Value of
0: s := 'Successful completion.';
2: s := 'Access denied.';
3: s := 'Insufficient privilege.';
8: s := 'Unknown failure.';
9: s := 'Path not found.';
21: s := 'Invalid parameter.';
else
s := 'Unknown reply code!';
end;
SWbemLocator1.Free;
service := nil;
SObject := nil;
OutParam := nil;
SProp1 := nil;
result := s + '(PID=' + inttostr(SProp2.Get_Value) + ')';
// CoUninitialize;
end;
procedure TForm1.btnExecuteClick(Sender: TObject);
begin
statusbar1.simpletext := remoteExecute(edit1.text, edit2.text, edit3.text, edit4.text);
end;
end.
You can also do this in VBScript:
Here's a VBScript snippet that demonstrates how this would work.
' This script provides a function for executing a command on a remote computer
' This uses WMI and requires that you have administrative righs on the remote machine
'
Dim strComputer, strCommandLineToRun
'change the period to an IP Address or computer name
strComputer = "." 'example: strComputer = "192.168.1.105"
'this is the path to the file on the computer whose name/IP address is stored in the strComputer variable
strCommandLineToRun = "c:\windows\system32\calc.exe"
' This calls the function to run the process on a remote computer
RemoteExecute strComputer,"","",strCommandLineToRun
Function RemoteExecute(strServer, strUser, strPassword, CmdLine)
Const Impersonate = 3
RemoteExecute = -1
Set Locator = CreateObject("WbemScripting.SWbemLocator")
Set Service = Locator.ConnectServer(strServer, "root\cimv2", strUser, strPassword)
Service.Security_.ImpersonationLevel = Impersonate
Set Process = Service.Get("Win32_Process")
result = Process.Create(CmdLine, , , ProcessId)
If (result <> 0) Then
WScript.Echo "Creating Remote Process Failed: " & result
Wscript.Quit
End If
RemoteExecute = ProcessId
End Function