В одном из моих приложений на C# (.NET 2) я использую библиотеку неуправляемого режима (C), которая вызывает около OpenProcess()
с. Недавно я добавил код C#, где используется Process.GetProcessById()
. После этого изменения OpenProcess()
начал работать даже при применении к PID, которые были использованы для отказа. После некоторого расследования я обнаружил, что Process.GetProcessById()
неявно устанавливает SeDebugPrivilege
в приложение (ПРИМЕЧАНИЕ: у текущего пользователя есть привилегия администратора). Поскольку в моем конкретном приложении это поведение нежелательно, я в конечном итоге восстановил нормальные привилегии, вызвав Process.LeavDebugMode()
.Process.GetProcessById позволяет «режим отладки»
Поскольку я не могу найти никакого описания этого, у меня есть некоторые сомнения относительно правильности моей программы. Правильно ли позвонить Process.LeavDebugMode()
, чтобы «настроить» работу Process.GetProcessById()
? И, короче говоря, работает ли моя работа Process.GetProcessById()
(например, документально подтвержденная MSDN), или поведение, которое я наблюдал, скрывает некоторые тонкие ошибки в моем приложении?
Моя ОС - Windows 7 SP1 64 бит для встроенных систем.
EDIT: дополнительная информация: процесс выполняется в 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), после чего я запустил процесс explorer. Он подтвердил странную "особенность":
- Применение только пущена: SeDebugPrivilege отключен
- Кнопка 1 нажата: включен SeDebugPrivilege!
- Кнопка 2 нажата: SeDebugPrivilege снова отключается
- Кнопка 1 нажата: SeDebugPrivilege еще отключен (ммм ...)
Таким образом, я могу только подтвердить мое утверждение (по крайней мере, для первого вызова от Process.GetProcessById()
). Есть идеи?
Мне удалось воспроизвести его на совершенно разных системах (но и W7-64): встроенная версия и простой W7 Professional. Оба устанавливают антивирусное ПО, но не одно и то же: Avira на W7-embedded и MCafee на W7-professional. Ничего особенного не установлено. Кстати, по соображениям обратной совместимости я все еще должен использовать VS2005 (но мне это не важно). –
Я не могу воспроизвести его здесь, но я не эксперт в C#, поэтому я могу делать что-то неправильно. –
Я все еще расследую эту проблему.Ответ удовлетворительный для меня, так как я хотел быть уверенным, что LeaveDebugMode является разумным обходным решением, но я хотел бы найти реальный источник этой странной вещи. Может быть, какое-то исправление MS? Я как можно скорее попробую свой тестовый тест на совершенно другой машине, я не могу поверить, что такая ошибка существует, и никто ее не заметил. В моей среде должно быть что-то не так. Может быть ... –