我一直在创建一个带有按钮的应用程序来远程停止并重新启动进程然后重新启动服务。 在执行这些任务之前,它将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
答案 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