2013-05-04 98 views
1

我正在运行下面的代码备用凭据时(“访问被拒绝(异常来自HRESULT访问被拒绝:0X80070005(E_ACCESSDENIED))WMI查询 - 访问被拒绝

如果我运行的整体。程序在标准的凭据下,然后传递一个管理员用户名&密码到WMI连接选项,然后我得到访问被拒绝。如果然后我右键点击该程序并选择“RunAs”并输入一个管理员用户名&密码到WMI选项),那么它的工作原理!我从中得知该帐户具有所需的权限,并且所有必需的端口都是开放的,所以我不相信这是DCOM问题。

我也尝试过wbemtest程序,只需输入用户名和密码即可连接到远程PC。我总是可以连接,无论我选择哪个模拟&身份验证级别。在程序中,我通过为这些选项设置各种参数进行了实验(请参阅注释行),并尝试了.EnablePrivileges选项,但这些选项的组合不会使程序正常工作。我在这里错过了什么?

Sub Main() 
    Dim myConnectionOptions As New System.Management.ConnectionOptions 
    With myConnectionOptions 
     '.EnablePrivileges = True 
     '.Impersonation = System.Management.ImpersonationLevel.Impersonate 
     '.Authentication = System.Management.AuthenticationLevel.PacketPrivacy 
     If TextBoxUserName.Text <> "" Then 
      .Username = TextBoxUserName.Text 
      .Password = TextBoxPassword.Text 
     End If 
    End With 
    'Establish connection 
    Try 
     Dim myManagementScope As System.Management.ManagementScope 
     myManagementScope = New System.Management.ManagementScope(_ 
      "\\" & TextBoxComputerName.Text & "\root\cimv2", myConnectionOptions) 
     'Connect to WMI namespace 
     myManagementScope.Connect() 
     Dim myObjectSearcher As New ManagementObjectSearcher(_ 
      myManagementScope.Path.ToString, "Select * From Win32_ComputerSystem") 
     Dim myCollection As ManagementObjectCollection 
     Dim myObject As ManagementObject 
     'Execute query 
     myCollection = myObjectSearcher.Get() 
     For Each myObject In myCollection 
      If myObject.GetPropertyValue("UserName") Is Nothing Then 
       MsgBox("Ctrl-Alt-Del") 
      Else 
       MsgBox(myObject.GetPropertyValue("UserName").ToString) 
      End If 
     Next 
    Catch e As Exception 
     MsgBox("_Connection Error" & e.Message) 
    End Try 
End Sub 
+0

嗨!删除你的评论ConnectOptions,这真的是必需的;此外,为连接指定“.Authority =”NTLMDOMAIN:“+ computerName”。 [你是否尝试过“dom \ user”格式??]。 – mabra 2013-05-05 21:20:34

回答

0

我将承担WMI配置是在你的代码远程PC

正确的,你需要通过“myManagementScope”为对象,并创建查询对象,并把它传递既反对搜索。

下面的代码在你的代码没有凭据传递到OjectSearcher,下面的代码

Dim myObjectSearcher As New ManagementObjectSearcher(_ 
     myManagementScope.Path.ToString, "Select * From Win32_ComputerSystem") 

改变

Dim x ObjectQuery 
    x = New ObjectQuery("Select * From Win32_ComputerSystem") 

    Dim myObjectSearcher As New ManagementObjectSearcher(_ 
     myManagementScope, x)