Accueil > Hyper-V, Virtualisation > Passage de paramètres XML CIM avec WinRM

Passage de paramètres XML CIM avec WinRM

23/04/2010 jmguilla Editer

This post is also available in: Anglais

L’information que je partage ici ne se trouve pas à l’heure actuelle dans le réseau ou forums MSDN. Cela m’a valu quelques conversations que vous pouvez relire sur le post MSDN dédié.

Le problème venait du fait qu’il n’est spécifié nulle part la façon dont doivent être écrites les instances XML CIM lors d’un appel de méthode via WinRM. WinRM est un outil très puissant, mais pour certains espaces de noms, il est impossible de créer des instances/objets à la main. A la place, nous devons avoir recours à des methodes utilitaires. C’est le cas par exemple pour l’ajout de paires Clé/Valeur à un Msvm_ComputerSystem ( ie. Machine Virtuelle pour les non initiés à l’implémentation CIM de Microsoft ). La spécification CIM prévoit la description d’objets sous forme XML et c’est bien ça qui nous pause problème… Il n’y a absolument aucun endroit dans toute la documentation MSDN et DMTF où il est spécifié la manière dont ces instances doivent être écrites. La spécification WS-MAN dit que l’entrée d’une méthode est un fragment XML. Le comportement normal de tout être humain ( moi compris ) serait de passer simplement le fragment XML représentant l’instance CIM à la méthode. Si vous pensez comme moi, vous avez certainement écrit quelque chose comme ça:

<p:AddKvpItems_INPUT xmlns:p="http://schemas.microsoft.com/wbem/wsman/1/wmi/root/virtualization/Msvm_VirtualSystemManagementService">
    <p:TargetSystem xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:w="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd" >
        <a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address>
        <a:ReferenceParameters>
            <w:ResourceURI>http://schemas.microsoft.com/wbem/wsman/1/wmi/root/virtualization/Msvm_ComputerSystem</w:ResourceURI>
            <w:SelectorSet>
                <w:Selector Name="CreationClassName">Msvm_ComputerSystem</w:Selector>
                <w:Selector Name="Name">3AA32387-6924-448C-835D-06E63A624C3E</w:Selector>
            </w:SelectorSet>
        </a:ReferenceParameters>
    </p:TargetSystem>
    <p:DataItems>
        <INSTANCE xmlns:p="http://schemas.microsoft.com/wbem/wsman/1/wmi/root/virtualization/Msvm_KvpExchangeDataItem" CLASSNAME="Msvm_KvpExchangeDataItem">
            <QUALIFIER NAME="dynamic" PROPAGATED="true" TYPE="boolean" TOSUBCLASS="false" TOINSTANCE="true">TRUE</QUALIFIER>
            <PROPERTY NAME="__PATH" CLASSORIGIN="___SYSTEM" TYPE="string"></PROPERTY>
            <PROPERTY NAME="__NAMESPACE" CLASSORIGIN="___SYSTEM" TYPE="string"></PROPERTY>
            <PROPERTY NAME="__SERVER" CLASSORIGIN="___SYSTEM" TYPE="string"></PROPERTY>
            <PROPERTY.ARRAY NAME="__DERIVATION" CLASSORIGIN="___SYSTEM"    TYPE="string">
                <VALUE.ARRAY>CIM_ManagedElement</VALUE.ARRAY>
            </PROPERTY.ARRAY>
            <PROPERTY NAME="__PROPERTY_COUNT" CLASSORIGIN="___SYSTEM" TYPE="sint32">6</PROPERTY>
            <PROPERTY NAME="__RELPATH" CLASSORIGIN="___SYSTEM" TYPE="string"></PROPERTY>
            <PROPERTY NAME="__DYNASTY" CLASSORIGIN="___SYSTEM" TYPE="string">CIM_ManagedElement</PROPERTY>
            <PROPERTY NAME="__SUPERCLASS" CLASSORIGIN="___SYSTEM" TYPE="string">CIM_ManagedElement</PROPERTY>
            <PROPERTY NAME="__CLASS" CLASSORIGIN="___SYSTEM" TYPE="string">Msvm_KvpExchangeDataItem</PROPERTY>
            <PROPERTY NAME="__GENUS" CLASSORIGIN="___SYSTEM" TYPE="sint32">2</PROPERTY>
            <PROPERTY NAME="Caption" CLASSORIGIN="CIM_ManagedElement" PROPAGATED="true" TYPE="string">
                <QUALIFIER NAME="CIMTYPE" PROPAGATED="true" TYPE="string" TOINSTANCE="true">string</QUALIFIER>
            </PROPERTY>
            <PROPERTY NAME="Data" CLASSORIGIN="Msvm_KvpExchangeDataItem" PROPAGATED="true" TYPE="string">
                <QUALIFIER NAME="CIMTYPE" PROPAGATED="true" TYPE="string" TOINSTANCE="true">myNewValue</QUALIFIER>
            </PROPERTY>
            <PROPERTY NAME="Description" CLASSORIGIN="CIM_ManagedElement" PROPAGATED="true" TYPE="string">
                <QUALIFIER NAME="CIMTYPE" PROPAGATED="true" TYPE="string" TOINSTANCE="true">string</QUALIFIER>
            </PROPERTY>
            <PROPERTY NAME="ElementName" CLASSORIGIN="CIM_ManagedElement" PROPAGATED="true" TYPE="string">
                <QUALIFIER NAME="CIMTYPE" PROPAGATED="true" TYPE="string" TOINSTANCE="true">string</QUALIFIER>
            </PROPERTY>
            <PROPERTY NAME="Name" CLASSORIGIN="Msvm_KvpExchangeDataItem" PROPAGATED="true" TYPE="string">
                <QUALIFIER NAME="CIMTYPE" PROPAGATED="true" TYPE="string" TOINSTANCE="true">myNewKey</QUALIFIER>
            </PROPERTY>
            <PROPERTY NAME="Source" CLASSORIGIN="Msvm_KvpExchangeDataItem" PROPAGATED="true" TYPE="uint16">
                <QUALIFIER NAME="CIMTYPE" PROPAGATED="true" TYPE="string" TOINSTANCE="true">0</QUALIFIER>
            </PROPERTY>
        </INSTANCE>
    </p:DataItems>
</p:AddKvpItems_INPUT>

Et vous vous êtes également fait insulter de la sorte:

WSManFault
    Message
        ProviderFault
            WSManFault
                Message = The WS-Management service cannot process the request because a date-time element or simple property contains child elements.
            ExtendedError
                __ExtendedStatus
                    Description = null
                    Operation = GetObject
                    ParameterInfo = Msvm_ComputerSystem.CreationClassName="Msvm_ComputerSystem",Name="3AA32387-6924-448C-835D-06E63A624C3E"
                    ProviderName = VmmsWmiInstanceAndMethodProvider
                    StatusCode = null
 
Numéro d'erreur :  -2144108479 0x80338041
Le code XML SOAP du message ne correspond pas à la définition du schéma XML. Modifiez le code XML et réessayez.

Pas réellement utile comme message d’érreur… Je vais faire cours, mais après énormément d’essais, j’ai trouvé le moyen permettant de faire marcher tout ça, il faut échapper les chevrons < and > et faire très attention aux caractères blancs… voici le contenu correct:

    <AddKvpItems_INPUT xmlns:p="http://schemas.microsoft.com/wbem/wsman/1/wmi/root/virtualization/Msvm_VirtualSystemManagementService">
      <p:TargetSystem
        xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:w="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd">
        <a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address>
        <a:ReferenceParameters>
          <w:ResourceURI>http://schemas.microsoft.com/wbem/wsman/1/wmi/root/virtualization/Msvm_ComputerSystem</w:ResourceURI>
          <w:SelectorSet>
            <w:Selector Name="CreationClassName">Msvm_ComputerSystem</w:Selector>
            <w:Selector Name="Name">0F6888A3-1054-48EF-B643-D364CB283830</w:Selector>
          </w:SelectorSet>
        </a:ReferenceParameters>
      </p:TargetSystem>
      <p:DataItems>&lt;INSTANCE CLASSNAME="Msvm_KvpExchangeDataItem"&gt;&lt;PROPERTY CLASSORIGIN="CIM_ManagedElement" NAME="Caption" PROPAGATED="true" TYPE="string"/&gt;&lt;PROPERTY CLASSORIGIN="Msvm_KvpExchangeDataItem" NAME="Data" PROPAGATED="true" TYPE="string"&gt;&lt;VALUE&gt;myNewValue&lt;/VALUE&gt;&lt;/PROPERTY&gt;&lt;PROPERTY CLASSORIGIN="CIM_ManagedElement" NAME="Description" PROPAGATED="true" TYPE="string"/&gt;&lt;PROPERTY CLASSORIGIN="CIM_ManagedElement" NAME="ElementName" PROPAGATED="true" TYPE="string"/&gt;&lt;PROPERTY CLASSORIGIN="Msvm_KvpExchangeDataItem" NAME="Name" TYPE="string"&gt;&lt;VALUE&gt;myNewKey&lt;/VALUE&gt;&lt;/PROPERTY&gt;&lt;PROPERTY CLASSORIGIN="Msvm_KvpExchangeDataItem" NAME="Source" TYPE="uint16"&gt;&lt;VALUE&gt;0&lt;/VALUE&gt;&lt;/PROPERTY&gt;&lt;/INSTANCE&gt;</p:DataItems>
    </AddKvpItems_INPUT>

Vous récupérez maintenant un Msvm_ConcreteJob pour monitorer l’exécution de la méthode.

Les commentaires sont fermés.