使用C#中的服务执行psexec

本文关键字:执行 psexec 服务 使用 | 更新日期: 2023-09-27 18:00:31

我需要在远程计算机中执行一个程序,所以我创建了一个服务以便调用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吗?

使用C#中的服务执行psexec

远程运行批处理文件时,我也遇到了psexec挂起的问题。WMI怎么样?当我在远程计算机上运行某些东西时,这对我很有效;它也适用于*.bat和*.exe。您可能需要单击项目>添加引用,然后在.NET选项卡上选择"System.Management"——在我手动添加之前,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);

您必须以对远程计算机具有Administrator权限的用户身份运行psexec。(-u选项所做的只是更改用于在远程计算机上执行命令的帐户。)将服务配置为以具有远程计算机权限的帐户运行,或者使用psexec的第二个实例以适当用户身份运行psexec的第一个实例。