Process.GetProcessById 启用 "debug mode"

Process.GetProcessById enabling "debug mode"

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

恢复了正常权限

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

我的 OS 是 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 之外),然后启动进程资源管理器。它证实了奇怪的 "feature":

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

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

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