在我的一个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之外),然后我启动了进程资源管理器。它证实了这个奇怪的“特征”:
所以,我只能确认我的断言(至少是Process.GetProcessById()
的第一次调用)。有什么想法吗?
答案 0 :(得分:0)
看起来像是.NET中的一个错误,虽然有人可以重新编写它,但这可能只是你机器上的一些奇怪现象。
无论哪种方式,调用LeaveDebugMode()解决问题应该是无害的。它只是禁用权限,将线程返回到正常状态。 (文档没有说明,但是当调试权限已经被禁用时,可能会调用LeaveDebugMode()根本不执行任何操作;这就是底层API的行为方式。)