Я использую WinRM API в попытке собрать некоторые экземпляры CIM с нескольких хостов, работающих под управлением Windows или Linux. Мой код отлично работает при подключении к хосту Windows, но возникает исключение, если я пытаюсь подключиться к машине Linux, на которой работает сервер CIM SFCB. Я могу получить экземпляры CIM с хоста Linux просто отлично через WBEM, но не через WS-MAN/WinRM.Как получить экземпляры CIM с хоста Linux с помощью WinRM?
Вот пример кода, который получает CIM_OperatingSystem
от хоста Windows - это работает отлично:
WSMan wsman = new WSMan();
IWSManConnectionOptions options = (IWSManConnectionOptions)wsman.CreateConnectionOptions();
try
{
string remoteHost = "WindowsHost1";
options.UserName = @"domain\User";
options.Password = "somePwd";
IWSManSession session = (IWSManSession)wsman.CreateSession(remoteHost, wsman.SessionFlagCredUsernamePassword(), options);
try
{
IWSManEnumerator cimInstances = session.Enumerate("http://schemas.microsoft.com/wbem/wsman/1/wmi/root/cimv2/CIM_OperatingSystem");
// Enumerate returned CIM instances.
while (!cimInstances.AtEndOfStream)
{
string item = cimInstances.ReadItem();
XDocument doc = XDocument.Parse(item);
var resultSet = from e in doc.Elements() select e;
foreach (var element in resultSet)
{
Console.WriteLine(element);
}
}
}
finally
{
Marshal.ReleaseComObject(session);
}
}
finally
{
Marshal.ReleaseComObject(options);
}
Если remoteHost
указывает на машине Linux (OpenSUSE VM в моем примере), вот что происходит:
- если указать имя хоста только, т.е.
remoteHost = "myLinuxHost"
,session.Enumerate()
терпит неудачу:
Необработанное исключение: System.IO.FileNotFoundException: сетевой путь не найден. в WSManAutomation.IWSManSession.Enumerate (Object ResourceURI, Струнный фильтр, Струнный диалекте, Int32 флаги)
Я могу пинговать машину успешно, поэтому она должна быть видна. Однако имя хоста отображается только на его IP-адрес в моем файле Windows hosts
. Если я пытаюсь создать сеанс к этой машине с помощью PowerShell, то возникает ошибка, а также:
PS C:\Windows\system32> $session = new-cimsession myLinuxHost -credential user
нового cimsession: WinRM не может обработать запрос. При использовании проверки подлинности Kerberos произошла ошибка : Не удалось найти компьютер myLinuxHost . Убедитесь, что компьютер существует в сети и что указанное имя написано правильно.
- если указать полный URL-адрес хоста (тот, который я могу получить экземпляры CIM с помощью Wbem), т.е.
remoteHost = "https://<ip>:5989"
илиremoteHost = "https://myLinuxHost:5989"
перечисление терпит неудачу с:
необработанное исключение: System.Runtime .InteropServices.COMException: ошибка безопасности произошла в WSManAutomation.IWSManSession.Enumber (объект resourceUri, String фильтр, строковый диалект, флаги Int32)
Детали:
System.Runtime.InteropServices.COMException was unhandled
HResult=-2147012721
Message=A security error occurred
Source=Session
ErrorCode=-2147012721
StackTrace:
at WSManAutomation.IWSManSession.Enumerate(Object resourceUri, String filter, String dialect, Int32 flags)
at WSManTest.Program.Main(String[] args)
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
Что я делаю неправильно?