首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在C#中读取另一个进程的命令行参数?

要在C#中读取另一个进程的命令行参数,可以使用Windows API函数OpenProcessReadProcessMemory。以下是一个简单的示例代码:

代码语言:csharp
复制
using System;
using System.Runtime.InteropServices;

public class CommandLineReader
{
    [DllImport("kernel32.dll")]
    public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);

    [DllImport("kernel32.dll")]
    public static extern bool ReadProcessMemory(int hProcess, int lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesRead);

    public static string GetCommandLine(int processId)
    {
        IntPtr processHandle = OpenProcess(0x0410, false, processId);
        if (processHandle == IntPtr.Zero)
        {
            return null;
        }

        int pSize = Marshal.SizeOf(typeof(PEB)) + 1024;
        byte[] buffer = new byte[pSize];
        int bytesRead = 0;

        if (!ReadProcessMemory((int)processHandle, 0x00400000, buffer, pSize, ref bytesRead))
        {
            return null;
        }

        int offset = BitConverter.ToInt32(buffer, 0x00000230);
        int size = BitConverter.ToInt32(buffer, offset + 0x00000040);
        string commandLine = System.Text.Encoding.Unicode.GetString(buffer, offset + 0x00000044, size * 2);

        return commandLine;
    }
}

[StructLayout(LayoutKind.Sequential)]
public struct PEB
{
    public byte[] reserved1;
    public byte[] beingDebugged;
    public byte[] reserved2;
    public IntPtr ldr;
    public IntPtr processParameters;
    public byte[] reserved3;
    public IntPtr atlThunkSListPtr;
    public byte[] reserved4;
    public IntPtr reserved5;
    public IntPtr reserved6;
    public IntPtr reserved7;
    public byte[] reserved8;
}

使用GetCommandLine方法可以获取指定进程ID的命令行参数。

需要注意的是,这种方法可能会受到操作系统版本和安全设置的影响,因此可能会在某些情况下失败。此外,这种方法可能会违反安全性和隐私原则,因此在使用时需要谨慎。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何在父进程中读取子(外部)进程的标准输出和标准错误输出结果

最近接手一个小项目,要求使用谷歌的aapt.exe获取apk软件包中的信息。依稀记得去年年中时,有个同事也问过我如何获取被调用进程的输出结果,当时还研究了一番,只是没有做整理。...这个API的参数非常多,我想我们工程中对CreateProcess的调用可能就关注于程序路径(lpApplicationName),或者命令行(lpCommandLine)。...它是我们启动子进程时,控制子进程启动方式的参数。...我们正是靠这几个参数来解决我们所遇到的问题。那么如何使用这些参数呢?         我们选用的还是老方法——管道。...我们之后将hWrite交给我们创建的子进程,让它去将信息写入管道。而我们父进程,则使用hRead去读取子进程写入管道的内容。

3.9K10
  • dotnet 获取指定进程的输入命令行

    本文告诉大家如何在 dotnet 获取指定的进程的命令行参数 很多的程序在启动的时候都需要传入参数,那么如何拿到这些程序传入的参数?...我找到两个方法,一个需要引用 C++ 库支持 x86 和 x64 程序,另一个都是C#代码,但是只支持 x64 程序 本文提供一个由 StackOverflow 大神开发的库拿到进程的命令行 在使用下面的代码需要引用两个...C++ 的库,可以从 csdn 下载 使用下面的代码就可以拿到传入进程的参数,在使用之前,需要在输出的文件夹里面包含 ProcCmdLine32.dll 和 ProcCmdLine64.dll 可以从...static extern bool GetProcCmdLine64(uint nProcId, StringBuilder stringBuilder, uint dwSizeBuf); 获取所有的进程的命令行可以使用这个代码...process.ProcessName} {GetCommandLineOfProcess(process.Id)}"); } } 更简单是通过 WMI 获取指定进程的输入命令行

    1.2K20

    win32 api函数_c调用webapi接口

    使用就行了,但在 C#中不会这么简单,需要在指定的模块之中导入想要的Win32,下面我们来学习一下如何在C#之中使用Win32 Api . . . ---- 在测试Win32 Api 之前,我先教大家如何获取有窗口的进程信息...,代码如下: 有窗口的进程,它的窗口句柄不会为 0,所以我们只需在所有运行的程序之中判断一下即可,下面是效果: 这些都是我所运行有窗口的进程 . . . ---- Win32 Api 使用 首先我们准备一个额外的窗口...,用于测试 Api: 准备两个按钮,一个用于显示上面的窗口,另一个用于测试 Api: 导入 Win32 Api: User32 表示导入的 Api所在模块 CharSet 表示字符集 下面的是一个...Api 对应的样式(参数要对应正确),可以百度搜索查询 . . ....如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    1.3K20

    linux常见面试题

    通常,一个桌面环境,如KDE或Gnome,足以在没有问题的情况下运行。尽管系统允许从一个环境切换到另一个环境,但这对用户来说都是优先考虑的问题。...grep使用基于模式的搜索的搜索命令。它使用与命令行一起指定的选项和参数,并在搜索所需的文件输出时应用此模式。 41)当发出的命令与上次使用时产生的结果不同时,会出现什么问题?...44)如何在命令行提示符中插入注释? 通过在实际注释文本之前键入#符号来创建注释。这告诉shell完全忽略后面的内容。例如“#这只是shell将忽略的注释。”...在命令中,color.ui变量设置变量的默认值,例如color.diff和color.grep。 55)如何在Linux中将一个文件附加到另一个文件?...它将停止接收NOHUP信号的进程,从而终止它,你注销了调用的程序。并在后台运行该过程。 62)解释如何在Linux中卸载库?

    2.5K10

    .NETC# 获取一个正在运行的进程的命令行参数

    在自己的进程内部,我们可以通过 Main 函数传入的参数,也可以通过 Environment.GetCommandLineArgs 来获取命令行参数。...但是,可以通过什么方式来获取另一个运行着的程序的命令行参数呢? ---- 进程内部获取传入参数的方法,可以参见我的另一篇博客:.NET 命令行参数包含应用程序路径吗?。....NET Framework / .NET Core 框架内部是不包含获取其他进程命令行参数的方法的,但是我们可以在任务管理器中看到,说明肯定存在这样的方法。 ?.../summary> public static class ProcessExtensions { /// /// 获取一个正在运行的进程的命令行参数...如果你需要将其转换为字符串数组,可以使用我在另一篇博客中使用的方法: .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args ---- 参考资料 Can I get command line

    2.4K10

    TesseractOCR-GUI:基于WPFC#构建TesseractOCR简单易用的用户界面

    但在日常使用过程中,命令行使用还是不太方便的,因此今天介绍一下如何使用WPF/C#构建TesseractOCR简单易用的用户界面。...WPF/C#程序员使用 经过简单的调研,发现构建TesseractOCR-GUI主要可以通过两种方式。一种就是对命令行的使用进行封装,另一种就是对TesseractOCR的C++ API进行封装。...对命令行的使用进行封装比较简单,而且目前暂时也满足了我的使用需求,因此目前只实现了这种方式,pytesseract好像也是使用的这种方式。...第二种调用Tesseract C++ API的方式,可能得等第一种对命令行的使用进行封装无法满足需求的时候,才会去探索了。...读取错误(如果有) string error = process.StandardError.ReadToEnd(); // 等待进程退出 process.WaitForExit

    17310

    Edge.js:让.NET和Node.js代码比翼齐飞

    输入的参数在第4行被传递到C#异步Lambda表达式中,这个表达式在第6行将传入值附加到“.NET welcomes”字符串之后。...从概念上讲,你可以认为在V8和CLR之间的数据传递就像是在一个环境中将数据序列化为JSON,而在另一个环境中对JSON进行反序列化。但是,Edge.js并没有在进程中进行实际的JSON序列化过程。...第9行中传给createCounter函数的的参数在第3行被强制转化为一个C#的本地变量。...当计算执行的时候,进程中的单例(singleton)V8线程可以处理后续的事件。C#代码随第6行的await关键字而等待图片转换的完成。...另一个让Edge.js大显身手的例子是在MS SQL中读取数据。现在Node.js开发者还没有什么读取MS SQL数据的方法可以比.NET Framework中的ADO.NET更加完善和成熟。

    3.6K60

    .NET周刊【5月第4期 2024-05-26】

    其中包括如何在SqlSugar中处理SQL中的IN参数、动态类型的属性访问、表值参数typeName的传递、类型转换,以及两者联表查询的差异。...文章中还提供了一些代码示例,如创建容错的动态对象类和使用SqlSugar进行类型转换的方法。...介绍了使用IModbusReadWriteService接口进行读写测试,包括批量读取和写入数据,并解释了客户端参数实体类。提供了关于Modbus协议的文章链接以及测试读写效率的日志示例。...C#的奇技淫巧:利用WinRM来远程操控其他服务器上的进程 https://www.cnblogs.com/weskynet/p/18213135 文章介绍如何通过WinRM在不开启远程桌面的情况下,远程执行服务器进程的查看...PomeloCli通过nuget服务发布,并提供了开发、集成、卸载命令行插件与宿主的完整流程,同时解决了编写命令行应用的一些常见问题。文档中也提供了快速起步的指导和示例代码。

    14610

    .NET周刊【7月第2期 2024-07-14】

    C#使用SendMessage进行进程间通讯 https://www.cnblogs.com/wihalo/p/18293731 本文介绍了一种在WPF应用中实现拖动文件到桌面图标并自动打开的方法。...通过在OnStartup事件中获取文件名并处理,解决了软件启动后的参数传递问题。使用窗口句柄实现跨进程通信。...详解C#委托与事件 https://www.cnblogs.com/ayic/p/18295844 在C#中,委托是一种引用类型,用于封装方法的引用,可以作为参数传递,或将多个方法组合。...然后,通过C#代码实现根据数据库中存储的图片地址动态替换签名图片。具体步骤包括定义报表参数、读取医生签名图片地址、构建数据集合并赋值给报表对象,最后生成PDF文件供移动端查看。...扩展了参数收集的灵活性 锁定对象 索引运算符改进 \e 转义序列 部分属性 方法组中自然类型的改进 “async”方法和迭代器中的“ref”和“unsafe” 关于扩展类型的更新 扩展类型推迟到 C#

    15710

    Python的面试题

    深拷贝:将对象本身复制给另一个对象,用deepcopy()函数 浅拷贝:将对象的引用复制给另一个对象copy() (7)解释python中的join()和split()函数?...如 read / for / in / true / def 等 (9)如何删除字符串中的前置空格?...如 ‘abc’.encode(‘utf8’) 当然解码 就用 decode() (27)进程和线程的区别? 进程是运行着的程序,而线程是进程中指令的执行单元。...代码指令必须在操作系统分配的线程中执行。 一个进程至少包含一个线程。 (28) 进程间通信有哪些方法? 共享内存、session通信都可以。...os —– 提供了不少与操作系统相关联的函数 sys —– 通常用于命令行参数 re —– 正则匹配 math —– 数学运算

    2.7K10

    .NET周报【12月第1期 2022-12-08】

    C# 探索 C#定位记录中参数数量的上限 https://zenn.dev/shimat/articles/5b81d6627491ab 文章研究了 C#9 中引入的记录类型的位置参数上界。.../ 这篇文章解释了如何在 WinForms 的.NET Core 及以上版本的进程外设计器中支持自定义控件,该设计器在 Visual Studio 中使用。...它与 CefSharp 的不同之处在于,它有一个托管模式(与 CefSharp 相比,它在一个更外部的进程中运行),并且可以轻松地启用视频支持。...Core 中,ASPNET_前缀的环境变量衍生配置覆盖了命令行参数和DOTNET_前缀值,但在.NET 7 及以后的版本中,用ASPNET_前缀指定不能使用命令行参数和 一个破坏性的改变,即带有 DOTNET..._前缀的规范取代带有命令行参数或 DOTNET_前缀的规范。

    4.7K20

    程序员开发者神器:10个.Net开源项目

    它还额外提供很多功能,如参数校验、自动生成使用帮助和tab补全等,适用于任何使用命令行接口的.NET应用程序。...项目特点 1、将命令行参数转换为.NET对象:可以根据参数定义将命令行参数解析为.NET对象,使得程序可以更方便地使用命令行参数。...2、提供参数校验:可以对参数进行校验,确保参数满足指定的规则,如必填字段、数据类型和范围等。 3、自动生成使用帮助:可以根据参数的定义自动生成使用帮助文档,提供用户输入参数的指导。...5、可扩展性:提供了丰富的扩展点,用户可以根据自己的需求自定义扩展,如自定义校验规则、自定义参数类型等。 9、一个程序员开发者神器,微软官方出品,采用C#开发!...推荐阅读: 一份阅读量突破10万+的C#/.NET/.NET Core面试宝典(基础版) 【微信自动化】使用c#实现微信自动化 细聊C# AsyncLocal如何在异步间进行数据流转 从未来看C

    56540

    Windows中使用MySql.Data库将C# 接到 MySQL

    创建一个 MySqlDataReader 对象来读取选定的记录/数据。 执行命令。 读取记录并显示它们或将它们存储在列表中。 关闭数据读取器。 关闭连接。...,我将解释一些有关进程、命令、参数以及输入和输出的信息。...现在我们知道了命令是如何划分的,我们可以开始在我们的应用程序中实现它。 在 C# 和 .NET 应用程序中,启动进程很容易。...现在回到我们的应用程序,要备份数据库,我们必须将 RedirectStandardOutput 设置为 true,并将进程的输出读取到字符串中并将其保存到文件中。...; } } 为了恢复数据库,我们读取 .sql 文件并将其存储在字符串中,然后将 RedirectStandardInput 属性设置为 true,并将字符串的输入写入进程。

    35300

    (3)Powershell基础知识(一)

    如果使用的参数不正确,则该工具可能会忽略键入的内容,并自动开始执行任务。 但在 PowerShell 中输入命令时,它会自动分析并预处理所输入的全部内容。...参数,则始终表示“显示此命令的帮助”。脚本命令开发人员无需分析该命令,他们只需提供帮助文本。即使是在 PowerShell 中运行传统命令行工具,也可以使用 PowerShell 的帮助功能。...换句话说,学习C#和Powershell是相互促进的,如果您不是 C# 程序员或是完全不了解C#,也没有关系,了解任何一门面对对象的编程语言都有助于学习Powershell。...如果已经熟悉 C#,则这些相似性可以帮助你更轻松地了解PowerShell。 ---- 理解Powershell中命令的命名规范 使用大多数命令行界面时,通常会遇到以下问题。...命令没有统一的模式,因此只能通过记住常用的每种命令和每个参数来了解这些命令行界面。 大多数命令都是为管理操作系统或应用程序的元素(如服务或进程)构建的。

    4.1K20

    不得不提的容器 JVM

    当我们在没有任何调优参数(例如,最为简洁的的启动命令行:“ java -jar myapplication .jar”)的情况下执行 Java 应用程序时,JVM 将自行调整某些特定的参数,以在当前执行环境中获得最佳性能表现...其实,从本质上而言,容器更倾向于一种隔离机制环境,其中一个进程的资源( CPU、内存、文件系统、网络等)与另一个进程隔离。这种隔离是可能的,因为 Linux 内核中有一个名为 CGroups 的特性。...在本文中,我们将了解如何在运行 Java 进程的容器环境中设置 JVM 参数。尽管以下内容适用于任何 JVM 设置,但我们将重点关注公共参数 -Xmx 和 -Xms 等。...除此之外,我们还将讨论一些常见的问题,如如何对使用特定版本的 Java 运行的程序进行容器化,以及如何在一些流行的容器化 Java 应用程序中设置标志。...为了解决这个问题,在当前的方案中,我们可以通过在容器服务启动命令行中设置 -Xmx 或者 MaxRAM 等参数来解决,但就正如上述描述的那样,在很多时候此种操作显得不够友好、不够优雅。

    1.3K40
    领券