繁体   English   中英

远程WMI连接

[英]Remote WMI connection

我想在本地网络上使用ManagementScope从另一台PC连接到运行Windows 7的远程PC。 在远程PC上,我创建了一个没有密码的新用户帐户“Samuel”并设置为管理员。

ConnectionOptions options = new ConnectionOptions();
options.Username = "Samuel";
options.Password = "";

ManagementScope scope = new ManagementScope("\\\\192.168.0.2\\root\\cimv2", options);          
scope.Connect();

我得到的错误:

访问被拒绝。 (HRESULT异常:0x80070005(E_ACCESSDENIED))

更新:
设置密码后,我收到新的错误:

RPC服务器不可用。 (HRESULT异常:0x800706BA)

也许它是缺少的'EnablePrivileges':

scope.Options.EnablePrivileges = true;

从MSDN( ConnectionOptions.EnablePrivileges属性 ):

获取或设置一个值,该值指示是否需要为连接操作启用用户权限。 仅当执行的操作需要启用某个用户权限(例如,计算机重新启动)时,才应使用此属性。

编辑:如果它不起作用,请尝试将ImpersonationLevel设置为'Impersonate':

scope.Options.Impersonation = System.Management.ImpersonationLevel.Impersonate;

ImpersonationLevel Impersonate:模拟级别的COM模拟级别,允许对象使用调用方的凭据。 这是WMI调用的推荐模拟级别。

  • 根据TechNet上的WMI FAQ ,0x80070005错误表示DCOM问题:

    0x80070005(DCOM ACCESS_DENIED)
    当无法识别连接用户或远程服务器以某种方式限制连接用户时(例如,用户可能被锁定),会发生此错误。 当帐户位于不同的域中时,这种情况最常发生。 最近对WMI安全性的更改也可能导致发生此错误:

    • Windows XP和Windows Server 2003中不允许使用以前允许的空白密码。

    • WMI不允许对Windows 98客户端进行异步回调。 从Windows 98计算机到Windows XP计算机的类似SWbemServices.ExecNotificationQueryAsync的调用将导致返回到Windows 98计算机的“拒绝访问”错误。

    • DCOM配置访问设置可能已更改。

    • 如果目标计算机正在运行Windows XP,则可能会将注册表项HKEY_LOCAL_MACHINE \\ SYSTEM \\ CurrentControlSet \\ Control \\ Lsa下的Forceguest值设置为强制关闭Guest帐户(值为零)。

    (虽然提到了Windows XP,但它也可能适用于Windows 7。)

  • 其中的0x800706BA错误表示防火墙问题:

    0x800706xx(DCOM RPC错误)
    在远程计算机上配置防火墙时,通常会发生这种情况。 您需要在防火墙上打开相应的端口以允许使用DCOM进行远程管理。

    尝试在远程计算机上的Windows防火墙中启用远程管理例外,看看它是否有帮助。 要从命令行执行此操作,请在提升的命令提示符中运行以下命令:

     netsh advfirewall firewall set rule group="remote admin" new enable=yes 


    您还可以在MSDN上的“ 连接到WMI远程启动Windows Vista”文章中找到远程WMI访问所需的DCOM,UAC,Windows防火墙和其他设置。

  • 此外,由于萨穆埃尔是一个非域帐户,您需要为描述此帐户授予DCOM 远程访问远程启动远程激活权限,在远程计算机上这里

你得到“访问被拒绝”。 因为您无法仅使用用户名查询范围连接。 您有2个选项:用户名和密码为null或输入用户名和密码。

你得到“RPC服务器不可用”。 因为防火墙不允许您查询该计算机。 您有2个选项:禁用防火墙或向其添加远程管理例外。

您可以在cmd:旧版Windows中添加这样的防火墙例外:

netsh firewall set service type = remoteadmin mode = enable

较新的Windows版本:

netsh advfirewall防火墙设置规则组=“Windows远程管理”新的启用=是

如果您尝试使用域用户登录,请将用户名更改为domainName\\username或设置连接属性connection.Authority = "ntlmdomain:domainName"

您确定可以在没有密码的情况下与远程WMI连接吗?

这样的帐户有很多东西不能做(例如共享文件,远程桌面)。 尝试设置密码,看看是否有所作为。

您可能需要检查远程Windows 7 PC上的WMI安全设置。 右键单击计算机>管理>服务和应用程序> WMI控制>安全选项卡,并确保您使用的用户帐户具有necc权限。

不确定是否因为WMI引擎未在远程计算机上侦听,或者您有其他登录/连接问题而被拒绝。

这是我用来连接到远程机器的代码,它运行得很好。 也许它会帮助你:

ConnectionOptions oConn = new ConnectionOptions();
ManagementScope oScope = null;

oConn.Username = txtLogin;
oConn.Password = txtPassword;
oConn.Authority = "ntlmdomain:" + txtDomain;

oScope = new ManagementScope("\\\\" + txtHostName + "\\root\\CIMV2", oConn);

oScope.Connect();

如果我的域/登录/密码三重奏被接受,那么Connect()将起作用。 否则,Connect()会抛出异常。 只要指定的凭据具有该计算机的权限,您就应该关闭并运行。

解决方案使用“net view \\\\ servername

我知道使用控制台命令并在输出上做一些字符串体操是不太可取的,但另一方面它确实有效,至少对我来说,不得不乱用DCOM默认值设置以使WMI方式起作用(至少在Win7s上)。

已经在Win7和XP客户端以及MS和Linux服务器上进行了测试。

Function GetShares(ServerName As String) As List(Of String)
    Try
        Dim P As New Process
        Dim Read As Boolean = False
        Dim Str As String
        Dim Shares As New List(Of String)

        With P.StartInfo
            .FileName = "net"
            .Arguments = "view " & ServerName
            .RedirectStandardOutput = True
            .RedirectStandardError = True
            .CreateNoWindow = True
            .UseShellExecute = False
        End With
        P.Start()
        P.WaitForExit()

        If P.ExitCode <> 0 Then
            MsgBox(P.StandardError.ReadToEnd, MsgBoxStyle.OkOnly, "Error")
        Else
            Do Until P.StandardOutput.EndOfStream = True
                If Read = True Then
                    Str = P.StandardOutput.ReadLine
                    If Str = "The command completed successfully." Then Exit Do
                    Str = Strings.RTrim(Str) 'Removes any trailing spaces
                    Str = Strings.Mid(Str, 1, Strings.InStrRev(Str, " ")) 'remove Type
                    Str = Strings.RTrim(Str) ''Removes any trailing spaces
                    Shares.Add(Str)
                Else
                    If Strings.Left(P.StandardOutput.ReadLine, 10) = "----------" Then Read = True
                End If
            Loop
        End If
        Return Shares
    Catch ex As Exception
        MsgBox("Error in """ & System.Reflection.MethodInfo.GetCurrentMethod.Name & """: " & vbCr & ex.Message, MsgBoxStyle.OkOnly, "Runtime error")
        Debug.Print("--------------------------" & vbCr & "Error: " & ex.Message & vbCr & ex.StackTrace)
        Return Nothing
    End Try
End Function

尝试在用户名之前添加域名或计算机名称(例如@“mshome \\ Samuel”)。

我也有这个问题。我正在尝试编写C#代码以从远程PC获取WMI信息和文件。 并遇到两个Access Denied错误:

总而言之,我不得不对远程PC进行更改。 见下文:

  1. 0x80070005:访问被拒绝: https //social.msdn.microsoft.com/Forums/vstudio/en-US/6229334e-d5ef-4016-9e7e-1c8718be8d43/access-is-denied-exception-from-hresult-0x80070005- eaccessdenied功能于vbnet?论坛= netfxbcl

  2. System.Management:拒绝访问:“使用System.Management和WMI”部分https//support.microsoft.com/en-us/help/317012/process-and-request-identity-in-asp.net

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM