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

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

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

编辑:更多信息:该进程以32位模式运行(即它运行.NET引擎的32位版本)。另外,我添加了此“ .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的行为。)

09-25 22:05