2015-04-15 11 views
0

Я использую 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() 

Что я делаю неправильно?

ответ

0

После прочтения некоторых инструкций о том, как установить сеанс Powershell на машине, отличной от WSMAN, с помощью HTTPS CIMSessions, я обнаружил, что существует параметр типа CIMSessionOption, который может быть построен для использования SSL, так что фактическое соединение осуществляется через интерфейс WBEM через HTTPS.Документ here, коды являются следующие:

$UserName="root" 
$Password="calvin" # default password 
$DracIP="10.10.0.120" # supply your box's IP 
$SecurePass = ConvertTo-SecureString $Password -AsPlainText -Force 
$DracCred = new-object -typename System.Management.Automation.PSCredential -argumentlist $UserName,$SecurePass 
# this just makes a PSCredential object to be used as a reference 
$cimop=New-CimSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck -Encoding Utf8 -UseSsl 
# this instruction creates a SSL-enabled option set with ignore certificate checks (Dells have self-signed certs on their side) 
$Dracsession=New-CimSession -Authentication Basic -Credential $DracCred -ComputerName $DracIP -Port 443 -SessionOption $cimop -OperationTimeoutSec 10000000 
Get-CimInstance -CimSession $Dracsession -ResourceUri "http://schemas.dmtf.org/wbem/wscim/1/cim-schema/2/root/dcim/DCIM_SystemView" 

Итак, для того, чтобы сделать вашу C программу # для подключения через WBEM, вы должны перевести Powershell код, который создает CIMSessionOption и CIMSession с использованием метода без WSMAN. В Powershell это должно позволить вам подключиться к машине Linux, если предоставлены соответствующие учетные данные. Параметр ResourceUri указывает, какой объект вы хотите получить, и соответствующий URI следует брать из руководств целевой системы.