使用WMI vb.net 2017远程查找登录用户

时间:2017-09-26 11:59:39

标签: vb.net networking wmi

我一直在创建一个带有按钮的应用程序来远程停止并重新启动进程然后重新启动服务。 在执行这些任务之前,它将ping您输入到文本框的主机名,如果它在线,则会将ip解析为另一个文本框

我想让它抓住第一个文本框(txtWS)的登录用户并将其显示在标签中

ping工作正常,转换为IP工作正常但是当我尝试抓住登录用户时它永远不会工作我已经玩了代码很多并在这里看了一些问题(甚至采用了一些代码)和仍然我无法让这个工作,任何人都可以告诉我,我做错了吗?

这是我的代码:

Imports System.Net
Imports System.Net.NetworkInformation
Imports System.Globalization
Imports System.IO
Imports Microsoft.Win32
Imports System.Management

按钮代码:

If txtWS.Text.Length <> 0 Then

            ConnectWSButton.Enabled = True

            Console.Text &=
            "WS/Host: " & txtWS.Text & vbCrLf

            pingSender.SendAsync(txtWS.Text, Nothing)
        Else
            Console.Text = "Unable to Ping Hostname or Workstation! Please try again, or try via IP Address." & vbCrLf & "Error: " & MsgBoxStyle.Critical & vbNewLine & vbNewLine
            Exit Sub
        End If

        Try
            'Get IP Address of the Host
            Dim Hostname As IPHostEntry = Dns.GetHostEntry(txtWS.Text)
            Dim ip As IPAddress() = Hostname.AddressList

            'Put IP inside txtIP
            txtIP.Text = ip(0).ToString
        Catch ex As Exception
            MsgBox("Unable to Ping Hostname or Workstation! Please try again, or try via IP Address." & vbCrLf & "Error: " & ex.Message, MsgBoxStyle.Critical)
            Exit Sub
        End Try
        'Get logged on user
        Dim MyObjSearcher As System.Management.ManagementObjectSearcher
            Dim MyColl As System.Management.ManagementObjectCollection
            Dim MyObj As System.Management.ManagementObject
            Dim MyMgtScope As System.Management.ManagementScope
            MyMgtScope = New System.Management.ManagementScope("\\" & txtWS.Text)
            'MyMgtScope = New System.Management.ManagementScope("\\" & txtWS.Text & "\root\cimv2")
            Try
                MyMgtScope.Connect()
            Catch ex As Exception
                Console.Text += "The RPC Server is unavailable" & Environment.NewLine
                Exit Sub
            End Try

        Try
            MyObjSearcher = New System.Management.ManagementObjectSearcher(MyMgtScope.Path.ToString,
                    "Select * FROM Win32_ComputerSystem")
            ' Execute the query
            MyColl = MyObjSearcher.Get

            ' Display logged on user if configuration option checked
            UsernameLabel = MyObj.GetPropertyValue("UserName") & vbCrLf & vbCrLf
            MyObjSearcher = Nothing
            MyColl = Nothing
        Catch ex As Exception
            ' An error occured getting data, display what we did get
            UsernameLabel.Text = "Unable to retreive information!" & vbCrLf & vbCrLf
            Console.Text += "Unable to get logged on user" & Environment.NewLine
        End Try

        'Kill PNC Application
        Dim Computername As String = txtWS.Text
        Dim colProcesses As ManagementObjectSearcher
        Dim colObserver As New ManagementOperationObserver
        Dim refProcess As ManagementObject
        Dim sProcess As String = "PNC"
        Dim options As ConnectionOptions
        options = New ConnectionOptions()
        options.Username = "User"
        options.Password = "Passwords"

        colProcesses = New ManagementObjectSearcher("Select * FROM Win32_Process WHERE Name =   PNC.exe")
        colProcesses.Scope = New ManagementScope("\\" & txtWS.Text & "\root\cimv2", options)
        Try
            colProcesses.Scope.Connect()

            If colProcesses.Get.Count = 0 Then

            Else
                Try
                    For Each refProcess In colProcesses.Get

                        refProcess.InvokeMethod(colObserver, "Terminate", Nothing)

                    Next
                Catch ex As Exception
                    Console.Text = Environment.NewLine & ex.Message
                End Try


            End If
        Catch ex As Exception
            Console.Text = ex.Message
        End Try

1 个答案:

答案 0 :(得分:1)

根据this MSDN example,您应该能够从ManagementObjectSearcher实例遍历Get方法的结果:

For Each objResult As ManagementObject in MyObjSearcher.Get()  
    Console.WriteLine("Antecedent: {0}", queryObj("Antecedent"))
    Console.WriteLine("Dependent: {0}", queryObj("Dependent"))
Next

来自this more complete example的VB.Net中的改编显示了如何使用Antecendent对象:

For Each objResult As ManagementObject in MyObjSearcher.Get() 

    Dim objAntecedent As New ManagementObject()
    Dim objObjectPath As New ManagementPath(CType(objResult("Antecedent"), String)) 

    objAntecedent.Path = objObjectPath;
    objAntecedent.Get();

    UsernameLabel.Text += objAntecedent["Domain"] & " " & objAntecedent["LocalAccount"] & " " & objAntecedent["Name"] & " | "

    'Other attributes that can be retrieved: Caption, Description, SID, SIDType, Status, and InstallDate.

Next