【问题标题】:How to read command line arguments of another process in C#?如何在 C# 中读取另一个进程的命令行参数?
【发布时间】:2009-02-02 18:10:50
【问题描述】:

如何获取另一个进程的命令行参数?

使用System.Diagnostics.Process 类的静态函数,我可以获得正在运行的进程列表,例如按名称:

Process[] processList = Process.GetProcessesByName(processName);

但是,无法访问用于启动此进程的命令行。如何做到这一点?

【问题讨论】:

标签: c# process diagnostics


【解决方案1】:

如果您没有使用 Start 方法启动进程,则 StartInfo 属性不会反映用于启动进程的参数。例如,如果您使用 GetProcesses 获取计算机上运行的进程数组,则每个 Process 的 StartInfo 属性不包含用于启动进程的原始文件名或参数。 (来源:MSDN

Stuart 的 WMI 建议不错:

string wmiQuery = string.Format("select CommandLine from Win32_Process where Name='{0}'", processName);
ManagementObjectSearcher searcher = new ManagementObjectSearcher(wmiQuery);
ManagementObjectCollection retObjectCollection = searcher.Get();
foreach (ManagementObject retObject in retObjectCollection)
    Console.WriteLine("[{0}]", retObject["CommandLine"]);

【讨论】:

  • 你应该处理这些对象。
  • 请注意,如果运行上述代码的进程在非特权帐户下运行,则返回的 CommandLine 将为 null,例如在我的情况下(服务作为 LocalService 运行)
  • CommandLine 返回可执行文件的完整路径。可能这是Windows7下的问题。我没有在XP下测试。
  • 适用于我的 Win 7 SP1 x64。我有管理员权限。
  • 命名空间 System.Management.ManagementObjectSearcher,位于 System.Management.dll
【解决方案2】:

如果您的目标是 Windows XP 或更高版本,并且可以负担 WMI 的开销,则可以使用具有 CommandLine 属性的 WMI 的 WIN32_Process class 查找目标进程。

【讨论】:

    【解决方案3】:

    Process.StartInfo 返回一个 ProcessStartInfo 对象,据称但不一定在 Arguments 属性中具有参数。

    【讨论】:

    • 在我的情况下没有 :( 可能这仅在其他进程托管在 CLR 中时才有效。
    • 事实上,Arguments 属性只有在进程是使用 ProcessStartInfo 对象从托管进程启动时才会设置。
    【解决方案4】:

    这两个项目都是你的吗?您能否修改您尝试检查的进程的源代码,使其为您提供命令行参数,而不是尝试从该进程之外的某个位置读取它们?

    【讨论】:

    • 不,另一个进程是微软的msiexec
    猜你喜欢
    • 2023-04-08
    • 2014-11-11
    • 2011-07-06
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    相关资源
    最近更新 更多