c# - Process.GetProcessById 启用 "debug mode"

标签 c# .net winapi process

在我的一个 C# 应用程序 (.NET 2) 中,我使用了一个调用一些 OpenProcess() 的非托管模式库 (C)。我最近添加了一些使用 Process.GetProcessById() 的 C# 代码。进行此更改后,即使应用于用于使它们失败的 PID,OpenProcess() 也开始成功。经过一些调查,我发现 Process.GetProcessById() 隐式设置了 SeDebugPrivilege 给应用程序(注意:当前用户拥有管理员权限)。由于在我的特定应用程序中这种行为是不可取的,因此我最终通过调用 Process.LeavDebugMode() 恢复了正常权限。

由于我找不到任何关于此的描述,我对我的程序的正确性有些担忧。调用 Process.LeavDebugMode() 来“调整”Process.GetProcessById() 的工作是否正确?简而言之,我的 Process.GetProcessById() 是否按预期工作(例如由 MSDN 记录),或者我观察到的行为是否在我的应用程序中隐藏了一些细微的错误?

我的操作系统是用于嵌入式系统的 Windows 7 SP1 64 位。

编辑:更多信息:该进程以 32 位模式运行(即它运行 32 位版本的 .NET 引擎)。另外,我添加了这个“.config”文件以确保使用的 .NET 版本是 2:

<configuration>
 <startup>
  <supportedRuntime version="v2.0.50727"/>
 </startup>
</configuration>

EDIT2:更多实验:编写了一个普通的 C#/WindowsForm 应用程序(感谢 MS 向导 ;-)),添加了两个按钮,一个用于调用 Process.GetProcessById(),一个用于调用 Process.LeaveDebugMode()。这是相关代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Reflection;
using System.Resources;
using System.Runtime.InteropServices;


namespace testproc
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Process proc = Process.GetProcessById(Process.GetCurrentProcess().Id);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Process.LeaveDebugMode();
        }
    }
}

启动应用程序(在 VS 之外),然后启动进程资源管理器。它证实了奇怪的“特征”:

  • 应用程序刚刚启动:SeDebugPrivilege 已禁用
  • 按下按钮 1:SeDebugPrivilege 已启用!
  • 按下按钮 2:SeDebugPrivilege 再次被禁用
  • 按下按钮 1:SeDebugPrivilege 仍处于禁用状态(嗯...)

因此,我只能确认我的断言(至少对于 Process.GetProcessById() 的第一次调用)。有什么想法吗?

最佳答案

看起来像是 .NET 中的错误,但在有人可以重现它之前,它可能只是您机器上的一些奇怪之处。

不管怎样,调用 LeaveDebugMode() 来解决这个问题应该是无害的。它所做的只是禁用特权,将线程返回到正常状态。 (文档没有说明,但大概在调试权限已被禁用时调用 LeaveDebugMode() 什么都不做;这就是底层 API 的行为方式。)

关于c# - Process.GetProcessById 启用 "debug mode",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28453444/

相关文章:

c# - 为什么我的 Close 函数没有被调用?

c# - 创建 ViewModel 类

c# - 方法中动态方法返回值的显式转换不允许调用扩展方法

c# - System.Device.Location.GeoCooperativeWatcher.Position.Location.Speed 始终为 NaN

c++ - 带有自定义数据的 SetWinEventHook

c# - 无法使用 c# 在 winform 中使用空 ValueMember 在 ListControl 中设置 SelectedValue

c# - Windows 任务计划程序安装程序

.net - 当无法进行参数化查询时,在 SQL 中查询日期的最佳做法是什么

c++ - 如何以编程方式在 Windows 上获取给定制造商的所有打印机型号?

c++ - 默认安全描述符