VB.NET : Доступ к дескрипторам окон из службы

#.net #windows #service

#.net #Windows #Обслуживание

Вопрос:

Я пишу приложение для мониторинга процессов .NET. Это приложение отслеживает подозрительные запущенные процессы, скрывает и приостанавливает любой из них. Затем он запрашивает пользователя, следует ли возобновить процесс или прервать.

Чтобы скрыть / показать окна, я использую:

 <DllImport("user32.dll")>
Public Function ShowWindow(hWnd As IntPtr, <MarshalAs(UnmanagedType.I4)> nCmdShow As Integer) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function

Const SW_HIDE As Integer = 0
ShowWindow(process.MainWindowHandle, SW_HIDE)
 

Я не могу использовать приложение Windows Forms, потому что:

  • Приложению требуются права администратора (для мониторинга процессов администратора), но пользователи, не являющиеся администраторами, должны иметь возможность использовать его, и я не хочу, чтобы запросы UAC появлялись каждый раз
  • Приложение должно быть нечувствительным к входу пользователя в систему: оно должно продолжать выполняться, когда пользователь выходит из системы.

Вот почему я создал службу Windows, установленную под учетной записью «LocalSystem». (Пользовательские запросы по-прежнему обрабатываются приложением Windows Forms, которое взаимодействует с фоновой службой.)

Новая проблема: служба не может скрывать / показывать окна. Если окно появляется до приостановки процесса, оно замораживается, но не исчезает, поэтому пользователь видит его как «не отвечающее».

Функция, которую я использовал, работает из приложения Windows Forms. Я обнаружил, что в службе MainWindowHandle всегда возвращает 0 для любого процесса (означает «недопустимый дескриптор»), а функция Win32 EnumThreadWindows вообще не получает дескриптора. Даже при передаче действительного дескриптора вручную (извлеченного из другого приложения) вызов не имеет никакого эффекта. Проверка «Разрешить службе взаимодействовать с рабочим столом» не решает проблему.

Есть ли альтернатива для решения этой проблемы?

С уважением, E__Man.

Комментарии:

1. Какую проблему вы пытаетесь решить, скрывая окно?

2. Вы пробовали использовать Application.SetSuspendState?

3. @Krishnaraj R Я думаю, что я не могу использовать Application.SetSuspendState из моей службы. Я использую NtSuspendProcess для приостановки процесса, но это не скрывает его окна.

4. @IInspectable Мое приложение также может использоваться для предотвращения запуска программы другими пользователями: эта программа не должна отображать какую-либо информацию, если ее владелец не даст разрешения.

5. Вы не получите такой защиты / предотвращения, которую вы, похоже, ожидаете от управляемого кода. Вам придется намного, намного глубже проникнуть в систему, чтобы реализовать какую-либо защиту. Тем не менее, скрытие окна делает его невидимым для пользователя-человека. Это явно не делает его невидимым для программы, которая все еще может его найти, собрать информацию или переключить его видимость.