我使用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。
答案 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();