C#创建并启动新的进程

这篇具有很好参考价值的文章主要介绍了C#创建并启动新的进程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        在C#编程中,ProcessStartInfo是一个类,用于包含有关要启动的进程的信息。 它用于Process类的Start方法,以确定如何启动新的进程。

        ProcessStartInfo类的一些重要属性包括:

  • FileName:要运行的文件的名称,可含路径(绝对路径或相对路径)。
  • Arguments:传递给文件的命令行参数。
  • WorkingDirectory:工作目录的路径。
  • UseShellExecute:一个布尔值,确定是否使用操作系统外壳程序(shell)启动进程。
  • RedirectStandardInputRedirectStandardOutputRedirectStandardError:布尔值,确定是否重定向进程的标准输入、输出和错误流。
  • StandardOutputEncodingStandardErrorEncoding:用于读取进程的标准输出和错误的编码。
  • CreateNoWindow:一个布尔值,确定是否在新窗口中启动进程。
  • WindowStyle:窗口样式(最大化、最小化、隐藏等)。
  • LoadUserProfile:一个布尔值,确定是否加载用户的配置文件。
  • EnvironmentVariables:一个字符串字典,用于设置环境变量。
  • UserNamePasswordDomain:用于身份验证的凭据。

        一、简单示例:

string arg1 = "a", arg2 = "b";
string args = $@"{arg1} {arg2}";

ProcessStartInfo info = new ProcessStartInfo();
//指定exe文件
info.FileName = "D:\Test\Test.exe";
//传入参数,多个参数用英文空格隔开
info.Arguments = args;
//已管理员身份运行,可消除打开的确认弹窗
info.Verb = "runas";
//设置不在新窗口中启动新的进程
info.CreateNoWindow = true;
//不使用操作系统使用的shell启动进程
info.UseShellExecute = false;
//将输出信息重定向
info.RedirectStandardOutput = true;

Process pro = Process.Start(info);

        关于参数Arguments的说明:传入的是字符串类型,如果需要传入多个参数,请用英文空格隔开。同时被打开的exe程序需要修改Program.cs文件中的应用程序的入口点Main函数,用于接收传入的参数,这个过程会自动解析将参数用英文空格分隔成string数组,如下:

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    //调用WinForm的窗体有参构造函数
    Application.Run(new TestFrom(args));
}

/// <summary>
/// 有参构造函数
/// </summary>
/// <param name="args">ProcessStartInfo传入的参数</param>
public TestFrom(string[] args)
{
    InitializeComponent();
}

        二、使用指定的域账号打开exe程序

        UserName:用户域账号;

        Password:用户域账号的密码;

        Domain:域名。

        需要用到ShareTool共享工具类:用来登录

using System;
using System.Runtime.InteropServices;

namespace ShareToolClass
{
    public class ShareTool : IDisposable
    {
        [DllImport("advapi32.dll", SetLastError = true)]
        static extern bool LogonUser(string pszUsername, string pszDomain, string pszPassword,
            int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

        // closes open handes returned by LogonUser       
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        extern static bool CloseHandle(IntPtr handle);

        [DllImport("Advapi32.DLL")]
        static extern bool ImpersonateLoggedOnUser(IntPtr hToken);

        [DllImport("Advapi32.DLL")]
        static extern bool RevertToSelf();
        const int LOGON32_PROVIDER_DEFAULT = 0;
        const int LOGON32_LOGON_NEWCREDENTIALS = 9;
        const int LOGON32_LOGON_INTERACTIVE = 2;
        private bool disposed;

        public ShareTool(string username, string password, string ip)
        {
            // initialize tokens       
            IntPtr pExistingTokenHandle = new IntPtr(0);
            IntPtr pDuplicateTokenHandle = new IntPtr(0);

            try
            {
                // get handle to token       
                bool bImpersonated = LogonUser(username, ip, password,
                    LOGON32_LOGON_NEWCREDENTIALS, LOGON32_PROVIDER_DEFAULT, ref pExistingTokenHandle);

                if (bImpersonated)
                {
                    if (!ImpersonateLoggedOnUser(pExistingTokenHandle))
                    {
                        int nErrorCode = Marshal.GetLastWin32Error();
                        throw new Exception("ImpersonateLoggedOnUser error;Code=" + nErrorCode);
                    }
                }
                else
                {
                    int nErrorCode = Marshal.GetLastWin32Error();
                    throw new Exception("LogonUser error;Code=" + nErrorCode);
                }
            }
            finally
            {
                // close handle(s)       
                if (pExistingTokenHandle != IntPtr.Zero)
                    CloseHandle(pExistingTokenHandle);
                if (pDuplicateTokenHandle != IntPtr.Zero)
                    CloseHandle(pDuplicateTokenHandle);
            }
        }

        protected virtual void Dispose(bool disposing)
        {
            if (!disposed)
            {
                RevertToSelf();
                disposed = true;
            }
        }

        public void Dispose()
        {
            Dispose(true);
        }
    }
}

        示例:文章来源地址https://www.toymoban.com/news/detail-731239.html

string user = "admin";
string userpsw = "123456";
string domain = "TestDomain";

using (ShareToolClass.ShareTool tool = new ShareTool.ShareTool(user, userpsw, domain))
{
    //保密文本
    SecureString pwd = new SecureString();
    foreach (char c in userpsw)
        pwd.AppendChar(c);

    //使用线程打开
    Thread t = new Thread(new ThreadStart(delegate
    {
        try
        {
            ProcessStartInfo info = new ProcessStartInfo();
            info.FileName = "D:\Test\Test.exe";
            
            info.UserName = user;//域账号
            info.Password = pwd;//密码
            info.Domain = domain;//域名

            //设置不在新窗口中启动新的进程
            info.CreateNoWindow = true;
            //不使用操作系统使用的shell启动进程
            info.UseShellExecute = false;
            //将输出信息重定向
            //info.RedirectStandardOutput = true;
            Process pro = Process.Start(info);
        }
        catch (Exception ex)
        {
            PubLibrary.WriteErrLog("打开出错:" + ex.ToString());
        }
    }));
    t.Start();
}

到了这里,关于C#创建并启动新的进程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#使用Asp.Net创建Web Service接口并调用

    目录 一.创建Asp.net web应用以及Web Service服务 (1).运行环境 (2)创建项目 二.创建控制台应用来调用上面创建的Web Service 开发工具: Visual Studio 2022 Current (免费社区版) 框架版本: .net framework4.7.2,更高的.net 5 、net6貌似没有默认提供带web service的asp.net 应用模板了。 确保VS的工作负荷有

    2024年01月18日
    浏览(44)
  • 【服务器】ASP.Net Core(C#)创建Web站点

    简单几步实现本地ASP.Net.Core web 站点结合cpolar内网穿透工具实现远程访问 1. 创建站点 *环境搭建,这边测试,使用.NET 6.0 SDK,可以点击跳转到官网下载,下载后安装即可. 安装完成后,进入到某个文件夹,打开powershell执行下面命令,创建新的 Web 应用,名称叫:aspnetcoreapp 2. 运行站点 信任开

    2024年02月11日
    浏览(48)
  • .NET C#程序启动闪退,在安装或者程序文件下能正常运行,但通过路径却无法运行

    这是第2次踩这个坑了,很小的编程细节,容易忽略,所以写个博客,分享给大家。 1.第一次坑:是windows 系统把程序运行成服务,找不到配置文件,原因是以服务运行它的工作目录是在C:WindowsSystem32 2.本次坑:WPF桌面程序通过注册表设置开机自启,开机启动就闪退 我的排查

    2024年03月26日
    浏览(42)
  • .NET / C# 开发 Ubuntu Desktop 跨平台图形界面桌面程序 Avalonia - Visual Studio 安装/创建/运行指南 (一)

    Avalonia 是一个开源的跨平台应用程序框架,用于构建桌面应用程序。它使用 C# 和 XAML 进行开发,可以在 Windows、macOS、iOS、Android 及 Linux 等多个平台上运行。Avalonia 项目地址:https://github.com/AvaloniaUI/Avalonia 本文快速介绍如何入门使用 Avalonia 编写和执行 Ubuntu Desktop 图形界面桌面

    2024年02月01日
    浏览(71)
  • 【C#】C#调用进程打开一个exe程序

    新建WinForm程序,并写入代码,明确要调用的程序的绝对路径(或相对路径)下的exe文件。 调用代码: 这里我调用的另一个程序的路径是: F:WindowsFormsApplication2WindowsFormsApplication2binDebugWindowsFormsApplication2.exe 你可以把这个路径改成你自己要调用的程序的路径。 运行起来,点

    2024年02月09日
    浏览(43)
  • python subprocess.run()、subprocess.Popen()、subprocess.check_output()(执行系统命令、启动新的进程、连接到子进程的输入/输出管道)

    Python的subprocess模块是用于创建和管理子进程的模块。它提供了一种在Python中调用外部命令的方式,可以执行系统命令、启动新的进程、连接到子进程的输入/输出管道等。 subprocess.run 运行指定的命令,并等待其完成。args参数是一个字符串或列表,表示要执行的命令和参数。

    2024年02月09日
    浏览(49)
  • C# 进程

    进程的命名空间是: 1.获取当前计算机正在运行所有的进程 2.通过进程打开一些应用程序 3.通过一个进程打开指定的文件夹或文件

    2024年02月14日
    浏览(23)
  • C#实现系统进程的调用,查看进程调用的模块

    1.需要使用命名空间:System.Diagnostics; 2.Process.GetProcess()可以获取所有进程 3.获取进程调用的模块         ProcessModuleCollection modules = currentProcess.Modules;         foreach循环一下FileName就可以查看调用了什么dll文件了 4.有关进程的信息(Process里面有的属性):         Id:经常唯

    2024年02月16日
    浏览(41)
  • C#核心笔记——(一)C#和.NET Framework

    C#是一种通用的,类型安全的面向对象编程语言。其目标是提高程序员生产力。 C#实现了丰富的面向对象范式,包括封装、继承、多态。 C#面向对象特性包括: 统一的类型系统 类与接口 属性、方法、事件 C#支持纯函数模式 C#是一门类型安全的语言。例如:C#不允许将字符串类

    2024年02月08日
    浏览(58)
  • C#基础--进程和线程的认识

    1. 什么是进程? 进程并不是物理的东西,是虚拟出来的,是一种概念。当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的。是一种计算机概念,是程序在运行的时候,记录当前程序对计算

    2024年02月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包