Тема: Компоненты Com+
Есть задача выгружать информацию о добавленных компонентах "Component Service/Computers/My Computer/Com+ Applications" - я пробую через WMI, но пока безуспешно. Может у когонибуть были похожие задачи?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Есть задача выгружать информацию о добавленных компонентах "Component Service/Computers/My Computer/Com+ Applications" - я пробую через WMI, но пока безуспешно. Может у когонибуть были похожие задачи?
Тебе нужно ветку реестра перебрать?
Нет. Компоненты COM+ можно создавать свои и запускаться они будут как dllhost.exe и не видно какой конкретно компонент запущен. Сделал временное решение через wmic.exe(он выводит подробную информацию о процесса), но это не средствами vbs, хочеться сделать поэлегантнее.
stasMsv, ну, если Вы сделали на «wmic.exe», то перевести на VBScript труда не составит. Выложите сюда Ваш код для «wmic.exe», обрамив его тэгом «code».
В данном скрипте не нравиться взаимодействие с программой 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
Теперь объясните, что этот код делает.
В общем логику понял, попробую решить через
objServices.ExecQuery("SELECT * FROM Win32_Process")
Данный скрипт следит за сосоянием процессов помещённых в dllhost.exe.
А мой вопрос?
…что этот код делает.
Смотрит три парамера у всех процессов dllhost.exe - название, PID, количество занимаемой памяти, подставляет поняные имена и сохраняет это в файл.
И всётаки через
objServices.ExecQuery("SELECT * FROM Win32_Process")
не получаеться, т.к. SID он показывает только для родительского dllhost.exe, а для дочерних нет. Буду исследоваь дальше.
А почему тогда у Вас выше?
…wmic process where(Description='smss.exe'…
Я общий принцип пока не понял, теорию.
Моя оплошность, тестировал на другой машине, там должно быть dllhost.exe.
Задача: Выводить информацию в файл о процессах: Имя процесса, его PID, количество занимаеиой памяти.
Сложности: Эти процессы запущены как дочерние от dllhost.exe и через SELECT * FROM Win32_Process нельзя узнать имя процесса или его SID
Временное решение: Программа wmic.exe выводит подробную информацию о процессах, в том числе SID процесса который запустился как dllhost.exe. Своим скриптом я делаю вывод этой программы во временный файл, затем открываю его, сохраняю всё в массив, заменяю SID на реальное имя процесса и вывожу это в файл.
Моя оплошность, тестировал на другой машине, там должно быть dllhost.exe.
Ясно.
Сложности: Эти процессы запущены как дочерние от 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» в запущенных процессах? Что для этого нужно сделать?
Спасибо за совет. Всё заработало без wmic.exe
А как запустить dllhost.exe не озадачивался, у нас на сервере соит приложение "Integrated Logistics Solutions" оно и порождает часть своих процессов таким образом.
А как запустить dllhost.exe не озадачивался, у нас на сервере соит приложение "Integrated Logistics Solutions" оно и порождает часть своих процессов таким образом.
Спасибо, ясно. Тогда Вам ещё одна просьба: Вы можете проделать такую работу — выяснить, какие именно привилегии понадобились в данном случае? То есть, выкидывать по одной привилегии, пока не останутся все необходимые, и их здесь указать. Сделаете?
В моём случае работает если указана привелегия
objSWbemServicesEx.Security_.Privileges.AddAsString "SeDebugPrivilege", True
Остальные не влияют.
Благодарю Вас.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться