запустить скрипт на машине с другой машины в C # - PullRequest
0 голосов
/ 25 июля 2011

Я пишу веб-сервис (WCF) для своей работы и ищу способ запускать скрипт по требованию на другом компьютере.
У нас есть машины, которые мы подключаем из RDC, и я хочу запустить на нем скрипт из другой программы на C #.
Кроме того, я не могу найти способ запустить исполняемый файл на другом компьютере из C #.

Ответы [ 3 ]

2 голосов
/ 25 июля 2011

это возможно, используя WMI через C # (см. 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

1 голос
/ 25 июля 2011

Причина, по которой вы не можете найти часть .Net Framework, которая позволяет запускать исполняемые файлы на другом компьютере, заключается в том, что ее нет.

Если вам нужен прямой способ запуска исполняемого файлана удаленной машине вас может заинтересовать PsExec (инструмент Sysinternals, выпущенный Micrososft).

0 голосов
/ 31 марта 2014

Я знаю, что это старый пост, но я хотел бы добавить, что, безусловно, можно запустить удаленный исполняемый файл без PsExec, который многие вирусные программы отмечают как проблемный. Также большинство администраторов sys не хотят PsExec на своих веб-серверах. Кроме того, запуск удаленного исполняемого файла через подключенный диск или 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 #.

...