Выполните psexec, используя сервис в C # - PullRequest
3 голосов
/ 28 июня 2011

Мне нужно выполнить программу на удаленном компьютере, поэтому я создал сервис для вызова psexec (это важно при использовании сервиса).Однако эта служба не может вызывать psexec.

Следуя коду:

            String cmd = "", arguments = "";
            cmd = @"C:\PsTools\psexec.exe";

            arguments = @"\\remoteComputer -u "user" -p "password" "C:\program.exe"";

            Process process = new Process();
            process.StartInfo.FileName = cmd;
            process.StartInfo.Arguments = arguments;

            process.StartInfo.UseShellExecute = false;
            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.RedirectStandardError = true;
            process.StartInfo.CreateNoWindow = true;
            process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

            process.Start();
            result = process.StandardOutput.ReadToEnd();
            sError = process.StandardError.ReadToEnd();

            result += "Program has finished its execution";

Кто-нибудь знает, почему служба не может вызвать psexec?

Ответы [ 2 ]

4 голосов
/ 26 апреля 2012

У меня тоже были проблемы с зависанием psexec при удаленном запуске командного файла. Как насчет WMI? Это сработало для меня при запуске чего-либо на удаленном компьютере; это работает для * .bat и * .exe тоже. Возможно, вам придется нажать «Проект»> «Добавить ссылку» и выбрать «System.Management» на вкладке .NET - ссылки не было в VS 2010, пока я не добавил ее вручную.

        System.Management.ConnectionOptions connOptions =
            new System.Management.ConnectionOptions();

        connOptions.Impersonation = System.Management.ImpersonationLevel.Impersonate;
        connOptions.EnablePrivileges = true;

        string compName = "RemoteComputerName";
        System.Management.ManagementScope manScope =
            new System.Management.ManagementScope(
                String.Format(@"\\{0}\ROOT\CIMV2", compName), connOptions);
        manScope.Connect();

        System.Management.ObjectGetOptions objectGetOptions =
            new System.Management.ObjectGetOptions();

        System.Management.ManagementPath managementPath =
            new System.Management.ManagementPath("Win32_Process");

        System.Management.ManagementClass processClass =
            new System.Management.ManagementClass(manScope, managementPath, objectGetOptions);

        System.Management.ManagementBaseObject inParams =
            processClass.GetMethodParameters("Create");

        inParams["CommandLine"] = @"c:\MyBatchFile.bat";

        System.Management.ManagementBaseObject outParams =
            processClass.InvokeMethod("Create", inParams, null);
1 голос
/ 27 апреля 2012

Вы должны запустить psexec как пользователь с разрешениями Administrator для удаленного компьютера. (Все, что нужно сделать -u, - это изменить учетную запись, используемую для выполнения команды на удаленном компьютере.) Либо настройте службу для работы в качестве учетной записи с разрешениями для удаленного компьютера, либо используйте второй экземпляр psexec для запустите первый экземпляр psexec от имени соответствующего пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...