使用C#远程连接到WMI到非域PC无法正常工作

时间:2017-11-06 13:44:18

标签: c# wmi remote-access credentials winrm

我使用Microsoft.Management.Infrastructure命名空间连接到远程计算机以获取WMI信息并且它可以正常工作。但是,当我尝试连接到非域PC时,它不起作用。任何人都可以查明我做错了什么。 这是代码:

string computer = "Computer_B";
string domain = "WORKGROUP"; 
string username = ".\\LocalAdminUserName";
string plaintextpassword; 

Console.WriteLine("Enter password:");
plaintextpassword = Console.ReadLine(); 

SecureString securepassword = new SecureString();
foreach (char c in plaintextpassword)
{
    securepassword.AppendChar(c);
} 

CimCredential Credentials = new 
CimCredential(PasswordAuthenticationMechanism.Default, domain, 
username,securepassword); 

WSManSessionOptions SessionOptions = new WSManSessionOptions();
SessionOptions.AddDestinationCredentials(Credentials); 

CimSession Session = CimSession.Create(computer, SessionOptions); 

var allVolumes = Session.QueryInstances(@"root\cimv2", "WQL", "SELECT * FROM Win32_LogicalDisk"); 

 // Loop through all volumes
 foreach (CimInstance oneVolume in allVolumes)
 {
       Console.Writeline(oneVolume.CimInstanceProperties["SystemName"].Value.ToString());
 } 

我不确定该如何使用本地计算机的域和用户名的参数。我已经完成/尝试了以下内容:

  • 在远程本地计算机上运行winrm quickconfig

  • 使用PasswordAuthenticationMechanism.Negotiate导致我只读过Kerberos 适用于域用户和密码

  • 使用winrm config将我运行代码的计算机添加到本地计算机上的TrustedHosts。还尝试将*添加到TrustedHosts

  • 用于username =“computer_B \ LocalAdminUserName”。我也尝试过使用domain =“”

有什么建议我做错了吗?

我一直得到的错误是:WinRM无法处理请求。使用协商身份验证时出现以下错误,错误代码为0x8009030e:指定的登录会话不存在。它可能已经被终止  如果提供的凭据在目标服务器上无效,或者无法验证服务器标识,则可能会发生这种情况。如果您信任服务器标识,请将服务器名称添加到TrustedHosts列表,然后重试该请求。使用winrm.cmd查看或编辑TrustedHosts列表。请注意,TrustedHosts列表中的计算机可能未经过身份验证。有关如何编辑TrustedHosts列表的更多信息,请运行以下命令:winrm help config。

1 个答案:

答案 0 :(得分:1)

尝试下面的代码,这是在模仿逻辑。

ConnectionOptions cOption = new ConnectionOptions();
                ManagementScope scope = null;
                Boolean isLocalConnection = isLocalhost(machine);

                if (isLocalConnection)
                {
                    scope = new ManagementScope(nameSpaceRoot + "\\" + managementScope, cOption);
                }
                else
                {
                    scope = new ManagementScope("\\\\" + machine + "\\" + nameSpaceRoot + "\\" + managementScope, cOption);
                }

                if (!String.IsNullOrEmpty(ACTIVE_DIRECTORY_USERNAME) && !String.IsNullOrEmpty(ACTIVE_DIRECTORY_PASSWORD) && !isLocalConnection)
                {
                    scope.Options.Username = ACTIVE_DIRECTORY_USERNAME;
                    scope.Options.Password = ACTIVE_DIRECTORY_PASSWORD;
                }
                scope.Options.EnablePrivileges = true;
                scope.Options.Authentication = AuthenticationLevel.PacketPrivacy;
                scope.Options.Impersonation = ImpersonationLevel.Impersonate;
                scope.Connect();