用c#在其他机器上运行脚本
本文关键字:运行 脚本 机器 其他 | 更新日期: 2023-09-27 18:03:17
我正在为我的工作编写Web服务(WCF),我正在寻找一种方法在其他机器上按需运行脚本。
我们从RDC连接了一些机器,我想在上面运行一个脚本从另一个c#程序。
此外,我似乎找不到从c#在另一台机器上运行可执行文件的方法。
你找不到。net框架中允许你在另一台机器上运行可执行文件的部分,是因为没有这样的机器。
如果你想用一种直接的方式在远程机器上运行可执行文件,那么你可能会对PsExec(微软发布的一个Sysinternals工具)感兴趣。
这可以通过c#使用WMI(参见http://www.codeproject.com/KB/cs/Remote_Process_using_WMI_.aspx)或通过命令行使用http://technet.microsoft.com/en-us/sysinternals/bb897553.aspx…但这是你通常不应该做的事情-它会产生几个安全问题来处理…
EDIT - WMI with User/PW:connectionoptions
允许您提供UserName + Password—参见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#解决方案。