Използвам WinRM API в опит да събера някои CIM екземпляри от няколко хоста, работещи с Windows или Linux. Моят код работи добре, когато се свързвам с Windows хост, но се хвърля изключение, ако се опитам да се свържа с Linux машина, която изпълнява SFCB CIM сървъра. Мога да извлека CIM екземпляри от Linux хоста добре чрез WBEM, но не и чрез WS-MAN/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, String filter, String dialect, Int32 flags)
Мога успешно да пингвам машината, така че трябва да се вижда. Въпреки това, името на хоста е съпоставено само с неговия IP адрес в моя Windows hosts
файл. Ако се опитам да създам сесия на тази машина с PowerShell, също възниква грешка:
PS C:\Windows\system32> $session = new-cimsession myLinuxHost -credential user
new-cimsession : WinRM не може да обработи заявката. Възникна следната грешка при използване на Kerberos удостоверяване: Не може да се намери компютърът myLinuxHost. Проверете дали компютърът съществува в мрежата и че предоставеното име е изписано правилно.
- ако посоча пълния URL адрес на хоста (този, с който мога да извлека CIM екземпляри с помощта на WBEM), т.е.
remoteHost = "https://<ip>:5989"
илиremoteHost = "https://myLinuxHost:5989"
изброяването е неуспешно с:
Необработено изключение: System.Runtime.InteropServices.COMException: Възникна грешка в сигурността при WSManAutomation.IWSManSession.Enumerate(Object resourceUri, String filter, String dialect, Int32 flags)
подробности:
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()
какво правя грешно