Написать XML-документ для группировки информации из двух разных подпрограмм vb.net - PullRequest
0 голосов
/ 19 января 2012

Я пытаюсь восстановить все процессы, запущенные на машине, с обычной информацией; идентификатор процесса, имя и использование памяти. Я пытаюсь экспортировать все это в один XML-файл, однако, чтобы получить всю информацию, мне пришлось использовать 2 отдельных метода.

для получения идентификатора процесса, имени и идентификатора сеанса (владельца процесса) я использовал следующий код вместе со словарем и классом, используя .net-библиотеку под названием Cassia.

Using server As ITerminalServer = manager.GetRemoteServer("Spartacus")
        server.Open()
        For Each process As ITerminalServicesProcess In server.GetProcesses()
            If Not String.IsNullOrEmpty(process.ProcessId) Then
                dictprocess.Add(process.ProcessId, New Processes(process.ProcessId, process.ProcessName, process.SessionId))
            End If
        Next
    End Using

    Dim sbProcess As New StringBuilder
    sbProcess.AppendLine("<?xml version=""1.0""?>")
    sbProcess.AppendLine("<Processes>")
    For Each item As KeyValuePair(Of Integer, Processes) In dictprocess
        sbProcess.AppendFormat("<Name>""{0}""<ProcessID>""{1}""</ProcessID><ProcessName>{2}</ProcessName><SessionID>{3}</SessionID></Name>", item.Key, item.Value.ProcessId, item.Value.ProcessName, item.Value.SessionId).AppendLine()
    Next
    sbProcess.AppendLine("</Processes>")

, чтобы получить использование памяти и файла подкачки, я использовал wmi-запрос

   Dim sbTest As New System.Text.StringBuilder

    objWMI = GetObject("winmgmts:\\.\root\cimv2")
    colObjects = objWMI.ExecQuery("Select * From Win32_Process")

    For Each Item In colObjects
        sbTest.AppendFormat("<ProcessID>""{0}""<ProcessName>""{1}""</ProcessName><MemoryUsage>{2}</MemoryUsage><PageFileUsage>{3}</PageFileUsage></ProcessID>", Item.ProcessID, Item.Name, (Item.WorkingSetSize / 1024), Item.PageFileUsage)
    Next

Я могу записать результаты в виде двух отдельных XML-файлов:

Идентификатор процесса, имя и идентификатор сеанса:

- <Processes>
- <Name>
  "540" 
  <ProcessID>"540"</ProcessID> 
  <ProcessName>wininit.exe</ProcessName> 
  <SessionID>0</SessionID> 
  </Name>
- <Name>
  "552" 
  <ProcessID>"552"</ProcessID> 
  <ProcessName>csrss.exe</ProcessName> 
  <SessionID>1</SessionID> 

Использование памяти и файла подкачки

- <ProcessUsage>
- <ProcessID>
  "540" 
  <ProcessName>"wininit.exe"</ProcessName> 
  <MemoryUsage>4080</MemoryUsage> 
  <PageFileUsage>1464</PageFileUsage> 
  </ProcessID>
- <ProcessID>
  "552" 
  <ProcessName>"csrss.exe"</ProcessName> 
  <MemoryUsage>5600</MemoryUsage> 
  <PageFileUsage>2332</PageFileUsage> 
  </ProcessID>

Как видите, уникальный идентификатор (идентификатор процесса) одинаков в каждом xml. Можно ли как-нибудь написать xml, чтобы информация из обоих методов была под одним тегом?

1 Ответ

2 голосов
/ 19 января 2012

В общем, вы можете создать класс, в котором есть члены, у которых есть все данные, которые вы хотели бы собрать. Затем используйте некоторый тип контейнера (я бы предложил словарь с ключом по идентификатору процесса), измените вашу функцию, чтобы взять указанный контейнер. Если идентификатор процесса найден в контейнере, обновите нужные поля, если они не найдены, добавьте запись. Затем зациклите контейнер и напишите xml.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...