{"id":341,"date":"2019-05-22T09:12:35","date_gmt":"2019-05-22T09:12:35","guid":{"rendered":"http:\/\/172.23.1.43\/?p=341"},"modified":"2022-06-07T22:36:16","modified_gmt":"2022-06-07T22:36:16","slug":"deep-dive-admx-ingestion-on-windows-10","status":"publish","type":"post","link":"https:\/\/blog.n-dol.org\/2019\/05\/22\/deep-dive-admx-ingestion-on-windows-10\/","title":{"rendered":"Deep Dive – ADMX Ingestion on Windows 10"},"content":{"rendered":"\n
As I have solved the issue on ingesting the Office16.admx<\/a>, I thought I would review the whole ingestion process to help understand how it works under the hood and how to manage it.<\/p>\n\n\n\n Since Windows 10 1703, ADMX can be ingested and processed by the MDM layer via the policy CSP with the URI <\/p>\n\n\n\n For this article, I will use ADMX files that I have created for each situation. The name of the example application is CamilleApp<\/strong> and published by DebayCorp<\/strong> company.<\/p>\n\n\n\n\n\n\n\n The ADMX Install URI has 3 configurable settings:<\/p>\n\n\n\n AppName:<\/strong><\/span> <\/strong>Name of the Application targeted by this ADMX. Depending what you are targeting it should be unique to the application in case to cater for multiple version of the same application. ADMX Area:<\/strong><\/span> <\/strong>There are 2 areas which ADMX ingestion covers; which are Policy and Preference. UniqueID:<\/span><\/strong> This parameter is unique to the ADMX installation, it is only used at the installation. Policy Manager uses it for versioning in case of update, more detail below. The ADMX Install URI, follows LocURI format, you should stick to alphanumeric characters ( Finally, as described in my previous article on Office<\/a>, there are some limitations on the ingestion process. I’ve coded a PS script to validate the ADMX against these limitations. the ingested policies are not allowed to write to locations within the System<\/strong>, Software\\Microsoft<\/strong>, and Software\\Policies\\Microsoft<\/strong> keys, except for the following locations:<\/p> The import process require 2 steps.<\/p>\n\n\n\n Step 1 – Create the URI<\/strong><\/p>\n\n\n\n The URI must be created for each ADMX you want to import. Step 2 – Build the SyncML<\/strong><\/p>\n\n\n\n The SyncML is a standard SyncML with the ADMX escaped to avoid any interference between the ADMX format and the SyncML format. Note<\/strong>: Anything before Generic SyncML:<\/p>\n\n\n\n To validate that the ingestion has processed correctly, you can have a look in the Windows Event Viewer<\/strong> at Applications and Services Logs > Microsoft > Windows ><\/em> Microsoft-Windows-DeviceManagement-Enterprise-Diagnostics-Provider > Admin<\/em><\/strong>.\/Device\/Vendor\/MSFT\/Policy\/ConfigOperations\/ADMXInstall\/<\/code><\/pre>\n\n\n\n
ADMX Ingestion<\/h1>\n\n\n\n
The ADMXInstall URI<\/h2>\n\n\n\n
...\/ConfigOperation\/ADMXInstall\/{AppName}\/{Area}\/{UniqueID}<\/code><\/pre>\n\n\n\n
Operation supported : Add<\/code>,
Get<\/code>,
Delete<\/code>
Example: Office 2016 and Office 2013 should be Office2016 and Office2013<\/p>\n\n\n\n
Policy<\/strong> is for usual GPO
Preference<\/strong> is for preference GPO
Operation supported : Add<\/code>,
Get<\/code>,
Delete<\/code><\/p>\n\n\n\n
Operation supported : Add<\/code>,
Get<\/code><\/p>\n\n\n\n
a-z<\/code>,
A-Z<\/code>,
0-9<\/code>) and may use underscore(
_<\/code>), I would advise against any other characters which can be used in URI, as this may be used in some other scenario.<\/p>\n\n\n\n
Limitation<\/h2>\n\n\n\n
ADMXValidation Script<\/a><\/p>\n\n\n\n\n
Import Process<\/h1>\n\n\n\n
Admin process<\/h2>\n\n\n\n
My application name is CamilleApp <\/i><\/b>and the ADMX target Policy<\/em><\/strong>.
For the uniqueID, we can use any value for now as this is unique to this installation. I’m going to use Version1<\/em><\/strong> for this example.<\/p>\n\n\n\n...\/ConfigOperation\/ADMXInstall\/CamilleApp\/Policy\/Version1<\/strong><\/pre>\n\n\n\n
It uses the Add<\/code> operation.<\/p>\n\n\n\n
policydefinition<\/code> need to be removed before adding it to the SyncML<\/p>\n\n\n\n
<Add>\n <CmdID>2<\/CmdID>\n <Item>\n <Target>\n <LocURI>.\/Device\/Vendor\/MSFT\/Policy\/ConfigOperations\/ADMXInstall\/CamilleApp\/Policy\/Version2<\/LocURI>\n <\/Target>\n <Data>{ADMX escaped from < > to < > }><\/Data>\n <\/Item>\n<\/Add><\/code><\/pre>\n\n\n\n
Validation<\/h3>\n\n\n\n
The ingestion process only logs when there are errors, it will tell which ADMX failed and where in the ADMX there is an issue.<\/p>\n\n\n