用c#在其他机器上运行脚本

本文关键字:运行 脚本 机器 其他 | 更新日期: 2023-09-27 18:03:17

我正在为我的工作编写Web服务(WCF),我正在寻找一种方法在其他机器上按需运行脚本。
我们从RDC连接了一些机器,我想在上面运行一个脚本从另一个c#程序。
此外,我似乎找不到从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#解决方案。