.NET 创建、读取和写入进程类

        创建进程的示例以及如何使用 System.Diagnostics.Process 类读取控制台输出并写入控制台以及如何使用 Windows 管理规范 (WMI) 在远程计算机上创建进程;用 C# 和 VB.NET 编写。
        在.NET中创建一个新进程,Process.Start("notepad.exe")通过创建对象可以实现简单但更多的控制Process。Process.Start("http://www.bing.com")也可以。可能,Process.Start()正在使用WinAPI ShellExecute()函数,而Process对象正在使用该CreateProcess()函数(至少对于 Windows 平台而言)。

了解如何使用 HttpClient从 URL 下载文件终止进程

VB.NET:

Imports System.Diagnostics

Module Module1

    Sub Main()

        Dim pro As New Process()

        pro.StartInfo.FileName = "notepad.exe"
        pro.StartInfo.Arguments = "temp.txt"

        ' NOTE: can specify ProcessWindowStyle.Hidden for programs that do not need user input
        pro.StartInfo.WindowStyle = ProcessWindowStyle.Normal

        pro.Start()
        pro.WaitForExit()

    End Sub

End Module

C#:
using System.Diagnostics;

namespace Console1
{
    class Program
    {
        static void Main(string[] args)
        {
            Process pro = new Process();

            pro.StartInfo.FileName = "notepad.exe";
            pro.StartInfo.Arguments = "temp.txt";

            // NOTE: can specify ProcessWindowStyle.Hidden for programs that do not need user input
            pro.StartInfo.WindowStyle = ProcessWindowStyle.Normal;

            pro.Start();
            pro.WaitForExit();
        }
    }
}

读取控制台应用程序输出
创建一个控制台进程并读取其输出。

using (var proc = new System.Diagnostics.Process
{
    StartInfo = new System.Diagnostics.ProcessStartInfo
    {
        FileName = "/bin/executable",
        Arguments = "-arguments",
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true
    }
})
{
    proc.Start();
    while (!proc.StandardOutput.EndOfStream)
    {
        // NOTE: can also read one character at a time with proc.StandardOutput.Read() for more of a "real-time" effect
        string line = proc.StandardOutput.ReadLine();
        // NOTE: do something with this line of text
    }
}

现在,从控制台进程读取二进制数据。
using (var proc = new System.Diagnostics.Process
{
    StartInfo = new System.Diagnostics.ProcessStartInfo
    {
        FileName = "/bin/executable",
        Arguments = "-arguments",
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true
    }
})
{
    proc.Start();
    using (BinaryReader reader = new BinaryReader(proc.StandardOutput.BaseStream))
    {
        byte[] chunk = reader.ReadBytes(1024);
        while (chunk.Length > 0)
        {
            // NOTE: do something with this byte array
            chunk = reader.ReadBytes(1024);
        }
    }
}

写入控制台应用程序
        实际上,如果对控制台应用程序进行读取和写入,则可能在不同的线程上进行,同样,控制台应用程序也可能在不同的线程上进行读取和写入。这是因为Console.ReadLine()、proc.StandardOutput.Read()和proc.StandardOutput.ReadLine()是阻塞的。

using (var proc = new System.Diagnostics.Process
{
    StartInfo = new System.Diagnostics.ProcessStartInfo
    {
        FileName = Path.Combine(Environment.CurrentDirectory, "executable.exe"),
        Arguments = "/command /line /arguments /go /here",
        UseShellExecute = false,
        RedirectStandardOutput = true, // NOTE: optional
        RedirectStandardInput = true, // NOTE: required
        CreateNoWindow = true, // NOTE: optional
        WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden // NOTE: optional
    }
})
{
    proc.StandardInput.WriteLine("Hello, World!"); // NOTE: this will send "Hello, World!" to the console application's process
    proc.StandardOutput.ReadLine();
}

在远程机器上创建进程
        可以从 C# 应用程序远程在另一台计算机上创建进程,但这需要满足有关网络配置、权限和安全设置的特定条件。实现此目的的方法通常涉及使用 Windows 管理规范 (WMI)、PowerShell 远程处理或支持远程命令执行的其他网络协议。

        Windows 管理规范 (WMI) 是一项 Windows 功能,它提供了一种与系统管理数据和操作进行交互的标准化方法。使用 WMI 在远程计算机上创建进程,但要确保本地计算机和远程计算机都配置为允许 WMI 访问。

using System;
using System.Management;

class Program
{
    static void Main()
    {
        string remoteComputer = "REMOTE_COMPUTER_NAME";
        string domain = "DOMAIN_NAME";  // NOTE: can be an empty string if not on a domain
        string username = "USERNAME";
        string password = "PASSWORD";
        string processToRun = @"C:\Path\To\Executable.exe /command-line-argument";

        ConnectionOptions connOptions = new ConnectionOptions();
        connOptions.Username = domain + "\\" + username;
        connOptions.Password = password;
        connOptions.Impersonation = ImpersonationLevel.Impersonate;
        connOptions.EnablePrivileges = true;

        ManagementScope manScope = new ManagementScope($@"\\{remoteComputer}\root\cimv2", connOptions);
        try
        {
            manScope.Connect();

            ObjectGetOptions objectGetOptions = new ObjectGetOptions();
            ManagementPath managementPath = new ManagementPath("Win32_Process");
            ManagementClass processClass = new ManagementClass(manScope, managementPath, objectGetOptions);

            ManagementBaseObject inParams = processClass.GetMethodParameters("Create");
            inParams["CommandLine"] = processToRun;

            ManagementBaseObject outParams = processClass.InvokeMethod("Create", inParams, null);
            Console.WriteLine("Return Value: " + outParams["ReturnValue"]); // NOTE: return value of 0 means success, just like with any regular process
        }
        catch (Exception e)
        {
            Console.WriteLine("Error: " + e.Message);
        }
    }
}

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

csdn_aspnet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值