0

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);
}   

remoteHostLinux マシン (私の例では 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()

私は何を間違っていますか?

4

1 に答える 1

1

HTTPS CIMSession を使用して非 WSMAN マシンへの Powershell セッションを確立する方法に関するいくつかのマニュアルを読んだ後CIMSessionOption、実際の接続が WBEM インターフェイス経由で行われるように、SSL を使用するように構築できるタイプのパラメーターがあることがわかりました。 HTTPS 経由。ドキュメントはこちら、コードは次のとおりです。

$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 経由で接続するには、非 WSMAN メソッドを使用して CIMSessionOption と CIMSession を作成する Powershell コードを変換する必要があります。Powershell では、適切な資格情報が提供されていれば、Linux マシンに接続できます。このResourceUriパラメーターは、取得するオブジェクトを指定します。適切な URI は、ターゲット システムのマニュアルから取得する必要があります。

于 2015-05-22T12:04:46.600 に答える