Dharminder Gupta Ответов: 2

Выход из системы / выход из системы или выход из системы пользователь не работает с оконной службой


Я столкнулся с проблемой выхода из системы/выхода из системы/выхода пользователя через службу окон. Я пробовал 4 разных способа, но это не работает. Он отлично работает, когда я отлаживаю службу, но когда я создаю настройку службы и запускаю ее, то она не работает.

Это очень срочно, пожалуйста, помогите мне!!

Что я уже пробовал:

Process.Start("shutdown", "-l");


ProcessStartInfo info = new ProcessStartInfo();
                info.FileName = "shutdown";
                info.Arguments = "-l";
info.WindowStyle = ProcessWindowStyle.Hidden;
                Process p = Process.Start(info);
                p.WaitForExit();


if (!WTSDisconnectSession(WTS_CURRENT_SERVER_HANDLE, 
                                 WTS_CURRENT_SESSION, false))
                                throw new Win32Exception();


ExitWindowsEx(0, 0);

Richard MacCutchan

Мне это не кажется срочным.

Athos7

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

Тнх

Kornfeld Eliyahu Peter

Проверьте журнал событий-там вы можете найти ответ...

Dave Kreskowiak

Нет, именно это и происходит. Поскольку локальная система не может выйти из системы сама по себе, ... Ну, это не сработает.

2 Ответов

Рейтинг:
1

OriginalGriff

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

Он работает в отладке, потому что отладка службы-это особый случай, требующий большой осторожности: Как: отладка приложений службы Windows[^]

В принципе, вы не можете заставить пользователя выйти из службы напрямую. Если у вашего servioce есть права администратора, однако вы можете-теоретически, я еще не пробовал - сделать это: c# - выход интерактивных пользователей в Windows из службы-переполнение стека[^]
Но будьте осторожны. И либо сделайте резервную копию очень хорошо, прежде чем устанавливать сервис для testign, либо используйте виртуальную машину.
И не приближайте свое приложение к моему компьютеру! :смеяться:


Рейтинг:
1

Athos7

A service running as local system has the permission to do this.. 
Your task involves finding a list of logged on users : CMD
<pre>query user

Тогда это выводит что-то вроде этого:

PS C:\Users\Athos7> query user
 USERNAME              SESSIONNAME        ID  STATE   IDLE TIME  LOGON TIME
>Athos7            console             2  Active      none   7/24/2017 2:50 PM
PS C:\Users\Athos7>


Затем вы можете просто выйти из этого сеанса с помощью идентификатора:

logoff 2


Вы также можете использовать findstr, чтобы получить только строку с соответствующим идентификатором пользователя


Или
У этого парня есть довольно хороший PS-скрипт для превращения свойств в объект. и вы можете либо преобразовать его, либо позвонить ему из своей службы.
Быстрые хиты: найти вошедших в систему пользователей | узнать Powershell | достичь большего[^]


удачи