在我的一个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的行为。)