Убить процесс по имени пользователя
От: NagornovAlex Беларусь  
Дата: 02.03.06 14:23
Оценка:
Задача следующая:
На машине запущено два процесса (dllhost), но под разными пользователями (System и <CurrentUser>)
Как можно средствами C# выщемить процесс по имени пользователя(<CurrentUser>) и убить его )
(В идеале нужно было сделать shutdown COM+ приложения, а самый простой способ IMHO — это просто убить dllhost запущенный от имении пользователя)
Заранее спасиба !
Re: Убить процесс по имени пользователя
От: FunnyRabbit Россия  
Дата: 02.03.06 14:55
Оценка:
Наверное так:

using System.Diagnostics;
...........
ProcessStartInfo psi = new ProcessStartInfo("имя фала");
psi.UserName = "Имя пользователя";

Process p = new Process();
p.StartInfo = psi;
p.Kill;
.........
То что меня не убивает, делает меня умнее.
Re: Убить процесс по имени пользователя
От: TK Лес кывт.рф
Дата: 02.03.06 15:05
Оценка:
Здравствуйте, NagornovAlex, Вы писали:

NA>На машине запущено два процесса (dllhost), но под разными пользователями (System и <CurrentUser>)

NA>Как можно средствами C# выщемить процесс по имени пользователя(<CurrentUser>) и убить его )
NA>(В идеале нужно было сделать shutdown COM+ приложения, а самый простой способ IMHO — это просто убить dllhost запущенный от имении пользователя)
NA>

Используя WMI и класс Win32_Process получить список процессов и посмотреть имя владельца. На VB это выглядит примерно так:


strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
    ("Select * from Win32_Process")
For Each objProcess in colProcessList
    colProperties = objProcess.GetOwner( _
        strNameOfUser,strUserDomain)
    Wscript.Echo "Process " & objProcess.Name _
        & " is owned by " _ 
        & strUserDomain & "\" & strNameOfUser & "."
Next
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[2]: Убить процесс по имени пользователя
От: Аноним  
Дата: 03.03.06 09:59
Оценка:
TK>Используя WMI и класс Win32_Process получить список процессов и посмотреть имя владельца. На VB это выглядит примерно так:
TK>
TK>strComputer = "."
TK>Set objWMIService = GetObject("winmgmts:" _
TK>    & "{impersonationLevel=impersonate}!\\" _
TK>    & strComputer & "\root\cimv2")
TK>Set colProcessList = objWMIService.ExecQuery _
TK>    ("Select * from Win32_Process")
TK>For Each objProcess in colProcessList
TK>    colProperties = objProcess.GetOwner( _
TK>        strNameOfUser,strUserDomain)
TK>    Wscript.Echo "Process " & objProcess.Name _
TK>        & " is owned by " _ 
TK>        & strUserDomain & "\" & strNameOfUser & "."
TK>Next
TK>


А можно ли срествами WMI получить COM+ приложение и стопнуть его ?
Походу можно тока DCOM и COM приложение посмотреть Win32_ComApplication А вот COM+ приложения чтоп получить не нашел ...
Re: Убить процесс по имени пользователя
От: Admiral Украина  
Дата: 03.03.06 14:05
Оценка:
Здравствуйте, NagornovAlex, Вы писали:

NA>(В идеале нужно было сделать shutdown COM+ приложения, а самый простой способ IMHO — это просто убить dllhost запущенный от имении пользователя)


Легальнее будет использование COMAdmin (Add reference -> COM -> COM+ 1.0 Admin Type Library). Остановка приложения — проще простого:
COMAdmin.COMAdminCatalogClass c = new COMAdmin.COMAdminCatalogClass();
c.ShutdownApplication("Test");
Re[2]: Убить процесс по имени пользователя
От: NagornovAlex Беларусь  
Дата: 06.03.06 09:05
Оценка:
Здравствуйте, Admiral, Вы писали:

A>Здравствуйте, NagornovAlex, Вы писали:


NA>>(В идеале нужно было сделать shutdown COM+ приложения, а самый простой способ IMHO — это просто убить dllhost запущенный от имении пользователя)


A>Легальнее будет использование COMAdmin (Add reference -> COM -> COM+ 1.0 Admin Type Library). Остановка приложения — проще простого:

A>
A>COMAdmin.COMAdminCatalogClass c = new COMAdmin.COMAdminCatalogClass();
A>c.ShutdownApplication("Test");
A>

СПАСИБА БОЛЬШОЕ !!!! ОГРОМНЫЙ РЕСПЕКТ ! Думал что это не реально сделать !
Re[2]: Убить процесс по имени пользователя
От: NagornovAlex Беларусь  
Дата: 06.03.06 12:07
Оценка:
Здравствуйте, Admiral, Вы писали:
A>Легальнее будет использование COMAdmin (Add reference -> COM -> COM+ 1.0 Admin Type Library). Остановка приложения — проще простого:
A>
A>COMAdmin.COMAdminCatalogClass c = new COMAdmin.COMAdminCatalogClass();
A>c.ShutdownApplication("Test");
A>


СПАСИБА ОРГОМНОЕ !!!! Очень помог !!! Уже забил искать, думал что нельзя
А может быть еще как — то можно изменить тип активации COM+ приложения. В этой tlb нашел перечесление

 Enum COMAdminActivationOptions
{
 COMAdminActivationLocal,
 COMAdminActivationInProc
}

А вот ни методов, ни объектов че то не могу найти ....
Re[3]: Убить процесс по имени пользователя
От: Admiral Украина  
Дата: 06.03.06 12:34
Оценка:
Здравствуйте, NagornovAlex, Вы писали:

NA>А может быть еще как — то можно изменить тип активации COM+ приложения. А вот ни методов, ни объектов че то не могу найти ....


Будет что-то типа этого:

COMAdminCatalogClass adminCatalog = new COMAdminCatalogClass();
COMAdminCatalogCollection applications = (COMAdminCatalogCollection)adminCatalog.GetCollection("Applications");

applications.Populate();
for (int i = 0; i < applications.Count; i++)
{
    COMAdmin.ICatalogObject app = (ICatalogObject)applications.get_Item(i);
    if (app.Name.Equals("Test"))    //    Name of your application
    {
        //    1 - Server activation, 0 - in-proc (library activation);
        app.set_Value("Activation", 0);
        applications.SaveChanges();
        break;
    }
}
Re[4]: Убить процесс по имени пользователя
От: Аноним  
Дата: 06.03.06 17:53
Оценка:
Здравствуйте, Admiral, Вы писали:

A>Здравствуйте, NagornovAlex, Вы писали:


NA>>А может быть еще как — то можно изменить тип активации COM+ приложения. А вот ни методов, ни объектов че то не могу найти ....


A>Будет что-то типа этого:


A>
A>COMAdminCatalogClass adminCatalog = new COMAdminCatalogClass();
A>COMAdminCatalogCollection applications = (COMAdminCatalogCollection)adminCatalog.GetCollection("Applications");

A>applications.Populate();
A>for (int i = 0; i < applications.Count; i++)
A>{
A>    COMAdmin.ICatalogObject app = (ICatalogObject)applications.get_Item(i);
A>    if (app.Name.Equals("Test"))    //    Name of your application
A>    {
A>        //    1 - Server activation, 0 - in-proc (library activation);
A>        app.set_Value("Activation", 0);
A>        applications.SaveChanges();
A>        break;
A>    }
A>}
A>


Блин класс
А раскажи плиз как ты узнаешь какие свойства есть и как они правильно пишутся ?
Вот например, есть перечесление COMAdminServiceStatusOptions. Из чего очевидно, что есть какое-то свойство с помощью которого я могу получить статус COM+ приложения. Походу должно быть свойство типа ServiceStatus или Status (но ни то, ни другое не подходит ). Как это можно узнать ?
Re[5]: Убить процесс по имени пользователя
От: Admiral Украина  
Дата: 06.03.06 18:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А> А раскажи плиз как ты узнаешь какие свойства есть и как они правильно пишутся ?

А>Вот например, есть перечесление COMAdminServiceStatusOptions. Из чего очевидно, что есть какое-то свойство с помощью которого я могу получить статус COM+ приложения. Походу должно быть свойство типа ServiceStatus или Status (но ни то, ни другое не подходит ). Как это можно узнать ?

Конкретно по COMAdminServiceStatusOptions ничего сказать не могу.

Компонентная модель COM+ Admin описана здесь: COM+ Administration Collections. У каждого элемента есть свойства, они там более-менее подробно описаны. Так что — дерзай!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.