2010-07-20 40 views
9

Tôi muốn kết nối với PC từ xa đang chạy Windows 7, từ một PC khác bằng cách sử dụng ManagementScope trên mạng cục bộ. Trên máy tính từ xa, tôi đã tạo một tài khoản người dùng mới "Samuel" không có mật khẩu và được đặt làm quản trị viên.Kết nối WMI từ xa

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

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

Các Lỗi tôi nhận được:

Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

Cập nhật:
Sau khi thiết lập mật khẩu cho việc sử dụng, tôi nhận được lỗi mới:

+0

Nếu bạn tham gia Dịch vụ là hoạt động của WMI? và nếu như vậy nếu bạn chạy mã trên trên máy tính Windows 7 mục tiêu, bạn có thể kết nối với WMI không? – etoisarobot

+0

Dịch vụ WMI đang chạy ở đó. Và về việc chạy mã này trên mục tiêu, bạn có nghĩa là chạy mã cục bộ? nếu có, tôi không thể thực thi mã trên máy đó.(không có VS hoặc khung công tác) – shlomjmi

+0

Có * Samuel * tên miền hoặc tài khoản cục bộ không? – Helen

Trả lời

1

Bạn có chắc chắn bạn có thể làm WMI kết nối từ xa với tài khoản không có mật khẩu?

Có một số tài khoản như vậy không thể thực hiện (ví dụ: chia sẻ tệp, máy tính từ xa). Hãy thử thiết lập một mật khẩu và xem nếu đó là một sự khác biệt.

+0

Thiết lập AFter mật khẩu tôi nhận được lỗi này ": Máy chủ RPC không khả dụng. (Ngoại lệ từ HRESULT: 0x800706BA) – shlomjmi

8

Có lẽ đó là mất tích 'EnablePrivileges':

scope.Options.EnablePrivileges = true; 

Từ MSDN (ConnectionOptions.EnablePrivileges Property):

Gets or sets a value indicating whether user privileges need to be enabled for the connection operation. This property should only be used when the operation performed requires a certain user privilege to be enabled (for example, a machine restart).

Edit: Nếu nó không hoạt động, hãy thử đặt ImpersonationLevel để 'Mạo danh' :

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

ImpersonationLevel Impersonate: Impersonate-level COM impersonation level that allows objects to use the credentials of the caller. This is the recommended impersonation level for WMI calls.

+1

Cố gắng hiểu những gì" yêu cầu một đặc quyền người dùng được kích hoạt "có nghĩa là. –

+0

thay đổi 'Authority' thành tên miền của tôi thay vì" DOMAIN "đã làm việc cho tôi – Maslow

6
  • Theo WMI FAQ trên TechNet, lỗi 0x80070005 chỉ ra một vấn đề DCOM:

    0x80070005 (DCOM ACCESS_DENIED)
    This error occurs when the connected user is not recognized or is restricted in some fashion by the remote server (for example, the user might be locked out). This happens most often when accounts are in different domains. Recent changes to WMI security can also cause this error to occur:

    • Blank passwords, formerly permitted, are not allowed in Windows XP and Windows Server 2003.

    • WMI does not allow asynchronous callbacks to a Windows 98 client. A call like SWbemServices.ExecNotificationQueryAsync from a Windows 98 computer to a Windows XP computer will result in an Access Denied error returned to the Windows 98 machine.

    • The DCOM configuration access setting might have been changed.

    • If the target computer is running Windows XP, the Forceguest value under the registry key HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa might be set to force the Guest account off (value is zero).

    (. Mặc dù Windows XP được đề cập, điều này có thể được áp dụng cho Windows 7 cũng)

  • Các 0x800706BA lỗi, trong rurn của nó, chỉ ra một vấn đề tường lửa:

    0x800706xx (DCOM RPC error)
    This often occurs when a firewall is configured on the remote computer. You will need to open the appropriate ports on the firewall to permit remote administration using DCOM.

    Thử bật Quản trị từ xa ngoại lệ trong Tường lửa của Windows trên máy tính từ xa và xem có giúp ích gì không. Để làm điều này từ dòng lệnh, hãy chạy lệnh sau tại dấu nhắc lệnh nâng lên:

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


    Bạn cũng có thể tìm ra DCOM, UAC, Windows Firewall và các thiết lập khác theo yêu cầu để truy cập WMI từ xa trong bài viết Connecting to WMI Remotely Starting with Windows Vista trên MSDN.

  • Ngoài ra, vì Samuel là một tài khoản nondomain, bạn cần phải cấp cho tài khoản này DCOM Remote Access, từ xa Launchkích hoạt từ xa quyền truy cập vào máy tính từ xa như mô tả here.

+0

như tôi đã nhận xét câu trả lời trước: Sau khi đặt mật khẩu tôi nhận được lỗi này ": Máy chủ RPC không khả dụng. (Ngoại lệ từ HRESULT: 0x800706BA) – shlomjmi

+0

@shlomjmi: Thử bật tính năng * Quản trị từ xa * ngoại lệ trong Windows Firewall trên máy tính từ xa và xem nó có giúp ích không. (Xem câu trả lời cập nhật.) – Helen

0

Cố gắng thêm tên miền hoặc tên máy tính trước tên người dùng (ví dụ: @ "mshome \ Samuel").

+0

nhìn vào câu trả lời của jerry và bình luận bên dưới nó – prabhakaran

+0

@prabhakaran: đó là câu hỏi khá cũ nhưng tôi nhớ tôi đã giải quyết được vấn đề tương tự đơn giản bằng cách thêm tên miền trước tên người dùng nhưng đó là trường hợp cụ thể của tôi – SKINDER

1

Bạn có thể muốn kiểm tra cài đặt bảo mật WMI trên máy tính Windows 7 từ xa. Nhấp chuột phải Máy tính> Quản lý> Dịch vụ và ứng dụng> Điều khiển WMI> Tab bảo mật và đảm bảo tài khoản người dùng bạn đang sử dụng có quyền truy cập necc.

+0

Tôi don Không có tùy chọn như vậy ở đó ... – shlomjmi

5

Bạn nhận được "Quyền truy cập bị từ chối". vì bạn không thể truy vấn kết nối phạm vi chỉ với tên người dùng. Bạn có 2 lựa chọn: null cho tên người dùng và mật khẩu hoặc nhập tên người dùng và mật khẩu.

Bạn nhận được "Máy chủ RPC không khả dụng". vì tường lửa không cho phép bạn truy vấn máy đó. Bạn có 2 tùy chọn: vô hiệu hóa tường lửa hoặc thêm ngoại lệ quản trị từ xa vào nó.

Bạn có thể thêm ngoại lệ tường lửa như thế này trong cmd: Cũ hơn cửa sổ phiên bản:

netsh firewall set service type = remoteadmin mode = enable

Mới hơn cửa sổ phiên bản:

netsh advfirewall firewall set rule group="Windows Remote Management" new enable=yes

Nếu bạn cố gắng đăng nhập với người sử dụng tên miền, thay đổi tên người dùng để domainName\username hoặc đặt thuộc tính kết nối connection.Authority = "ntlmdomain:domainName".

1

Không chắc chắn nếu nó bị từ chối vì động cơ WMI không nghe trên máy từ xa hoặc nếu bạn có vấn đề về đăng nhập/kết nối khác.

Đây là mã tôi đã sử dụng để kết nối với máy từ xa của mình và nó đang hoạt động hoàn hảo. Có lẽ nó sẽ giúp bạn:

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(); 

Nếu tên miền/đăng nhập/mật khẩu ba của tôi được chấp nhận, sau đó Connect() sẽ làm việc. Nếu không, Connect() ném một ngoại lệ. Miễn là thông tin đăng nhập được chỉ định có quyền trên máy đó, bạn nên tắt và chạy.

+3

Tôi có hai vấn đề: 1) Tôi đã sao chép ví dụ từ Microsoft và có "ntlmdomain: DOMAIN", tôi đã không nhận ra rằng mình phải đặt tên miền của mình ở đó (duh). 2) Tôi đã đặt tên miền của mình vào người dùng, điều này không hề mang lại lợi ích. Tôi đặt user = "mydomain \ myuser", nhưng chỉ nên là user = "myuser". – NealWalters

0

Giải pháp sử dụng "net view \\ servername"

Tôi biết nó không phải rất mong muốn sử dụng một lệnh giao diện điều khiển và làm một số công việc chuỗi-thể dục trên đầu ra, nhưng mặt khác nó và nó không phải là rất mong muốn hoặc là, ít nhất là đối với tôi, phải làm lộn xộn xung quanh với các thiết lập mặc định DCOM để có được cách WMI để làm việc (ít nhất là trên Win7s).

Đã được thử nghiệm trên máy khách Win7 và XP và máy chủ MS và 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 
0

Tôi cũng gặp sự cố này.Tôi đang cố gắng viết mã C# để lấy thông tin và tệp WMI từ máy tính từ xa. Và chạy vào hai số điện thoại Access Denied:

Để giữ một câu chuyện dài, tôi phải thay đổi máy tính từ xa. Xem bên dưới:

  1. 0x80070005: Access is Denied: https://social.msdn.microsoft.com/Forums/vstudio/en-US/6229334e-d5ef-4016-9e7e-1c8718be8d43/access-is-denied-exception-from-hresult-0x80070005-eaccessdenied-in-vbnet?forum=netfxbcl

  2. System.Management: Access Denied: Section "Using System.Management and WMI": https://support.microsoft.com/en-us/help/317012/process-and-request-identity-in-asp.net

Các vấn đề liên quan