2011-07-25 51 views
0

我正在为我的工作写一个Web服务(WCF),我正在寻找一种方法来在其他机器上按需运行脚本 。
我们得到了我们从RDC连接的机器,并且我想从另一个C#程序运行它的脚本 。
另外,我似乎无法找到一种方法来在C#的另一台机器上运行可执行文件。在C机器上运行脚本从其他机器#

回答

1

为什么你不能找到.net框架,让你运行另一台机器上的可执行文件是一部分原因因为没有一个。

如果您想在远程计算机上运行可执行文件,那么您可能对PsExec(由Micrososft发布的Sysinternals工具)感兴趣。

+0

PsExec非常适合在远程运行程序,但我似乎无法找到运行脚本的方法。 例如,我想在服务器上运行命令“md c:\ temp”。 我该怎么做?因为PsExec只运行该进程 – Ben2307

2

这是可能的通过C#中使用WMI(见http://www.codeproject.com/KB/cs/Remote_Process_using_WMI_.aspx)或通过使用命令行http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx ...但它是你平时不应该做 - 它创造了几个安全问题处理...

编辑 - WMI使用用户/ PW:
connectionoptions给你提供用户名+密码的可能性 - 看http://msdn.microsoft.com/en-us/library/system.management.connectionoptions.aspx

+0

从来不知道你可以使用WMI来做到这一点 - 很好的发现。 – Justin

+0

使用WMI如何连接使用用户和密码? – Ben2307

+0

看到我的编辑 – Yahia

0

我知道这是一篇旧文章,但我想补充一点,当然可以在没有PsExec的情况下运行远程可执行文件,而许多病毒软件标记为有问题。另外大多数系统管理员不希望在他们的Web服务器上使用PsExec。而且,通过映射驱动器或UNC运行远程可执行文件并不意味着您已安装了许可证,因此可能会失败(或运行演示版),具体取决于软件。

关键是在WCF服务中包装System.Diagnostics.Process步骤。下面是一个部分示例...

{ 
// Define a service contract. 
[ServiceContract(Namespace = "http://MyDataServices.foo.com")] 
public interface IDataService 
{ 
    [OperationContract] 
    bool ProcessStatTransfer(MemoryStream inputCommands, string inputName); 

} 

// Implement the IDataService service contract in a service class. 
public class DataService : IDataService 
{ 

    // Implement the IDataService methods. 
    public bool ProcessStatTransfer(MemoryStream inputCommands, string inputName) 
    { 
     try 
     { 
      // StatTransferLocation is C:\Program Files\StatTransfer12-64\st.exe 
      // on the machine that hosts the service 
      string m_stattransfer_loc = ConfigurationManager.AppSettings["StatTransferLocation"].ToString(); 
      string m_stattransfer_file = ConfigurationManager.AppSettings["CommandFiles"].ToString() + inputName; 

      using (FileStream m_fsfile = new FileStream(m_stattransfer_file, FileMode.Create, FileAccess.Write)) 
      { 
       inputCommands.WriteTo(m_fsfile); 
      } 

      ProcessStartInfo processInfo = new ProcessStartInfo("\"" + m_stattransfer_loc + "\""); 

      processInfo.Arguments = "\"" + m_stattransfer_file + "\""; 
      processInfo.UseShellExecute = false; 
      processInfo.ErrorDialog = false; 
      processInfo.CreateNoWindow = true; 

      Process batchProcess = new Process(); 
      batchProcess.StartInfo = processInfo; 
      batchProcess.Start(); 

      return true; 

     } 
     catch 
     { 

      return false; 

     } 

    } 
..... 

然后,您添加一个服务引用并调用该方法。没有映射,PsExec或WMI。这是一个纯粹的C#解决方案。

相关问题