NodeCache CSP
The NodeCache configuration service provider is used to manage the client cache. This configuration service provider is to be used only by enterprise management servers. It provides a level of abstraction that decouples the management of the node list from a specific backing store. It synchronizes the client cache with the server side cache. It also provides an API for monitoring device-side cache changes.
NodeCache supports the comparison of hash values instead of actual node values:
<Type xmlns="syncml:metinf">
application/x-nodemon-sha256
</type>
NodeCache will hash the values and compare with a hash value that was sent down by the server. This process supports checking a parent node and its children recursively.
The following list shows the NodeCache configuration service provider nodes:
- ./Device/Vendor/MSFT/NodeCache
- ./User/Vendor/MSFT/NodeCache
Device/{ProviderID}
Scope | Editions | Applicable OS |
---|---|---|
✅ Device ✅ User |
✅ Pro ✅ Enterprise ✅ Education ✅ Windows SE ✅ IoT Enterprise / IoT Enterprise LTSC |
✅ Windows 10, version 1511 [10.0.10586] and later |
./Device/Vendor/MSFT/NodeCache/{ProviderID}
Group settings per DM server. Each group of settings is distinguished by the server's Provider ID. It should be the same DM server PROVIDER-ID value that was supplied through the w7 APPLICATION configuration service provider XML during the enrollment process. In Windows Phone 8, only one enterprise management server is supported. That is, there should be only one ProviderID node under NodeCache.
Description framework properties:
Property name | Property value |
---|---|
Format | node |
Access Type | Add, Delete, Get |
Dynamic Node Naming | UniqueName: It should be the same DM server PROVIDER-ID value that was supplied through the w7 APPLICATION configuration service provider XML during the enrollment process. |
Device/{ProviderID}/CacheVersion
Scope | Editions | Applicable OS |
---|---|---|
✅ Device ✅ User |
✅ Pro ✅ Enterprise ✅ Education ✅ Windows SE ✅ IoT Enterprise / IoT Enterprise LTSC |
✅ Windows 10, version 1511 [10.0.10586] and later |
./Device/Vendor/MSFT/NodeCache/{ProviderID}/CacheVersion
Character string representing the cache version set by the server.
Description framework properties:
Property name | Property value |
---|---|
Format | chr (string) |
Access Type | Add, Get, Replace |
Device/{ProviderID}/ChangedNodes
Scope | Editions | Applicable OS |
---|---|---|
✅ Device ✅ User |
✅ Pro ✅ Enterprise ✅ Education ✅ Windows SE ✅ IoT Enterprise / IoT Enterprise LTSC |
✅ Windows 10, version 1511 [10.0.10586] and later |
./Device/Vendor/MSFT/NodeCache/{ProviderID}/ChangedNodes
List of nodes whose values don't match their expected values as specified in /NodeID/ExpectedValue.
Description framework properties:
Property name | Property value |
---|---|
Format | chr (string) |
Access Type | Get |
Device/{ProviderID}/ChangedNodesData
Scope | Editions | Applicable OS |
---|---|---|
✅ Device ✅ User |
✅ Pro ✅ Enterprise ✅ Education ✅ Windows SE ✅ IoT Enterprise / IoT Enterprise LTSC |
✅ Windows 10, version 1703 [10.0.15063] and later |
./Device/Vendor/MSFT/NodeCache/{ProviderID}/ChangedNodesData
XML containing nodes whose values don't match their expected values as specified in /NodeID/ExpectedValue.
Description framework properties:
Property name | Property value |
---|---|
Format | xml |
Access Type | Get |
Device/{ProviderID}/Nodes
Scope | Editions | Applicable OS |
---|---|---|
✅ Device ✅ User |
✅ Pro ✅ Enterprise ✅ Education ✅ Windows SE ✅ IoT Enterprise / IoT Enterprise LTSC |
✅ Windows 10, version 1511 [10.0.10586] and later |
./Device/Vendor/MSFT/NodeCache/{ProviderID}/Nodes
Root node for cached nodes.
Description framework properties:
Property name | Property value |
---|---|
Format | node |
Access Type | Get |
Device/{ProviderID}/Nodes/{NodeID}
Scope | Editions | Applicable OS |
---|---|---|
✅ Device ✅ User |
✅ Pro ✅ Enterprise ✅ Education ✅ Windows SE ✅ IoT Enterprise / IoT Enterprise LTSC |
✅ Windows 10, version 1511 [10.0.10586] and later |
./Device/Vendor/MSFT/NodeCache/{ProviderID}/Nodes/{NodeID}
Information about each cached node is stored under NodeID as specified by the server. This value mustn't contain a comma.
Description framework properties:
Property name | Property value |
---|---|
Format | node |
Access Type | Add, Delete, Get |
Dynamic Node Naming | ServerGeneratedUniqueIdentifier |
Device/{ProviderID}/Nodes/{NodeID}/AutoSetExpectedValue
Scope | Editions | Applicable OS |
---|---|---|
✅ Device ✅ User |
✅ Pro ✅ Enterprise ✅ Education ✅ Windows SE ✅ IoT Enterprise / IoT Enterprise LTSC |
✅ Windows 10, version 1703 [10.0.15063] and later |
./Device/Vendor/MSFT/NodeCache/{ProviderID}/Nodes/{NodeID}/AutoSetExpectedValue
This will automatically set the value on the device to match the node's actual value. The node is specified in NodeURI.
Description framework properties:
Property name | Property value |
---|---|
Format | null |
Access Type | Add, Delete, Get |
Device/{ProviderID}/Nodes/{NodeID}/ExpectedValue
Scope | Editions | Applicable OS |
---|---|---|
✅ Device ✅ User |
✅ Pro ✅ Enterprise ✅ Education ✅ Windows SE ✅ IoT Enterprise / IoT Enterprise LTSC |
✅ Windows 10, version 1511 [10.0.10586] and later |
./Device/Vendor/MSFT/NodeCache/{ProviderID}/Nodes/{NodeID}/ExpectedValue
This is the value that the server expects to be on the device. When the configuration service provider initiates a session, it checks the expected value against the node's actual value.
Supported values are string and x-nodemon-nonexistent.
Description framework properties:
Property name | Property value |
---|---|
Format | chr (string) |
Access Type | Add, Delete, Get |
Example:
Here's an example for setting the ExpectedValue to nonexistent.
<Add>
<CmdID>10</CmdID>
<Item>
<Target>
<LocURI>./Device/Vendor/MSFT/NodeCache/MDMSRV1/Nodes/Node_0002/ExpectedValue</LocURI>
</Target>
<Meta>
<Format xmlns="syncml:metinf">chr</Format>
<Type xmlns="syncml:metinf">application/x-nodemon-nonexistent</Type>
</Meta>
</Item>
</Add>
Device/{ProviderID}/Nodes/{NodeID}/NodeURI
Scope | Editions | Applicable OS |
---|---|---|
✅ Device ✅ User |
✅ Pro ✅ Enterprise ✅ Education ✅ Windows SE ✅ IoT Enterprise / IoT Enterprise LTSC |
✅ Windows 10, version 1511 [10.0.10586] and later |
./Device/Vendor/MSFT/NodeCache/{ProviderID}/Nodes/{NodeID}/NodeURI
This node's value is a complete OMA DM node URI. It can specify either an interior or leaf node in the device management tree.
Description framework properties:
Property name | Property value |
---|---|
Format | chr (string) |
Access Type | Add, Delete, Get |
User/{ProviderID}
Scope | Editions | Applicable OS |
---|---|---|
✅ Device ✅ User |
✅ Pro ✅ Enterprise ✅ Education ✅ Windows SE ✅ IoT Enterprise / IoT Enterprise LTSC |
✅ Windows 10, version 1703 [10.0.15063] and later |
./User/Vendor/MSFT/NodeCache/{ProviderID}
Group settings per DM server. Each group of settings is distinguished by the server's Provider ID. It should be the same DM server PROVIDER-ID value that was supplied through the w7 APPLICATION configuration service provider XML during the enrollment process. In Windows Phone 8, only one enterprise management server is supported. That is, there should be only one ProviderID node under NodeCache.
Description framework properties:
Property name | Property value |
---|---|
Format | node |
Access Type | Add, Delete, Get |
Dynamic Node Naming | UniqueName: It should be the same DM server PROVIDER-ID value that was supplied through the w7 APPLICATION configuration service provider XML during the enrollment process. |
User/{ProviderID}/CacheVersion
Scope | Editions | Applicable OS |
---|---|---|
✅ Device ✅ User |
✅ Pro ✅ Enterprise ✅ Education ✅ Windows SE ✅ IoT Enterprise / IoT Enterprise LTSC |
✅ Windows 10, version 1703 [10.0.15063] and later |
./User/Vendor/MSFT/NodeCache/{ProviderID}/CacheVersion
Character string representing the cache version set by the server.
Description framework properties:
Property name | Property value |
---|---|
Format | chr (string) |
Access Type | Add, Get, Replace |
User/{ProviderID}/ChangedNodes
Scope | Editions | Applicable OS |
---|---|---|
✅ Device ✅ User |
✅ Pro ✅ Enterprise ✅ Education ✅ Windows SE ✅ IoT Enterprise / IoT Enterprise LTSC |
✅ Windows 10, version 1703 [10.0.15063] and later |
./User/Vendor/MSFT/NodeCache/{ProviderID}/ChangedNodes
List of nodes whose values don't match their expected values as specified in /NodeID/ExpectedValue.
Description framework properties:
Property name | Property value |
---|---|
Format | chr (string) |
Access Type | Get |
User/{ProviderID}/ChangedNodesData
Scope | Editions | Applicable OS |
---|---|---|
✅ Device ✅ User |
✅ Pro ✅ Enterprise ✅ Education ✅ Windows SE ✅ IoT Enterprise / IoT Enterprise LTSC |
✅ Windows 10, version 1703 [10.0.15063] and later |
./User/Vendor/MSFT/NodeCache/{ProviderID}/ChangedNodesData
XML containing nodes whose values don't match their expected values as specified in /NodeID/ExpectedValue.
Description framework properties:
Property name | Property value |
---|---|
Format | xml |
Access Type | Get |
User/{ProviderID}/Nodes
Scope | Editions | Applicable OS |
---|---|---|
✅ Device ✅ User |
✅ Pro ✅ Enterprise ✅ Education ✅ Windows SE ✅ IoT Enterprise / IoT Enterprise LTSC |
✅ Windows 10, version 1703 [10.0.15063] and later |
./User/Vendor/MSFT/NodeCache/{ProviderID}/Nodes
Root node for cached nodes.
Description framework properties:
Property name | Property value |
---|---|
Format | node |
Access Type | Get |
User/{ProviderID}/Nodes/{NodeID}
Scope | Editions | Applicable OS |
---|---|---|
✅ Device ✅ User |
✅ Pro ✅ Enterprise ✅ Education ✅ Windows SE ✅ IoT Enterprise / IoT Enterprise LTSC |
✅ Windows 10, version 1703 [10.0.15063] and later |
./User/Vendor/MSFT/NodeCache/{ProviderID}/Nodes/{NodeID}
Information about each cached node is stored under NodeID as specified by the server. This value mustn't contain a comma.
Description framework properties:
Property name | Property value |
---|---|
Format | node |
Access Type | Add, Delete, Get |
Dynamic Node Naming | ServerGeneratedUniqueIdentifier |
User/{ProviderID}/Nodes/{NodeID}/AutoSetExpectedValue
Scope | Editions | Applicable OS |
---|---|---|
✅ Device ✅ User |
✅ Pro ✅ Enterprise ✅ Education ✅ Windows SE ✅ IoT Enterprise / IoT Enterprise LTSC |
✅ Windows 10, version 1703 [10.0.15063] and later |
./User/Vendor/MSFT/NodeCache/{ProviderID}/Nodes/{NodeID}/AutoSetExpectedValue
This will automatically set the value on the device to match the node's actual value. The node is specified in NodeURI.
Description framework properties:
Property name | Property value |
---|---|
Format | null |
Access Type | Add, Delete, Get |
User/{ProviderID}/Nodes/{NodeID}/ExpectedValue
Scope | Editions | Applicable OS |
---|---|---|
✅ Device ✅ User |
✅ Pro ✅ Enterprise ✅ Education ✅ Windows SE ✅ IoT Enterprise / IoT Enterprise LTSC |
✅ Windows 10, version 1703 [10.0.15063] and later |
./User/Vendor/MSFT/NodeCache/{ProviderID}/Nodes/{NodeID}/ExpectedValue
This is the value that the server expects to be on the device. When the configuration service provider initiates a session, it checks the expected value against the node's actual value.
Supported values are string and x-nodemon-nonexistent.
Description framework properties:
Property name | Property value |
---|---|
Format | chr (string) |
Access Type | Add, Delete, Get |
Example:
Here's an example for setting the ExpectedValue to nonexistent.
<Add>
<CmdID>10</CmdID>
<Item>
<Target>
<LocURI>./User/Vendor/MSFT/NodeCache/MDMSRV1/Nodes/Node_0002/ExpectedValue</LocURI>
</Target>
<Meta>
<Format xmlns="syncml:metinf">chr</Format>
<Type xmlns="syncml:metinf">application/x-nodemon-nonexistent</Type>
</Meta>
</Item>
</Add>
User/{ProviderID}/Nodes/{NodeID}/NodeURI
Scope | Editions | Applicable OS |
---|---|---|
✅ Device ✅ User |
✅ Pro ✅ Enterprise ✅ Education ✅ Windows SE ✅ IoT Enterprise / IoT Enterprise LTSC |
✅ Windows 10, version 1703 [10.0.15063] and later |
./User/Vendor/MSFT/NodeCache/{ProviderID}/Nodes/{NodeID}/NodeURI
This node's value is a complete OMA DM node URI. It can specify either an interior or leaf node in the device management tree.
Description framework properties:
Property name | Property value |
---|---|
Format | chr (string) |
Access Type | Add, Delete, Get |
A typical DM session with the NodeCache configuration service provider
- The device connects to a DM server.
- The server queries the NodeCache version by issuing a Get operation for ./Vendor/MSFT/NodeCache/ProviderID/CacheVersion LocURI
- If the device CacheVersion and the server-side cache differ (due to a device crash or server crash), the server can clear the server-side cache and go to Step 5.
- The server updates the server-side cache:
- Sends a Get operation for ./Vendor/MSFT/NodeCache/ProviderID/ChangedNodes LocURI
- Response is a list of changed node IDs. Each ID in the list corresponds to a node under ./Vendor/MSFT/NodeCache/ProviderID/Nodes root
- For each node in the invalid nodes list, the server sends a
GET
command to retrieve the actual value of the node. For example,GET <NodeURI>
, whereNodeURI
is a full device LocURI that corresponds to the invalid cache node. - Nodes in the server-side cache are updated with the actual values received from the device.
- For each updated node, a
REPLACE
command is sent to the device to update the device-side cache:REPLACE ./Vendor/MSFT/NodeCache/ProviderID/Nodes/NodeID/ExpectedValue => ActualValue
- A new cache version is created and sent to the device:
REPLACE ./Vendor/MSFT/NodeCache/ProviderID/CacheVersion => new_version
Thenew_version
value is stored by the server.
- The management server retrieves the corresponding value from the server-side cache:
- If a value already exists in the server-side cache, retrieve the value from the server-side cache instead of going to the device.
- If a value doesn't exist in the server-side cache, do the following tasks:
- Create a new entry with a unique NodeID in the server-side cache.
- Query the device to retrieve the actual value of the URI.
- Create a new node under ./Vendor/MSFT/NodeCache/ProviderID/Nodes with NodeID value.
- Set up NodeURI and ExpectedValue for the ./Vendor/MSFT/NodeCache/ProviderID/Nodes/NodeID node.
- Update the CachedNodes version.
OMA DM examples
Creating settings for node caching:
<Add>
<CmdID>2</CmdID>
<Item>
<Target>
<LocURI>./Vendor/MSFT/NodeCache/MDMSRV1</LocURI>
</Target>
<Meta>
<Format xmlns="syncml:metinf">node</Format>
</Meta>
</Item>
</Add>
<Add>
<CmdID>4</CmdID>
<Item>
<Target>
<LocURI>./Vendor/MSFT/NodeCache/MDMSRV1/Nodes/Node_0001</LocURI>
</Target>
<Meta>
<Format xmlns="syncml:metinf">node</Format>
</Meta>
</Item>
</Add>
<Add>
<CmdID>5</CmdID>
<Item>
<Target>
<LocURI>./Vendor/MSFT/NodeCache/MDMSRV1/Nodes/Node_0001/NodeURI</LocURI>
</Target>
<Data>./Vendor/MSFT/DeviceLock/Provider/MDMSRV1/DevicePasswordEnabled</Data>
</Item>
</Add>
<Add>
<CmdID>6</CmdID>
<Item>
<Target>
<LocURI>./Vendor/MSFT/NodeCache/MDMSRV1/Nodes/Node_0001/ExpectedValue</LocURI>
</Target>
<Data>0</Data>
</Item>
</Add>
<Add>
<CmdID>8</CmdID>
<Item>
<Target>
<LocURI>./Vendor/MSFT/NodeCache/MDMSRV1/Nodes/Node_0002</LocURI>
</Target>
<Meta>
<Format xmlns="syncml:metinf">node</Format>
</Meta>
</Item>
</Add>
<Add>
<CmdID>9</CmdID>
<Item>
<Target>
<LocURI>./Vendor/MSFT/NodeCache/MDMSRV1/Nodes/Node_0002/NodeURI</LocURI>
</Target>
<Data>
./Vendor/MSFT/DeviceLock/Provider/MDMSRV1/AlphanumericDevicePasswordRequired
</Data>
</Item>
</Add>
<Add>
<CmdID>10</CmdID>
<Item>
<Target>
<LocURI>./Vendor/MSFT/NodeCache/MDMSRV1/Nodes/Node_0002/ExpectedValue</LocURI>
</Target>
<Data>0</Data>
</Item>
</Add>
Getting nodes under Provider ID MDMSRV1, cache version, changed nodes, node, expected value:
<Get>
<CmdID>18</CmdID>
<Item>
<Target>
<LocURI>./Vendor/MSFT/NodeCache/MDMSRV1</LocURI>
</Target>
</Item>
</Get>
<Get>
<CmdID>19</CmdID>
<Item>
<Target>
<LocURI>./Vendor/MSFT/NodeCache/MDMSRV1/CacheVersion</LocURI>
</Target>
</Item>
</Get>
<Get>
<CmdID>20</CmdID>
<Item>
<Target>
<LocURI>./Vendor/MSFT/NodeCache/MDMSRV1/ChangedNodes</LocURI>
</Target>
</Item>
</Get>
<Get>
<CmdID>21</CmdID>
<Item>
<Target>
<LocURI>./Vendor/MSFT/NodeCache/MDMSRV1/Nodes/Node_0001</LocURI>
</Target>
</Item>
</Get>
<Get>
<CmdID>22</CmdID>
<Item>
<Target>
<LocURI>./Vendor/MSFT/NodeCache/MDMSRV1/Nodes/Node_0001/ExpectedValue</LocURI>
</Target>
</Item>
</Get>
Replacing the cache version, node URI, and expected value:
<Replace>
<CmdID>2</CmdID>
<Item>
<Target>
<LocURI>./Vendor/MSFT/NodeCache/MDMSRV1/CacheVersion</LocURI>
</Target>
<Data>SCCM0001@!Replace</Data>
</Item>
</Replace>
<Replace>
<CmdID>2</CmdID>
<Item>
<Target>
<LocURI>./Vendor/MSFT/NodeCache/MDMSRV1/Nodes/Node_0001/NodeURI</LocURI>
</Target>
<Data>./Vendor/MSFT/DeviceLock/DeviceValue/AllowSimpleDevicePassword</Data>
</Item>
</Replace>
<Replace>
<CmdID>2</CmdID>
<Item>
<Target>
<LocURI>./Vendor/MSFT/NodeCache/MDMSRV1/Nodes/Node_0001/ExpectedValue</LocURI>
</Target>
<Data>2</Data>
</Item>
</Replace>
For AutoSetExpectedValue, a Replace operation with empty data will query the ./DevDetail/Ext/Microsoft/DeviceName.
<Add>
<CmdID>2001</CmdID>
<Item>
<Target>
<LocURI>./Vendor/MSFT/NodeCache/MDM%20SyncML%20Server/Nodes/20</LocURI>
</Target>
<Meta>
<Format xmlns="syncml:metinf">node</Format>
</Meta>
</Item>
</Add>
<Add>
<CmdID>2002</CmdID>
<Item>
<Target>
<LocURI>./Vendor/MSFT/NodeCache/MDM%20SyncML%20Server/Nodes/20/NodeURI</LocURI>
</Target>
<Data>./DevDetail/Ext/Microsoft/DeviceName</Data>
</Item>
</Add>
<Replace>
<CmdID>2003</CmdID>
<Item>
<Target>
<LocURI>./Vendor/MSFT/NodeCache/MDM%20SyncML%20Server/Nodes/20/AutoSetExpectedValue</LocURI>
</Target>
<Data></Data>
</Item>
</Replace>
A Get operation on ./Vendor/MSFT/NodeCache/MDM%20SyncML%20Server/Nodes/20/ExpectedValue
returns what the Device Name was when the AutoSet was called.
A Get operation on the ChangedNodesData returns an encoded XML. Here's an example:
<Nodes><Node Id="10" Uri=""></Node><Node Id="20" Uri="./DevDetail/Ext/Microsoft/DeviceName">U09NRU5FV1ZBTFVF</Node></Nodes>
It represents this example:
<Nodes>
<Node Id="10" Uri=""></Node>
<Node Id="20" Uri="./DevDetail/Ext/Microsoft/DeviceName">U09NRU5FV1ZBTFVF</Node>
</Nodes>
Id is the node ID that was added by the MDM server, and Uri is the path that the node is tracking. If a Uri is not set, the node will always be reported as changed, as in Node ID 10.
The value inside of the node tag is the actual value returned by the Uri, which means that for Node ID 20 the DeviceName did not match what was previously expected, and the device name is now U09NRU5FV1ZBTFVF instead of what it was previously.