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