Process.GetProcessById启用"调试模式"

时间:2015-02-11 11:40:08

标签: 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()的第一次调用)。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

看起来像是.NET中的一个错误,虽然有人可以重新编写它,但这可能只是你机器上的一些奇怪现象。

无论哪种方式,调用LeaveDebugMode()解决问题应该是无害的。它只是禁用权限,将线程返回到正常状态。 (文档没有说明,但是当调试权限已经被禁用时,可能会调用LeaveDebugMode()根本不执行任何操作;这就是底层API的行为方式。)