2015-02-11 2 views
4

В одном из моих приложений на 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()). Есть идеи?

ответ

0

Похож на ошибку в .NET, хотя пока кто-то не сможет ее воспроизвести, есть шанс, что это просто какая-то странность на вашей машине.

В любом случае вызов функции LeaveDebugMode() для устранения проблемы должен быть безобидным. Все, что он делает, это отключить привилегию, возвращая поток в нормальное состояние. (Документация не говорит, но предположительно вызывает LeaveDebugMode(), когда привилегия отладки уже отключена, просто ничего не делает, вот как ведет себя базовый API.)

+0

Мне удалось воспроизвести его на совершенно разных системах (но и W7-64): встроенная версия и простой W7 Professional. Оба устанавливают антивирусное ПО, но не одно и то же: Avira на W7-embedded и MCafee на W7-professional. Ничего особенного не установлено. Кстати, по соображениям обратной совместимости я все еще должен использовать VS2005 (но мне это не важно). –

+0

Я не могу воспроизвести его здесь, но я не эксперт в C#, поэтому я могу делать что-то неправильно. –

+0

Я все еще расследую эту проблему.Ответ удовлетворительный для меня, так как я хотел быть уверенным, что LeaveDebugMode является разумным обходным решением, но я хотел бы найти реальный источник этой странной вещи. Может быть, какое-то исправление MS? Я как можно скорее попробую свой тестовый тест на совершенно другой машине, я не могу поверить, что такая ошибка существует, и никто ее не заметил. В моей среде должно быть что-то не так. Может быть ... –

Смежные вопросы