Windows または Linux を実行している複数のホストからいくつかの CIM インスタンスを収集しようとして、WinRM API を使用しています。私のコードは、Windows ホストに接続すると正常に動作しますが、SFCB CIM サーバーを実行している Linux マシンに接続しようとすると、例外がスローされます。Linux ホストから WBEM 経由で CIM インスタンスを取得できますが、WS-MAN/WinRM 経由では取得できません。
Windows ホストから取得するサンプル コードを次に示しますCIM_OperatingSystem
。これは正常に動作します。
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 (オブジェクト resourceUri、文字列フィルター、文字列方言、Int32 フラグ) で
マシンに正常に ping できるので、表示されるはずです。ただし、ホスト名は Windowshosts
ファイルの IP にのみマップされます。PowerShell を使用してこのマシンへのセッションを作成しようとすると、次のエラーも発生します。
PS C:\Windows\system32> $session = new-cimsession myLinuxHost -credential user
new-cimsession : WinRM は要求を処理できません。Kerberos 認証の使用中に次のエラーが発生しました: コンピューター myLinuxHost が見つかりません。コンピュータがネットワーク上に存在し、指定された名前のつづりが正しいことを確認してください。
- 完全なホスト URL (WBEM を使用して CIM インスタンスを取得できるもの) を指定した場合、つまり
remoteHost = "https://<ip>:5989"
列挙remoteHost = "https://myLinuxHost:5989"
が次のように失敗した場合:
未処理の例外: System.Runtime.InteropServices.COMException: WSManAutomation.IWSManSession.Enumerate でセキュリティ エラーが発生しました (オブジェクト resourceUri、文字列フィルター、文字列方言、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()
私は何を間違っていますか?