1

Тема: Компоненты Com+

Есть задача выгружать информацию о добавленных компонентах "Component Service/Computers/My Computer/Com+ Applications" - я пробую через WMI, но пока безуспешно. Может у когонибуть были похожие задачи?

2

Re: Компоненты Com+

Тебе нужно ветку реестра перебрать?

3

Re: Компоненты Com+

Нет. Компоненты COM+ можно создавать свои и запускаться они будут как dllhost.exe  и не видно какой конкретно компонент запущен. Сделал временное решение через wmic.exe(он выводит подробную информацию о процесса), но это не средствами vbs, хочеться сделать поэлегантнее.

4

Re: Компоненты Com+

stasMsv, ну, если Вы сделали на «wmic.exe», то перевести на VBScript труда не составит. Выложите сюда Ваш код для «wmic.exe», обрамив его тэгом «code».

5

Re: Компоненты Com+

В данном скрипте не нравиться взаимодействие с программой wmic.exe, я думаю можно получить информацию о компанентах через пространство имён WMI. На данный момент скрипт имеет вид:

File_tmp = "ILS_View.tmp"              ' временный файл'
File_name_out = "Manx_ILS_Components_Info.txt"             ' файл для вывода информации'

' эту информацию можно получить у свойств компонентов COM+'

Name_ILS_directory = "C:\WINDOWS\system32\dllhost.exe"
Name_dllhost = "/Processid:{02D4B3F1-FD88-11D1-960D-00805FC79235}"

Name_ILS_1 = "/Processid:{8F60B80B-D3CE-479F-AE1B-C5AC9C1EE7F6}"
Name_ILS_2 = "/Processid:{6D13CEC1-771D-4023-A511-F4B64529098B}"
Name_ILS_3 = "/Processid:{D3937BA7-3DF8-4222-9B96-6B5ED8A8CCAD}"
Name_ILS_4 = "/Processid:{F74F7701-1792-4BBE-9F58-4D6D45AE1243}"
Name_ILS_5 = "/Processid:{2DED7A83-2B13-4C9D-BFD2-AAC5A300B4DE}"
Name_ILS_6 = "/Processid:{714633DB-7E5D-46F4-8C2A-FF6094578E93}"
Name_ILS_7 = "/Processid:{ECBAD076-2CBF-445D-8B7B-9B334F21ADB5}"
Name_ILS_8 = "/Processid:{31B98513-605F-4DD9-B215-DED72CE9B761}"
Name_ILS_9 = "/Processid:{B0C86DE7-053E-40AA-BC81-3C81F34E5D46}"
Name_ILS_10= "/Processid:{F61D8907-8751-4E22-A016-B8034A074689}"
Name_ILS_11= "/Processid:{44D8FE1B-7C5C-402C-87D6-AD8D879462C9}"
Name_ILS_12= "/Processid:{9E78CF32-BFBF-4427-AF14-C0BF9D0FFED9}"

R_name_ILS_1 = "ILSConfigs"
R_name_ILS_2 = "ILSInterface"
R_name_ILS_3 = "ILSInventory"
R_name_ILS_4 = "ILSProgistics"
R_name_ILS_5 = "ILSReceiving"
R_name_ILS_6 = "ILSReporting"
R_name_ILS_7 = "ILSShipping"
R_name_ILS_8 = "ILSSystemManager"
R_name_ILS_9 = "ILSUtility"
R_name_ILS_10= "ILSWave"
R_name_ILS_11= "ILSWop"
R_name_ILS_12= "ILSWork"


Dim Data(100)    '  Массив для хранения данных получаемых от программы wmic.exe'


On Error Resume Next


Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run "cmd /c wmic process where(Description="&Chr(34)&"smss.exe"&Chr(34)&") GET CommandLine,ProcessId,WorkingSetSize > " & File_tmp


'=============================================================  Чение файла с данными о процессах ---------------------------------'


Set fsol = CreateObject("Scripting.FileSystemObject")

i=0
t=0


Do While Not(fsol.FileExists(File_tmp))
if t>5 then WScript.Quit
WScript.Sleep 500
t=t+1
Loop
    If fsol.FileExists(File_tmp) Then
       Set file_in = fsol.OpenTextFile(File_tmp, 1, False, -1)
       If Err.Number <> 0 Then
        WScript.Quit
        end if
    else    
     WScript.Echo WScript.Quit
    end if
    
    


file_in.SkipLine

Do While Not(file_in.AtEndofStream)
    Data(i) = File_in.ReadLine
    i=i+1
Loop
i=i-1
File_in.close

'=============================================================  Удаление временного файла ---------------------------------'
t=0
Do While Not(fsol.FileExists(File_tmp) <> 0)
if t>5 then WScript.Quit
WScript.Sleep 500
t=t+1
Loop
    If fsol.FileExists(File_tmp) <> 0  Then
       fsol.DeleteFile(File_tmp)
    end if


'=============================================================  Записываем данные в файл ---------------------------------'

Name_Id =0
Name_Pr =0
UseMem  =0
k =0 
l =0
Mas_out = 0 


Set FSO = CreateObject("Scripting.FileSystemObject")
Set File_out = FSO.OpenTextFile(File_name_out, 2, True)
    If Err.Number <> 0 Then
        WScript.Quit
    end if


for k=0 to i

    if InStr(Data(k), Name_dllhost) then 
    k=k+1
    end if
    
    Mas_out = split(Data(k))
    
    for l=0 to UBound(Mas_out)
 
       
        if Mas_out(l) <> "" then
        
        File_out.Write(" ")
        select case Mas_out(l)
        case Name_ILS_1: File_out.Write(R_name_ILS_1) 
        case Name_ILS_2: File_out.Write(R_name_ILS_2)
        case Name_ILS_3: File_out.Write(R_name_ILS_3)
        case Name_ILS_4: File_out.Write(R_name_ILS_4)
        case Name_ILS_5: File_out.Write(R_name_ILS_5)
        case Name_ILS_6: File_out.Write(R_name_ILS_6)
        case Name_ILS_7: File_out.Write(R_name_ILS_7)
        case Name_ILS_8: File_out.Write(R_name_ILS_8)
        case Name_ILS_9: File_out.Write(R_name_ILS_9)
        case Name_ILS_10: File_out.Write(R_name_ILS_10)
        case Name_ILS_11: File_out.Write(R_name_ILS_11)
        case Name_ILS_12: File_out.Write(R_name_ILS_12)
        case Name_ILS_directory: 'File_out.Write("")
        
        case else: File_out.Write(Mas_out(l))
        
        end select
        end if
        
    next
    File_out.Write(Chr(13)&Chr(10))
  

next

WScript.Quit

6

Re: Компоненты Com+

Теперь объясните, что этот код делает.

7 (изменено: stasMsv, 2011-01-20 17:39:15)

Re: Компоненты Com+

В общем логику понял, попробую решить через 

objServices.ExecQuery("SELECT * FROM Win32_Process")

Данный скрипт следит за сосоянием процессов помещённых в dllhost.exe.

8

Re: Компоненты Com+

А мой вопрос?

…что этот код делает.

9 (изменено: stasMsv, 2011-01-20 17:20:01)

Re: Компоненты Com+

Смотрит три парамера у всех процессов dllhost.exe - название, PID, количество занимаемой памяти, подставляет поняные имена и сохраняет это в файл.
И всётаки через

objServices.ExecQuery("SELECT * FROM Win32_Process")

не получаеться, т.к. SID он показывает только для родительского dllhost.exe, а для дочерних нет. Буду исследоваь дальше.

10

Re: Компоненты Com+

А почему тогда у Вас выше?

…wmic process where(Description='smss.exe'…

Я общий принцип пока не понял, теорию.

11

Re: Компоненты Com+

Моя оплошность, тестировал на другой машине, там должно быть dllhost.exe.

Задача: Выводить информацию в файл о процессах: Имя процесса, его PID, количество занимаеиой памяти.

Сложности: Эти процессы запущены как дочерние от dllhost.exe и через SELECT * FROM Win32_Process нельзя узнать имя процесса или его SID

Временное решение: Программа wmic.exe выводит подробную информацию о процессах, в том числе SID процесса который запустился как dllhost.exe. Своим скриптом я делаю вывод этой программы во временный файл, затем открываю его, сохраняю всё в массив, заменяю SID на реальное имя процесса и вывожу это в файл.

12

Re: Компоненты Com+

stasMsv пишет:

Моя оплошность, тестировал на другой машине, там должно быть dllhost.exe.

Ясно.

stasMsv пишет:

Сложности: Эти процессы запущены как дочерние от dllhost.exe и через SELECT * FROM Win32_Process нельзя узнать имя процесса или его SID

Если выводит «wmic.exe», то и приведённый запрос WMI должен работать. Возможно, требуется указать дополнительные привилегии при создании объекта «WbemServices». Попробуйте с ними поиграться, например:

Option Explicit

Dim strComputer

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim collSWbemObjectSet
Dim objSWbemObjectEx


strComputer = "."

Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")

objSWbemServicesEx.Security_.Privileges.AddAsString "SeDebugPrivilege",                True
objSWbemServicesEx.Security_.Privileges.AddAsString "SeProfileSingleProcessPrivilege", True
objSWbemServicesEx.Security_.Privileges.AddAsString "SeCreatePermanentPrivilege",      True
objSWbemServicesEx.Security_.Privileges.AddAsString "SeRestorePrivilege",              True

Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_Process")

For Each objSWbemObjectEx In collSWbemObjectSet
    With objSWbemObjectEx
        WScript.Echo "-----------------------------------"
        WScript.Echo .Name
        WScript.Echo .ExecutablePath
        WScript.Echo .CommandLine
        WScript.Echo .ProcessID
        WScript.Echo .WorkingSetSize
        WScript.Echo
    End With
Next

Set objSWbemObjectEx   = Nothing
Set collSWbemObjectSet = Nothing
Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

WScript.Quit 0

stasMsv, каким образом мне можно добиться появления «dllhost.exe» в запущенных процессах? Что для этого нужно сделать?

13

Re: Компоненты Com+

Спасибо за совет. Всё заработало без wmic.exe 

А как запустить dllhost.exe не озадачивался, у нас на сервере соит приложение "Integrated Logistics Solutions" оно и порождает часть своих процессов таким образом.

14

Re: Компоненты Com+

stasMsv пишет:

А как запустить dllhost.exe не озадачивался, у нас на сервере соит приложение "Integrated Logistics Solutions" оно и порождает часть своих процессов таким образом.

Спасибо, ясно. Тогда Вам ещё одна просьба: Вы можете проделать такую работу — выяснить, какие именно привилегии понадобились в данном случае? То есть, выкидывать по одной привилегии, пока не останутся все необходимые, и их здесь указать. Сделаете?

15

Re: Компоненты Com+

В моём случае работает если указана привелегия
 

 objSWbemServicesEx.Security_.Privileges.AddAsString "SeDebugPrivilege",                True

Остальные не влияют.

16

Re: Компоненты Com+

Благодарю Вас.