Discussion:
кильнуть сервис
(слишком старое сообщение для ответа)
Michael Yuzhakov
2009-01-27 20:10:17 UTC
Permalink
Джентльмены!

Имеется задача - кильнуть некоторый сервис по его пиду. Пишу следующий код:

//Фрагмент киляющего сервиса.
// hProcess:=OpenProcess(PROCESS_ALL_ACCESS, true, pid); //Так тоже не
работает.
hProcess:=OpenProcess(PROCESS_TERMINATE, true, pid);
if hProcess<>0 then
begin
//debug
WriteLog('kill:terminate'); - досюда не доходит, т.е. handle
процесса не открыт.
TerminateProcess(hProcess,0);
CloseHandle(hProcess);
end;
Данный код работает, когда в качестве киляемого процесса подсовываю
какую-либо прогу (обычную, не сервис). В случае, когда киляемый процесс есть
сервис, киляющий сервис его кильнуть не может - возвращается нулевой handle
процесса. Естественно, оба сервиса - и киляющий, и киляемый - запущены под
одним и тем же юзером, имеющим административные права. Под тем же юзером я
пробую руками кильнуть киляемый процесс таск манагером - киляется без проблем.
Что по этому поводу думает всезнающий All?
Варианты "net stop" или запуск киляющего процесса под localsystem не
подходят по некоторым причинам космического порядка.


С большим приветом, Южаков Михаил.
_________________________________________________________
е-мыло: yuzhakov<собака>etel.ru
Eugene Muzychenko
2009-01-28 08:13:37 UTC
Permalink
Привет!

27 Jan 09 23:10, you wrote to All:

MY> В случае, когда киляемый процесс есть сервис, киляющий сервис его
MY> кильнуть не может - возвращается нулевой handle процесса.

Код ошибки, понятное дело, не рассматривается?

Всего доброго!
Евгений Музыченко
eu-***@muzy-chen-ko.net (минусы убрать)
Michael Yuzhakov
2009-01-28 18:22:09 UTC
Permalink
On Wednesday January 28 2009 you wrote to Michael Yuzhakov:

MY>> В случае, когда киляемый процесс есть сервис, киляющий сервис его
MY>> кильнуть не может - возвращается нулевой handle процесса.

EM> Код ошибки, понятное дело, не рассматривается?

Прикрутил. Код 5 (Отказано в доступе), что и следовало ожидать. Ы?

С большим приветом, Южаков Михаил.
_________________________________________________________
е-мыло: yuzhakov<собака>etel.ru
Eugene Muzychenko
2009-01-29 07:46:30 UTC
Permalink
Привет!

28 Jan 09 21:22, you wrote to me:

MY> Код 5 (Отказано в доступе), что и следовало ожидать. Ы?

Теперь запускай Process Explorer и смотри дескрипторы защиты киляемых
процессов. Там часто стоят Deny, и вообще ограничиваются права для посторонних
(у Local System привилегий больше, чем у администратора). В этом случае твоей
килялке придется модифицировать дескриптор.

Всего доброго!
Евгений Музыченко
eu-***@muzy-chen-ko.net (минусы убрать)
Andrey Voitenkov
2009-01-30 21:46:15 UTC
Permalink
On Thu, Jan 29, 2009 at 10:46:30AM +0300, Eugene Muzychenko wrote:
[...]
Post by Eugene Muzychenko
MY> Код 5 (Отказано в доступе), что и следовало ожидать. Ы?
Теперь запускай Process Explorer и смотри дескрипторы защиты киляемых
процессов. Там часто стоят Deny, и вообще ограничиваются права для посторонних
(у Local System привилегий больше, чем у администратора). В этом случае твоей
килялке придется модифицировать дескриптор.
Можно тупее, с дебуг-привилегией.

Вот кусочек кода от убивалки:
--- cut ---
if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)){
...
}
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &debugLUID);
pTokenPriv->PrivilegeCount = 1;
pTokenPriv->Privileges[0].Luid = debugLUID;
pTokenPriv->Privileges[0].Attributes = turboModeOn?SE_PRIVILEGE_ENABLED:0;
AdjustTokenPrivileges(hToken, FALSE, pTokenPriv, NULL, NULL, NULL);
...
--- cut ---

После этого OpenProcess + TerminateProcess с сервисами справляются...
--
mccloud@
Michael Yuzhakov
2009-02-06 10:05:23 UTC
Permalink
Post by Eugene Muzychenko
MY> Код 5 (Отказано в доступе), что и следовало ожидать. Ы?
Теперь запускай Process Explorer и смотри дескрипторы защиты киляемых
процессов. Там часто стоят Deny, и вообще ограничиваются права для
посторонних (у Local System привилегий больше, чем у администратора). В
этом случае твоей килялке придется модифицировать дескриптор.
AV> Можно тупее, с дебуг-привилегией.

AV> Вот кусочек кода от убивалки:
AV> - --- cut ---
AV> if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES,
AV> &hToken)){ ... } LookupPrivilegeValue(NULL, SE_DEBUG_NAME,
AV> &debugLUID); pTokenPriv->PrivilegeCount =
AV> 1; pTokenPriv->Privileges[0].Luid =
AV> debugLUID; pTokenPriv->Privileges[0].Attributes =
AV> turboModeOn?SE_PRIVILEGE_ENABLED:0; AdjustTokenPrivileges(hToken, FALSE,
AV> pTokenPriv, NULL, NULL, NULL);
AV> ...
AV> - --- cut ---

AV> После этого OpenProcess + TerminateProcess с сервисами справляются...


Скажи пожалуйста, эта килялка у тебя написана как аппликуха или сервис?
Счас пробую в свой сервис это впендюрить, AdjustTokenPrivileges выдает ошибку
"Отказано в доступе". До нее все нормально. Сервис работает от имени админа. От
localsystem запустить не смогу, ибо завязано с сетью.

С большим приветом, Южаков Михаил.
_________________________________________________________
е-мыло: yuzhakov<собака>etel.ru
Andrey Voitenkov
2009-02-06 16:01:19 UTC
Permalink
On Fri, Feb 06, 2009 at 01:05:23PM +0300, Michael Yuzhakov wrote:
[...]
Post by Michael Yuzhakov
AV> 1; pTokenPriv->Privileges[0].Luid =
AV> debugLUID; pTokenPriv->Privileges[0].Attributes =
AV> turboModeOn?SE_PRIVILEGE_ENABLED:0; AdjustTokenPrivileges(hToken, FALSE,
AV> pTokenPriv, NULL, NULL, NULL);
AV> ...
AV> - --- cut ---
AV> После этого OpenProcess + TerminateProcess с сервисами справляются...
Скажи пожалуйста, эта килялка у тебя написана как аппликуха или сервис?
Счас пробую в свой сервис это впендюрить, AdjustTokenPrivileges выдает ошибку
"Отказано в доступе". До нее все нормально. Сервис работает от имени админа. От
localsystem запустить не смогу, ибо завязано с сетью.
Маленькая гуевая аппликушка, запускается админом. В общем-то написана была
специально для убивания заглохших сервисов во время разработки и тестирования.

Из сервисов не пробовал такого делать.
--
mccloud@
Michael Yuzhakov
2009-02-07 09:47:43 UTC
Permalink
Post by Eugene Muzychenko
MY> Код 5 (Отказано в доступе), что и следовало ожидать. Ы?
Теперь запускай Process Explorer и смотри дескрипторы защиты киляемых
процессов. Там часто стоят Deny, и вообще ограничиваются права для
посторонних (у Local System привилегий больше, чем у администратора). В
этом случае твоей килялке придется модифицировать дескриптор.
AV> Можно тупее, с дебуг-привилегией.

AV> Вот кусочек кода от убивалки:
AV> - --- cut ---
AV> if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES,
AV> &hToken)){ ... } LookupPrivilegeValue(NULL, SE_DEBUG_NAME,
AV> &debugLUID); pTokenPriv->PrivilegeCount =
AV> 1; pTokenPriv->Privileges[0].Luid =
AV> debugLUID; pTokenPriv->Privileges[0].Attributes =
AV> turboModeOn?SE_PRIVILEGE_ENABLED:0; AdjustTokenPrivileges(hToken, FALSE,
AV> pTokenPriv, NULL, NULL, NULL);
AV> ...
AV> - --- cut ---

AV> После этого OpenProcess + TerminateProcess с сервисами справляются...

Все, заработало (с дебуг-привилегией сервис киляет сервис). Спасиба.

С большим приветом, Южаков Михаил.
_________________________________________________________
е-мыло: yuzhakov<собака>etel.ru

Aleksey Kozlov
2009-01-28 17:37:41 UTC
Permalink
Hi, Michael Yuzhakov!

27 Jan 09 23:10, you wrote to All:

MY> Варианты "net stop" или запуск киляющего процесса под localsystem
MY> не подходят по некоторым причинам космического порядка.

Т.е. ControlService не подойдёт?

With best regards, Aleksey.
Michael Yuzhakov
2009-01-29 20:29:10 UTC
Permalink
On Wednesday January 28 2009 you wrote to Michael Yuzhakov:

MY>> Варианты "net stop" или запуск киляющего процесса под localsystem
MY>> не подходят по некоторым причинам космического порядка.

AK> Т.е. ControlService не подойдёт?

Hаписуемая приблуда - суть некий watchdog, контролирующий другой сервис. В
наихудшем случае контролируемый сервис может висеть, поэтому его киляем жестко.

С большим приветом, Южаков Михаил.
_________________________________________________________
е-мыло: yuzhakov<собака>etel.ru
Aleksey Kozlov
2009-01-30 13:28:37 UTC
Permalink
Hi, Michael Yuzhakov!

29 Jan 09 23:29, you wrote to me:

AK>> Т.е. ControlService не подойдёт?

MY> Hаписуемая приблуда - суть некий watchdog, контролирующий другой
MY> сервис. В наихудшем случае контролируемый сервис может висеть, поэтому
MY> его киляем жестко.

Я так примерно и предполагал. А если ты пытаешься остановить сервис и он не
отвечает, система сама его не убьёт? Вроде бы это подразумевается, раз сервис
должен рапортавать, что команду принял, и сколько времени нужно на выполнение.
Честно говоря, не помню чтобы у меня зависал сервис даже в процессе его
написания, так что точно сказать не могу.

With best regards, Aleksey.
Michael Yuzhakov
2009-01-30 18:00:25 UTC
Permalink
On Friday January 30 2009 you wrote to Michael Yuzhakov:

MY>> Hаписуемая приблуда - суть некий watchdog, контролирующий другой
MY>> сервис. В наихудшем случае контролируемый сервис может висеть, поэтому
MY>> его киляем жестко.

AK> Я так примерно и предполагал. А если ты пытаешься остановить сервис и он
AK> не
AK> отвечает, система сама его не убьёт? Вроде бы это подразумевается, раз

Hе убивает. Я эксперимент провел! (c) Дойдут руки, поколупаю секьюрити
дескрипторы, доложу уважаемому сообществу о результатах.

AK> сервис должен рапортавать, что команду принял, и сколько времени
AK> нужно на
AK> выполнение. Честно говоря, не помню чтобы у меня зависал сервис даже в
AK> процессе его написания, так что точно сказать не могу.

С большим приветом, Южаков Михаил.
_________________________________________________________
е-мыло: yuzhakov<собака>etel.ru
Loading...