【发布时间】:2011-07-25 12:08:22
【问题描述】:
我正在为我的工作编写一个 Web 服务 (WCF),我正在寻找一种方法来
在其他机器上按需运行脚本。
我们有从 RDC 连接的机器,我想在上面运行一个脚本
来自另一个 C# 程序。
另外,我似乎找不到在另一台机器上从 C# 运行可执行文件的方法。
【问题讨论】:
标签: c# .net wcf scripting remote-desktop
我正在为我的工作编写一个 Web 服务 (WCF),我正在寻找一种方法来
在其他机器上按需运行脚本。
我们有从 RDC 连接的机器,我想在上面运行一个脚本
来自另一个 C# 程序。
另外,我似乎找不到在另一台机器上从 C# 运行可执行文件的方法。
【问题讨论】:
标签: c# .net wcf scripting remote-desktop
您找不到 .Net 框架的一部分来让您在另一台机器上运行可执行文件的原因是因为没有。
如果您想要一种在远程机器上运行可执行文件的简单方式,那么您可能会对PsExec(Micrososft 发布的 Sysinternals 工具)感兴趣。
【讨论】:
这可以通过 C#(参见 http://www.codeproject.com/KB/cs/Remote_Process_using_WMI_.aspx)或通过命令行使用 http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx 使用 WMI 来实现...但您通常不应该这样做 - 它会产生一些需要处理的安全问题...
编辑 - 带有用户/密码的 WMI:connectionoptions 使您可以提供用户名 + 密码 - 请参阅 http://msdn.microsoft.com/en-us/library/system.management.connectionoptions.aspx
【讨论】:
我知道这是一篇旧帖子,但我想补充一点,当然可以在没有 PsExec 的情况下运行远程可执行文件,许多病毒软件将其标记为有问题。此外,大多数系统管理员不希望 PsExec 在他们的 Web 服务器上。而且,通过映射驱动器或 UNC 运行远程可执行文件并不意味着您已安装许可证,因此它可能会失败(或运行演示版本),具体取决于软件。
关键是将System.Diagnostics.Process 步骤包装在WCF 服务中。这是一个部分示例...
{
// 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# 解决方案。
【讨论】: