обновить значения в словаре новыми полями, полученными из запроса wmi vb.net - PullRequest
0 голосов
/ 21 января 2012

EDIT

Я все еще не могу присвоить процессу имя пользователя идентификатора сеанса, связанного с ним.

Это код, который я использую для получения информации о пользователе:

    Public Sub GetUsers()
    Using server As ITerminalServer = manager.GetRemoteServer(strHostName)
        server.Open()
        For Each session As ITerminalServicesSession In server.GetSessions()
            If Not String.IsNullOrEmpty(session.UserName) Then
                dictuser.Add(session.SessionId, New User(session.SessionId, session.UserName))
            End If
        Next
    End Using
End Sub

мой пользовательский класс определяется просто как:

Public Class User
Private _SessionID As Integer
Private _UserName As String

Sub New(ByVal SessionID As Integer, ByVal UserName As String)
    _SessionID = SessionID
    _UserName = UserName
End Sub

Public ReadOnly Property SessionID As String
    Get
        Return _SessionID
    End Get
End Property

Public ReadOnly Property UserName As String
    Get
        Return _UserName
    End Get
End Property
End Class

Я создал функцию в своем классе процессов:

Public Sub AddUserInfo(ByVal UserName As String)
    _UserName = UserName
End Sub

1 Ответ

1 голос
/ 21 января 2012

Это заменяет процесс, если в словаре найден процесс с таким же идентификатором, и автоматически добавляет новый процесс в противном случае.

dictProcess(process.ProcessId) = process

РЕДАКТИРОВАТЬ (в ответ на ваш отредактированный вопрос):

Я бы изменил имя класса Processes на Process, так как он не является коллекцией, но должен представлять один процесс. Вы можете изменить конструктор класса Process на

Public Sub New(ByVal ProcessId As Integer, ByVal ProcessName As String, ByVal SessionId As Integer)            
    _ProcessId = ProcessId            
    _ProcessName = ProcessName            
    _SessionId = SessionId            
End Sub

Затем добавьте метод

Public Sub AddWmiInfo (ByVal PageFileUsage As Integer, ByVal WorkingSetSize As Integer)
    _PageFileUsage = PageFileUsage            
    _WorkingSetSize = WorkingSetSize            
End Sub

В качестве альтернативы, вы можете также сделать эти свойства доступными для чтения / записи, однако вы получите более качественную инкапсуляцию, подобную этой.

Добавить основную информацию о процессе в словарь с помощью Cassia. Обратите внимание, что ProcessId объявлен как Integer, и поэтому проверка Not String.IsNullOrEmpty(process.ProcessId) не имеет смысла.

For Each process As ITerminalServicesProcess In server.GetProcesses()                       
    dictprocess.Add( _
      process.ProcessId, _
      New Process(process.ProcessId, process.ProcessName, process.SessionId))                       
Next

Наконец, вы бы добавили информацию из WMI следующим образом:

Dim p As Process = Nothing
For Each wmiProcess In prowmi
    If dictprocess.TryGetValue(wmiProcess.ProcessID, p) Then
        p.AddWmiInfo(wmiProcess.PageFileUsage, wmiProcess.WorkingSetSize)
    End If
Next

TryGetValue возвращает процесс в переменной p. Второй параметр TryGetValue является параметром ByRef.


EDIt # 2:

Ваш цикл должен читать

Dim p As Process = Nothing
For Each user As User In dictuser.Values
    If dictprocess.TryGetValue(user.SessionID, p) Then
        p.AddUserInfo(user.UserName)
    End If
Next

Однако, если вы никогда не получаете доступ к пользовательскому словарю через ключ (идентификатор сеанса), тогда список будет более подходящим, чем словарь.

...