как отправлять входные данные для winlogon в С#

Как сменить рабочий стол? Меня интересует отправка событий мыши на рабочий стол winlogon (я буду запускать приложение под системной учетной записью). Дело в том, что ничего не происходит, когда я вызываю mouse_event (или любую другую функцию (keybd_event, sendinput, sendkeys и т. д.). Ничего не происходит, даже если я все еще нахожусь на рабочем столе по умолчанию. setthreaddesktop возвращает true, так что это означает, что изменение удалось. Я даже пытался поставить messagebox с тем же результатом.

Я создал новый поток, потому что в противном случае setthreaddesktop вернет код ошибки 170 (ресурс используется).

      bool dd = false;
      StringBuilder name = new StringBuilder(200, 200);

       uint sss = 0;
      IntPtr hDesktop = OpenInputDesktop(1, true, desktop_ReadObjects | desktop_WriteObjects);

      System.Threading.Tasks.Task.Factory.StartNew(() =>
        {   dd = SetThreadDesktop(hDesktop);
            CloseDesktop(hDesktop);
            bool get = GetUserObjectInformation(hDesktop, 2, name, 100, ref sss);
                SendKeys.Send("X");
            mouse_event(MOUSEEVENTF_LEFTDOWN, 400, 400, 0, 0);
            mouse_event(MOUSEEVENTF_LEFTUP, 400, 400, 0, 0);
            mouse_event(MOUSEEVENTF_RIGHTDOWN, 400, 400, 0, 0);
            mouse_event(MOUSEEVENTF_RIGHTUP, 400, 400, 0, 0);
}).Wait();

Изменить: если я не использую SetThreadDesktop, mouse_event работает

Спасибо,


person mertin    schedule 25.11.2013    source источник
comment
У меня есть две мысли по этому поводу: 1) системная учетная запись, вероятно, неинтерактивна (у нее нет мыши) 2) Winlogon, вероятно, критичен для безопасности, поэтому вы не должны с ним связываться. Что вы вообще хотите заархивировать?   -  person TGlatzer    schedule 25.11.2013
comment
То же самое происходит, когда я нахожусь на рабочем столе по умолчанию. Я бы понял, если бы так было только на рабочем столе Winlogon, но это не так.   -  person mertin    schedule 25.11.2013
comment
Почему вы хотите переключить пользователей? Если вам нужно запустить процесс от имени другого пользователя, вы можете использовать команду runas.   -  person Rob    schedule 25.11.2013
comment
Я хочу сделать приложение для удаленного рабочего стола. Мне нужно обработать приглашение UAC. Это главная проблема.   -  person mertin    schedule 25.11.2013
comment
UAC-Prompt работает на защищенном рабочем столе — вам, вероятно, не будет разрешено отправлять туда входные данные.   -  person TGlatzer    schedule 25.11.2013
comment
это не правда. если приложение работает под системной учетной записью, вы можете отправлять входные данные. Опять же, то же самое происходит, когда я все еще на рабочем столе по умолчанию.   -  person mertin    schedule 26.11.2013


Ответы (1)


Рабочий стол входа в Windows защищен и требует специальных разрешений для запуска процессов и циклов обработки сообщений.

Если вы работаете в системе, вы можете продублировать свой собственный токен безопасности и изменить SessionId с помощью SetTokenInformation, чтобы создать новый процесс (используя CreateProcessAsUser) на рабочем столе WinSta0\Winlogon целевого пользовательского сеанса.

Кроме того, вы можете продублировать маркер безопасности другого процесса, работающего как SYSTEM в сеансе целевого пользователя, например winlogon.exe и lsass.exe. См.: Запуск процесса на экране приветствия Windows 7

В любом случае, для выполнения этой задачи вам придется делать много вызовов Win32.

person hyru    schedule 03.12.2013