Заобикаляне на изолацията на сесията на Windows, показване на предупредително съобщение в потребителска сесия от системна услуга, Windows 7+

Търся да внедря функция, когато приложение, работещо като услуга на Windows (като локална система), ще покаже модално предупреждение, нещо подобно на екран за изключване или екран за предупреждение на UAC. По принцип нещо, което е невъзможно да се отхвърли, без да се забележи

Има 2 неща, които не знам как да приложа:

  1. Доколкото разбирам, Windows Vista+ вече не позволява на приложение да генерира системни модални прозорци. Възможно ли е да се заобиколи това и има ли някакъв лесен начин да се направи това? Единствената алтернатива, за която се сещам, е отваряне на прозорец на цял екран и прихващане на alt+tab, ctrl+alt+del и други подобни

  2. Също така вярвам, че не е възможно да се покаже потребителски интерфейс в потребителска сесия от услуга, тъй като тя работи в друга сесия. Има ли хак, който позволява заобикалянето на това? Едно нещо, за което мога да се сетя, е: намиране и инжектиране на код в csrss.exe или winlogon.exe, работещи в дадена сесия, и извикване на отдалечена нишка. Друг подход е получаване манипулатор за winlogon и CreateProcessAsUser(). Има ли друг по-лесен начин?


person galets    schedule 03.05.2013    source източник


Отговори (2)


Ако услугата работи като локална система, WTSQueryUserToken е най-лесният начин да получите токен за изпълнение на код в дадена сесия.

Вместо модален прозорец, помислете за създаване на нов работен плот (CreateDesktop) и превключване към него. Не можете да потискате control-alt-delete, но аз вярвам, че когато менюто control-alt-delete бъде отхвърлено, системата обикновено ще се върне на вашия работен плот. Всички други специални клавишни последователности трябва да бъдат потиснати, тъй като куките засягат само работния плот, свързан с приложението, което ги инсталира.

person Harry Johnston    schedule 04.05.2013

  1. Не съм сигурен какво имате предвид под „системни модални прозорци“. Имате предвид съобщение, което се показва на потребителя дори на екрана за влизане?

  2. Това е вярно, дори ако UserInteractive е зададено на true в регистъра, Vista и по-нови няма да позволят достъп до GUI на Windows от услуги. Има няколко начина за заобикаляне на това, начинът, по който го правя, е, че имам просто помощно приложение, което работи във фонов режим (не като услуга, просто непрекъснат процес), което използва IPC през .NET отдалечено управление, за да обработва прости съобщения, които услуга може лесно да се свързва и изпраща. Ако искате, мога да публикувам по-конкретен пример, но засега ето стъпка по стъпка как можете да приложите това (ще използвам .NET Remoting за този пример, но същият основен принцип трябва да се прилага за всяко IPC решение ти използваш):

    1. Create a program that acts as a .NET remoting server (NOT as a service, just a continuous process) using the IPC protocol. The remotable interface should contain at least one member for accepting new data, in most cases strings work fine for me. The implemented class should also be able to continuously process new messages.
    2. Свържете се с услугата, като използвате отдалечения интерфейс, внедрен в стъпка едно, и изпратете съобщение, което да се покаже на IPC сървъра.
    3. IPC услугата трябва да обработи това съобщение и да го покаже на потребителя, използвайки предпочитаните от вас средства или показвайки съобщения на потребителя. Аз лично използвам модална форма в отделна нишка, която позволява на крайния потребител да копира съобщението, ако желае.
person Bender the Greatest    schedule 21.05.2013
comment
Докато този подход е по-прост от стартирането на процес в контекста на потребителя, имайте предвид, че е по-малко ефективен; това изисква допълнителен процес, който да се изпълнява в контекста на потребителя през цялото време. - person Harry Johnston; 21.05.2013
comment
В моя случай поставих слушателя в приложение в трей, което вече се използва за управление/наблюдение на услугата. Да, това наистина изисква присъствието на друг процес, работещ по всяко време, но тъй като вече имахме друг процес, който се изпълнява при влизане на потребител, просто пуснах слушателя там. Тази техника работи и когато услугата не работи като акаунт LocalSystem. - person Bender the Greatest; 21.05.2013