Hardware

SQL Server Inventory using ConfigMgr

The hardware inventor feature of ConfigMgr helps us discover and track several items. One recurring item is SQL Server and by default there is no nice way of tracking this. Basically the only option out of the box is using the application inventory to find where SQL server is installed. However this usualy results in a large list with mixed servers and clients and you still have no idea if its running SQLExpress, Standard or Enterprise edtion.

So what can we do to fix this besides buy a third party solution. Well the good thing is that SQL stores all the information into WMI, this means we can track editions, installations and versions with a bit of trickery with the hardware inventory engine.

There are number of steps included here at it is important to follow all of them for a successful result.

Step 1 – Update Configuration.mof

The first part of this is updateing configuration.mof. This file will control classes that inventoried and then index into the database.

The file can be a bit tricky to find if you have never done this before. You need to go to this location <Your ConfigMgr Install folder>\Inboxes\clifiles.src\hinv

In here is the configuration.mof file, now first make a backup copy of the file in case you want to revert the changes later and don’t want edit the file again.

At the very end of the file there is a section for adding custom extensions.

//========================

// Added extensions start

//========================

//========================

// Added extensions end

//========================

In between these block we need to add the following

//———————————————

// SQL 2017 Properties

//———————————————

[Union, ViewSources{“select IsReadOnly,PropertyIndex,PropertyName,PropertyNumValue,PropertyStrValue,PropertyValueType,
ServiceName,SqlServiceType from sqlServiceAdvancedProperty”},ViewSpaces{“\\\\.\\root\\microsoft\\sqlserver\\computermanagement14”}, dynamic,
Provider(“MS_VIEW_INSTANCE_PROVIDER”)]

class cm_sql17

{
[PropertySources{“IsReadOnly”}        ] boolean IsReadOnly;
[PropertySources{“PropertyIndex”},key ] uint32 PropertyIndex;
[PropertySources{“PropertyName”},key  ] string PropertyName;
[PropertySources{“PropertyNumValue”}  ] uint32 PropertyNumValue;
[PropertySources{“PropertyStrValue”}  ] string PropertyStrValue;
[PropertySources{“PropertyValueType”} ] uint32 PropertyValueType;
[PropertySources{“ServiceName”},key   ] string ServiceName;
[PropertySources{“SqlServiceType”},key] uint32 SqlServiceType;

};

//———————————————

// SQL 2016 Properties

//———————————————

[Union, ViewSources{“select IsReadOnly,PropertyIndex,PropertyName,PropertyNumValue,PropertyStrValue,PropertyValueType,
ServiceName,SqlServiceType from sqlServiceAdvancedProperty”},ViewSpaces{“\\\\.\\root\\microsoft\\sqlserver\\computermanagement13”}, dynamic,
Provider(“MS_VIEW_INSTANCE_PROVIDER”)]

class cm_sql16

{
[PropertySources{“IsReadOnly”}        ] boolean IsReadOnly;
[PropertySources{“PropertyIndex”},key ] uint32 PropertyIndex;
[PropertySources{“PropertyName”},key  ] string PropertyName;
[PropertySources{“PropertyNumValue”}  ] uint32 PropertyNumValue;
[PropertySources{“PropertyStrValue”}  ] string PropertyStrValue;
[PropertySources{“PropertyValueType”} ] uint32 PropertyValueType;
[PropertySources{“ServiceName”},key   ] string ServiceName;
[PropertySources{“SqlServiceType”},key] uint32 SqlServiceType;

};

//———————————————

// SQL 2014 Properties

//———————————————

[Union, ViewSources{“select IsReadOnly,PropertyIndex,PropertyName,PropertyNumValue,PropertyStrValue,PropertyValueType,
ServiceName,SqlServiceType from sqlServiceAdvancedProperty”},ViewSpaces{“\\\\.\\root\\microsoft\\sqlserver\\computermanagement12”}, dynamic,
Provider(“MS_VIEW_INSTANCE_PROVIDER”)]

class cm_sql14

{
[PropertySources{“IsReadOnly”}        ] boolean IsReadOnly;
[PropertySources{“PropertyIndex”},key ] uint32 PropertyIndex;
[PropertySources{“PropertyName”},key  ] string PropertyName;
[PropertySources{“PropertyNumValue”}  ] uint32 PropertyNumValue;
[PropertySources{“PropertyStrValue”}  ] string PropertyStrValue;
[PropertySources{“PropertyValueType”} ] uint32 PropertyValueType;
[PropertySources{“ServiceName”},key   ] string ServiceName;
[PropertySources{“SqlServiceType”},key] uint32 SqlServiceType;

};

//———————————————

// SQL 2012 Properties

//———————————————

[Union, ViewSources{“select IsReadOnly,PropertyIndex,PropertyName,PropertyNumValue,PropertyStrValue,PropertyValueType,
ServiceName,SqlServiceType from sqlServiceAdvancedProperty”},ViewSpaces{“\\\\.\\root\\microsoft\\sqlserver\\computermanagement11”}, dynamic,
Provider(“MS_VIEW_INSTANCE_PROVIDER”)]

class cm_sql12

{
[PropertySources{“IsReadOnly”}        ] boolean IsReadOnly;
[PropertySources{“PropertyIndex”},key ] uint32 PropertyIndex;
[PropertySources{“PropertyName”},key  ] string PropertyName;
[PropertySources{“PropertyNumValue”}  ] uint32 PropertyNumValue;
[PropertySources{“PropertyStrValue”}  ] string PropertyStrValue;
[PropertySources{“PropertyValueType”} ] uint32 PropertyValueType;
[PropertySources{“ServiceName”},key   ] string ServiceName;
[PropertySources{“SqlServiceType”},key] uint32 SqlServiceType;

};

//———————————————

// SQL 2008 Properties

//———————————————

[Union, ViewSources{“select IsReadOnly,PropertyIndex,PropertyName,PropertyNumValue,PropertyStrValue,PropertyValueType,
ServiceName,SqlServiceType from sqlServiceAdvancedProperty”},ViewSpaces{“\\\\.\\root\\microsoft\\sqlserver\\computermanagement10”}, dynamic,
Provider(“MS_VIEW_INSTANCE_PROVIDER”)]

class cm_sql08

{
[PropertySources{“IsReadOnly”}        ] boolean IsReadOnly;
[PropertySources{“PropertyIndex”},key ] uint32 PropertyIndex;
[PropertySources{“PropertyName”},key  ] string PropertyName;
[PropertySources{“PropertyNumValue”}  ] uint32 PropertyNumValue;
[PropertySources{“PropertyStrValue”}  ] string PropertyStrValue;
[PropertySources{“PropertyValueType”} ] uint32 PropertyValueType;
[PropertySources{“ServiceName”},key   ] string ServiceName;
[PropertySources{“SqlServiceType”},key] uint32 SqlServiceType;

};

//———————————————

// SQL 2000/2005 Properties

//———————————————

[Union, ViewSources{“select IsReadOnly,PropertyIndex,PropertyName,PropertyNumValue,PropertyStrValue,PropertyValueType,
ServiceName,SqlServiceType from sqlServiceAdvancedProperty”},ViewSpaces{“\\\\.\\root\\microsoft\\sqlserver\\computermanagement”}, dynamic,Provider(“MS_VIEW_INSTANCE_PROVIDER”)]

class cm_sql2kand05

{
[PropertySources{“IsReadOnly”}        ] boolean IsReadOnly;
[PropertySources{“PropertyIndex”},key ] uint32 PropertyIndex;
[PropertySources{“PropertyName”},key  ] string PropertyName;
[PropertySources{“PropertyNumValue”}  ] uint32 PropertyNumValue;
[PropertySources{“PropertyStrValue”}  ] string PropertyStrValue;
[PropertySources{“PropertyValueType”} ] uint32 PropertyValueType;
[PropertySources{“ServiceName”},key   ] string ServiceName;
[PropertySources{“SqlServiceType”},key] uint32 SqlServiceType;

};

Save the configuration.mof file

Done! On to step two.

Step 2 – Import hardware inventory information

The next step is done in the console and you need some nice permissions to do this. You will need to edit the default client settings object.

First thing is first. So we need to create a custom mof file to import. To do this, copy the following and save it as SQLProperties.mof (pick a nice location, like the desktop).

//=================SQL 2017 Information

[dynamic, provider(“MS_VIEW_INSTANCE_PROVIDER”),

SMS_Report(TRUE),

SMS_Group_Name(“SQL17 Property”),

SMS_Class_ID(“CUSTOM|SQL17_Property|1.0”)]

class cm_sql17 : SMS_Class_Template

{
[SMS_Report(TRUE)    ]  boolean IsReadOnly;
[SMS_Report(TRUE),key]  uint32 PropertyIndex;
[SMS_Report(TRUE),key]  string PropertyName;
[SMS_Report(TRUE)    ]  uint32 PropertyNumValue;
[SMS_Report(TRUE)    ]  string PropertyStrValue;
[SMS_Report(TRUE)    ]  uint32 PropertyValueType;
[SMS_Report(TRUE),key]  string ServiceName;
[SMS_Report(TRUE),key]  uint32 SqlServiceType;

};

//=================SQL 2016 Information

[dynamic, provider(“MS_VIEW_INSTANCE_PROVIDER”),

SMS_Report(TRUE),

SMS_Group_Name(“SQL16 Property”),

SMS_Class_ID(“CUSTOM|SQL16_Property|1.0”)]

class cm_sql16 : SMS_Class_Template

{
[SMS_Report(TRUE)    ]  boolean IsReadOnly;
[SMS_Report(TRUE),key]  uint32 PropertyIndex;
[SMS_Report(TRUE),key]  string PropertyName;
[SMS_Report(TRUE)    ]  uint32 PropertyNumValue;
[SMS_Report(TRUE)    ]  string PropertyStrValue;
[SMS_Report(TRUE)    ]  uint32 PropertyValueType;
[SMS_Report(TRUE),key]  string ServiceName;
[SMS_Report(TRUE),key]  uint32 SqlServiceType;

};

//=================SQL 2014 Information

[dynamic, provider(“MS_VIEW_INSTANCE_PROVIDER”),

SMS_Report(TRUE),

SMS_Group_Name(“SQL14 Property”),

SMS_Class_ID(“CUSTOM|SQL14_Property|1.0”)]

class cm_sql14 : SMS_Class_Template

{
[SMS_Report(TRUE)    ]  boolean IsReadOnly;
[SMS_Report(TRUE),key]  uint32 PropertyIndex;
[SMS_Report(TRUE),key]  string PropertyName;
[SMS_Report(TRUE)    ]  uint32 PropertyNumValue;
[SMS_Report(TRUE)    ]  string PropertyStrValue;
[SMS_Report(TRUE)    ]  uint32 PropertyValueType;
[SMS_Report(TRUE),key]  string ServiceName;
[SMS_Report(TRUE),key]  uint32 SqlServiceType;

};

//=================SQL 2012 Information

[dynamic, provider(“MS_VIEW_INSTANCE_PROVIDER”),

SMS_Report(TRUE),

SMS_Group_Name(“SQL12 Property”),

SMS_Class_ID(“CUSTOM|SQL12_Property|1.0”)]

class cm_sql12 : SMS_Class_Template

{
[SMS_Report(TRUE)    ]  boolean IsReadOnly;
[SMS_Report(TRUE),key]  uint32 PropertyIndex;
[SMS_Report(TRUE),key]  string PropertyName;
[SMS_Report(TRUE)    ]  uint32 PropertyNumValue;
[SMS_Report(TRUE)    ]  string PropertyStrValue;
[SMS_Report(TRUE)    ]  uint32 PropertyValueType;
[SMS_Report(TRUE),key]  string ServiceName;
[SMS_Report(TRUE),key]  uint32 SqlServiceType;

};

//=================SQL 2008 Information

[dynamic, provider(“MS_VIEW_INSTANCE_PROVIDER”),

SMS_Report(TRUE),

SMS_Group_Name(“SQL Property”),

SMS_Class_ID(“CUSTOM|SQL_Property|2.0”)]

class cm_sql08 : SMS_Class_Template

{
[SMS_Report(TRUE)    ]  boolean IsReadOnly;
[SMS_Report(TRUE),key]  uint32 PropertyIndex;
[SMS_Report(TRUE),key]  string PropertyName;
[SMS_Report(TRUE)    ]  uint32 PropertyNumValue;
[SMS_Report(TRUE)    ]  string PropertyStrValue;
[SMS_Report(TRUE)    ]  uint32 PropertyValueType;
[SMS_Report(TRUE),key]  string ServiceName;
[SMS_Report(TRUE),key]  uint32 SqlServiceType;

};

//==================SQL Information 2000 and 2005

[dynamic, provider(“MS_VIEW_INSTANCE_PROVIDER”),

SMS_Report(TRUE),

SMS_Group_Name(“SQL Property Legacy”),

SMS_Class_ID(“CUSTOM|SQL_Property_Legacy|2.0”)]

class cm_sql2kand05 : SMS_Class_Template

{
[SMS_Report(TRUE)    ]  boolean IsReadOnly;
[SMS_Report(TRUE),key]  uint32 PropertyIndex;
[SMS_Report(TRUE),key]  string PropertyName;
[SMS_Report(TRUE)    ]  uint32 PropertyNumValue;
[SMS_Report(TRUE)    ]  string PropertyStrValue;
[SMS_Report(TRUE)    ]  uint32 PropertyValueType;
[SMS_Report(TRUE),key]  string ServiceName;
[SMS_Report(TRUE),key]  uint32 SqlServiceType;

};

Next, head on over to the Administration workspace in the ConfigMgr console and find the Client Settings in the menu to the left. Open up the Default Client Settings and check the Hardware Inventory tab.

There is a nice little button named Set Classes, hit that and then hit import. Browse to the SQLProperties.mof file and hit Open.

You will be greated by this screen where you need to make sure the Import both hardware inventory classes and hardware inventory class settings is selected

sqlinv02

If you are like me and don’t want this inventory to hit each and every device you have deselect the following classes in your default settings. If you are only using the default client settings object, please skip to the next step.

sqlinv01

If you are using custom client settings, please add the above classes to be included in hardware inventory under the same tabe as we did the import.

This means SQL information will now be imorted into the database! We can now create collections based on this, please do leave enough time for hardware inventory to run on each client before you find data in the database.

Step 3 – The Report

For me the last piece of the pussel is to create a custom report to easily show me the information needed. I will not cover the details of how to create a custom reports as the options are plenty. However I will share the query used to get a nice detailed view with the server and edition info.

Note that this is a simple report and can be extended in a lot of ways and if you are already using PowerBI you can extract the same data that way.

Query used:

— SQL 2017

select

sys1.Netbios_name0 as [Computer Name]

,max(Case sql6.PropertyName0 when ‘VERSION’ then
(case
when sql6.PropertySTRValue0 like ‘9.0%’ then ‘SQL 2005’
when sql6.PropertySTRValue0 like ‘10.5%’ then ‘SQL 2008 R2’
when sql6.PropertySTRValue0 like ’10.%’ then ‘SQL 2008’
when sql6.PropertySTRValue0 like ’11.%’ then ‘SQL 2012’
when sql6.PropertySTRValue0 like ’12.%’ then ‘SQL 2014’
when sql6.PropertySTRValue0 like ’14.%’ then ‘SQL 2016’
when sql6.PropertySTRValue0 like ’16.%’ then ‘SQL 2017’
else ‘SQL Other’ End)
end) as [SQL]

,max(Case sql6.PropertyName0 when ‘SKUName’ then
sql6.PropertySTRValue0 end)  as [SQL Type]

,max(Case sql6.PropertyName0 when ‘SPLEVEL’ then
sql6.PropertyNUMValue0 end)  as [SQL Service Pack]

,max(Case sql6.PropertyName0 when ‘VERSION’ then
sql6.PropertySTRValue0 end) as [SQL Version]

,max(Case sql6.PropertyName0 when ‘FILEVERSION’ then
sql6.PropertySTRValue0 end) as [SQL CU Version]

from v_r_system sys1

left join v_gs_custom_SQL17_Property0 sql6 on sys1.ResourceID=sql6.ResourceID

where

sql6.PropertyName0 in (‘SKUNAME’,’SPLevel’,’version’,’fileversion’)

group by sys1.Netbios_name0

union

— SQL 2016

select

sys1.Netbios_name0 as [Computer Name]

,max(Case sql5.PropertyName0 when ‘VERSION’ then
(case
when sql5.PropertySTRValue0 like ‘9.0%’ then ‘SQL 2005’
when sql5.PropertySTRValue0 like ‘10.5%’ then ‘SQL 2008 R2’
when sql5.PropertySTRValue0 like ’10.%’ then ‘SQL 2008’
when sql5.PropertySTRValue0 like ’11.%’ then ‘SQL 2012’
when sql5.PropertySTRValue0 like ’12.%’ then ‘SQL 2014’
when sql5.PropertySTRValue0 like ’14.%’ then ‘SQL 2016’
when sql5.PropertySTRValue0 like ’16.%’ then ‘SQL 2017’
else ‘SQL Other’ End)
end) as [SQL]

,max(Case sql5.PropertyName0 when ‘SKUName’ then
sql5.PropertySTRValue0 end)  as [SQL Type]

,max(Case sql5.PropertyName0 when ‘SPLEVEL’ then
sql5.PropertyNUMValue0 end)  as [SQL Service Pack]

,max(Case sql5.PropertyName0 when ‘VERSION’ then
sql5.PropertySTRValue0 end) as [SQL Version]

,max(Case sql5.PropertyName0 when ‘FILEVERSION’ then
sql5.PropertySTRValue0 end) as [SQL CU Version]

from v_r_system sys1

left join v_gs_custom_SQL16_Property0 sql5 on sys1.ResourceID=sql5.ResourceID

where

sql5.PropertyName0 in (‘SKUNAME’,’SPLevel’,’version’,’fileversion’)

group by sys1.Netbios_name0

union

— SQL 2014

select

sys1.Netbios_name0 as [Computer Name]

,max(Case sql4.PropertyName0 when ‘VERSION’ then
(case
when sql4.PropertySTRValue0 like ‘9.0%’ then ‘SQL 2005’
when sql4.PropertySTRValue0 like ‘10.5%’ then ‘SQL 2008 R2’
when sql4.PropertySTRValue0 like ’10.%’ then ‘SQL 2008’
when sql4.PropertySTRValue0 like ’11.%’ then ‘SQL 2012’
when sql4.PropertySTRValue0 like ’12.%’ then ‘SQL 2014’
when sql4.PropertySTRValue0 like ’14.%’ then ‘SQL 2016’
when sql4.PropertySTRValue0 like ’16.%’ then ‘SQL 2017’
else ‘SQL Other’ End)
end) as [SQL]

,max(Case sql4.PropertyName0 when ‘SKUName’ then
sql4.PropertySTRValue0 end)  as [SQL Type]

,max(Case sql4.PropertyName0 when ‘SPLEVEL’ then
sql4.PropertyNUMValue0 end)  as [SQL Service Pack]

,max(Case sql4.PropertyName0 when ‘VERSION’ then
sql4.PropertySTRValue0 end) as [SQL Version]

,max(Case sql4.PropertyName0 when ‘FILEVERSION’ then
sql4.PropertySTRValue0 end) as [SQL CU Version]

from v_r_system sys1

left join v_gs_custom_SQL14_Property0 sql4 on sys1.ResourceID=sql4.ResourceID

where

sql4.PropertyName0 in (‘SKUNAME’,’SPLevel’,’version’,’fileversion’)

group by sys1.Netbios_name0

union

— SQL 2012

select

sys1.Netbios_name0 as [Computer Name]

,max(Case sql3.PropertyName0 when ‘VERSION’ then
(case
when sql3.PropertySTRValue0 like ‘9.0%’ then ‘SQL 2005’
when sql3.PropertySTRValue0 like ‘10.5%’ then ‘SQL 2008 R2’
when sql3.PropertySTRValue0 like ’10.%’ then ‘SQL 2008’
when sql3.PropertySTRValue0 like ’11.%’ then ‘SQL 2012’
when sql3.PropertySTRValue0 like ’12.%’ then ‘SQL 2014’
when sql3.PropertySTRValue0 like ’14.%’ then ‘SQL 2016’
when sql3.PropertySTRValue0 like ’16.%’ then ‘SQL 2017’
else ‘SQL Other’ End)
end) as [SQL]

,max(Case sql3.PropertyName0 when ‘SKUName’ then
sql3.PropertySTRValue0 end)  as [SQL Type]

,max(Case sql3.PropertyName0 when ‘SPLEVEL’ then
sql3.PropertyNUMValue0 end)  as [SQL Service Pack]

,max(Case sql3.PropertyName0 when ‘VERSION’ then
sql3.PropertySTRValue0 end) as [SQL Version]

,max(Case sql3.PropertyName0 when ‘FILEVERSION’ then
sql3.PropertySTRValue0 end) as [SQL CU Version]

from v_r_system sys1

left join v_gs_custom_SQL12_Property0 sql3 on sys1.ResourceID=sql3.ResourceID

where

sql3.PropertyName0 in (‘SKUNAME’,’SPLevel’,’version’,’fileversion’)

group by sys1.Netbios_name0

union

— SQL 2008

Select

sys1.Netbios_name0 as [Computer Name]

,max(Case sql2.PropertyName0 when ‘VERSION’ then
(case
when sql2.PropertySTRValue0 like ‘9.0%’ then ‘SQL 2005’
when sql2.PropertySTRValue0 like ‘10.5%’ then ‘SQL 2008 R2’
when sql2.PropertySTRValue0 like ’10.%’ then ‘SQL 2008’
when sql2.PropertySTRValue0 like ’11.%’ then ‘SQL 2012’
when sql2.PropertySTRValue0 like ’12.%’ then ‘SQL 2014’
when sql2.PropertySTRValue0 like ’14.%’ then ‘SQL 2016’
when sql2.PropertySTRValue0 like ’16.%’ then ‘SQL 2017’
else ‘SQL Other’ End)
end) as [SQL]

,max(Case sql2.PropertyName0 when ‘SKUName’ then
sql2.PropertySTRValue0 end) as [SQL Type]

,max(Case sql2.PropertyName0 when ‘SPLEVEL’ then
sql2.PropertyNUMValue0 end) as [SQL Service Pack]

,max(Case sql2.PropertyName0 when ‘VERSION’ then
sql2.PropertySTRValue0 end) as [SQL Version]

,max(Case sql2.PropertyName0 when ‘FILEVERSION’ then
sql2.PropertySTRValue0 end) as [SQL CU Version]

from v_r_system sys1

left join v_gs_custom_sql_property_2_00 sql2 on sys1.resourceid=sql2.ResourceID

where

sql2.PropertyName0 in (‘SKUNAME’,’SPLevel’,’version’,’fileversion’)

group by sys1.Netbios_name0

union

— SQL 2005

Select

sys1.Netbios_name0 as [Computer Name]

,max(Case sql1.PropertyName0 when ‘VERSION’ then
(case
when sql1.PropertySTRValue0 like ‘9.%’ then ‘SQL 2005’
when sql1.PropertySTRValue0 like ‘10.5%’ then ‘SQL 2008 R2’
when sql1.PropertySTRValue0 like ’10.%’ then ‘SQL 2008’
when sql1.PropertySTRValue0 like ’11.%’ then ‘SQL 2012’
when sql1.PropertySTRValue0 like ’12.%’ then ‘SQL 2014’
when sql1.PropertySTRValue0 like ’14.%’ then ‘SQL 2016’
when sql1.PropertySTRValue0 like ’16.%’ then ‘SQL 2017’
else ‘SQL Other’ End)
end) as [SQL]

,max(Case sql1.PropertyName0 when ‘SKUName’ then
sql1.PropertySTRValue0 end) as [SQL Type]

,max(Case sql1.PropertyName0 when ‘SPLEVEL’ then
sql1.PropertyNUMValue0 end) as [SQL Service Pack]

,max(Case sql1.PropertyName0 when ‘VERSION’ then
sql1.PropertySTRValue0 end) as [SQL Version]

,max(Case sql1.PropertyName0 when ‘FILEVERSION’ then
sql1.PropertySTRValue0 end) as [SQL CU Version]

from v_r_system sys1

left join v_gs_custom_sql_property_legacy_2_00 sql1 on sys1.ResourceID=sql1.ResourceID

where sql1.PropertyName0 in (‘SKUNAME’,’SPLevel’,’version’,’fileversion’)

group by sys1.Netbios_name0

This might not be the prettiest query every created or the smartest way (there are alot smarter people out there) so don’t go flaming it’s not optimized. It does the job : )

/Peter

Advertisements

Windows 10 Notes From The Field – Q&A

Last week @jarwidmark and myself held a live session about windows 10 deployment notes from the field and we had ALOT of good questions.

Here are the questions and answers from the session

Q: How well does the performance of an NVMe drive compare to an M2 SSD?
A: There are both M2 NVMe and M2 SSD drives available at the current time. However, the NVMe drives are a different type of drives even if they are connected using the slot type. NVMe will always be faster but depending on what you need to do it might not be economical.

Q: Can Secure Boot be disabled and enabled after Windows 10 installation?
A: Yes, Secure Boot can be disabled/enabled after Windows installation. Note that turning UEFI on/off is not the same thing!

Q: Is peercache similar to a product such as 1E Nomad?
A: Yes, peerchache is very similar to those types of products. What you need to remember is that peercache has now been around for all of 2 months while products similar third party products have been out for a couple of years. There is a good write up about this topic made by 2Pint Software found here https://2pintsoftware.com/peer-cache-in-configmgr-current-branch-first-impressions/

Q: What’s the best way to upgrade from Windows 7 to Windows 10 1607 in place?
A: As of right now the best way is using the Replace scenario so backup the current computer and redeploy it as a new computer while restoring the settings and documents. This will enable you to turn on UEFI+SecureBoot and any other new features you desire.

If you do a normal in-place upgrade there is currently no way of switching from Legacy BIOS to UEFI and thus you will not be able to use all the new cool features of Windows 10.

Q: how do you prevent Windows 10 from automatically uninstalling software it deems “not compatible” when doing Windows update? Example: Cisco VPN client app, when updating versions (i.e. 1507->1511)
A: Don’t use Windows Update, use sequencing instead. Either with MDT or SCCM. That way you can control before, during and after. Giving you the tools you need to get the job done. In this case making sure the software is reinstalled or upgrade as part of the in-place upgrade.

A good starting point can be found here http://deploymentresearch.com/Research/Post/533/Improving-the-ConfigMgr-Inplace-Upgrade-Task-Sequence

Q: For the in-place upgrade Task Sequence, is it possible to add Cumulative Update to the image rather than adding the CU to the TS? Running a Cumulative Update during the TS adds a lot of time to the deployment.
A: Yes, you can add both CUs and Security fixes to a install.wim file. That is fully supported. However, as it will use offline servicing to do so the patches won’t be installed until the machine is booted up and during the initial boot they will install. This will take the same amount of time as adding them as applications during the TS.

Q: Which OSs are supported by MDT 8443?
A: Windows 7 and forward. Note that MDT 8443 requires ADK1607 and that ADK has issues with Windows 7 and driver injection when running on SSD drives.

Q: Is the best way to customize default pinned apps in the Win 10 task bar still via a run-once logon script?
A: No, use the start and taskbar layout xml file instead. More info on that can be found here https://technet.microsoft.com/en-us/itpro/windows/manage/windows-10-start-layout-options-and-policies

Note that taskbar pinning using xml requires Windows 10 1607.

Q: Have you seen any new hardware components with no Win7 drivers?
A: Yes, not all new models support Windows 7. This is due to instruction sets in some of the Skylake CPUs by Intel. Most vendors have a number of models/configurations that do support Windows 7 still. Expect this to diminish now that Kaby Lake is out and going forward with new CPUs.

Q: With Win 7/8.1 we would use Copyprofile, configure items in the captured image, and that worked great. Since Copyprofile is a no-go with Win10 it seems, what is the best approach going forward? WICD? Don’t configure in captured image, but apply during deployment TS?
A: Microsoft is moving towards less IT configuration and more personal configuration by end-users. This makes it less worthwhile doing customizations but when you need to do them you have a couple of options. Do the in the deployment TS or use GPOs. Since in-place upgrade is going to be the way between versions and you can’t customize the install.wim file moving them elsewhere will be needed.

Q: Is it better to remove Appx packages from win 10 via a powershell script during OS deployment, or via applocker (so that they never get installed for the users) anyone have experience/comparison to both
A: Removing Appx packages can only be done with PowerShell. Applocker will not remove them only block them from being used. If you want to scale down on the apps make sure to remove AppX packages and the AppX provisioned packages.

Q: Why don’t use ConfigMgr for reference images?
A: Until very recently that was not an option due to the fact that ConfigMgr will install the client as part of deployment and we want to avoid that. We still prefer MDT due to the fact its smaller, needs to infrastructure to work, its much faster and you also get a profile that can be customized to some extent.

Q: In your experience, has anyone needed hardware upgrades to go from win7 to win10? Or are real-world HW requirements the same?
A: This is a split question. If a model is supported no they won’t need an upgrade x64 requirements for Windows 7 and 10 are the same. Windows 10 will even be kinder to your hardware giving you more bang for your buck.

The thing to lock out for is of course that old models might not be vendor supported for Windows 10 and a lot of older models does not support full UEFI. Thus, for those models you won’t be able to turn on features like, Device guard and Credential guard.

Q: Would MDT Version: 6.2.5019.0 work with Win 1607, if I was to start testing deployment?
A: No, you will need a newer ADK and that is not supported with the old versions of MDT. The newer version of MDT also contains a massive amount of bugfixes so make sure to upgrade MDT instead.

Q: Does CM1610 with MDT 8443 support ADK 1511? I ask because we have to use 802.1x port authentication in our boot images and that is broken in ADK 1607.
A: Kind of, 1606 does support ADK1511 and I have not seen statements that 1610 requires ADK1607 to work. Its more a question on which OS you want to deploy. Check the link for support statement on ADK and ConfigMgr from the Microsoft Team.
https://blogs.technet.microsoft.com/enterprisemobility/2016/09/09/configuration-manager-and-the-windows-adk-for-windows-10-version-1607/

Q: What was the package to add for Win 10 v1607 in MDT to fix WU issue?
A: Make sure to add the latest CU for November that is KB 3200970 http://support.microsoft.com/?kbid=3200970 together with servicing stack update KB3199986 https://support.microsoft.com/en-us/kb/3199986

Q: Adding the CU via a Package, but it still appears to download it from WU. Also, tried to add it the image via DISM, but same result. Any suggestions on how to prevent it from downloading?
A: This is a known issue that can be read from the KB article. To avoid it install them as applications before the first Windows Update step runs.

Q: KB3197954 is superseded so just add in the next Cumulative Update for Windows 10 Version 1607? do the next one have a working WU agent or do a first need to install this one?
A: No, all CUs contains all the previous month’s patches so the latest one will cover everything you need.

Q: What could we expect roadmap wise, with MDT and SCCM, compared to roadmap of Win 10? Will MDT / SCCM keep up?
A: Both ConfigMgr and MDT is dedicated to staying current with Windows 10. This means that MDT will be updates when needed for deployment and ConfigMgr will get continues releases to add features and fix bugs. Just this year we have seen 3 production releases of ConfigMgr (1602, 1606 and 1610)

Q: What’s the top benefits using MDT+ConfigMgr together?
A: MDT adds about 280 built-in features through scripts. You may of course build that yourself using native ConfigMgr but I have more fun things to do with my time. And if you build them yourself you will have to support them. MDT on the other hand is supported by Microsoft.

Q: Do you recommend custom Windows10 images and what is your go to image creation tool?
A: Always use MDT for reference image creation. I recommend using custom images for bare metal deployment so you can add in things your end users will need, like Visual C++ runtimes and .Net Framework. For upgrades, custom images are not supported so you will need both.

Q: When creating a W10 ref image, would you recommend applying the latest CU offline or online?
A: Both work but if you want to save time do them online otherwise it will redownload the patch to apply certain things again.

Q: Deploying with 1607 ADK working with win 7 deployment?
A: There is one big issue using the ADK 1607. Driver injection on Windows 7 with ADK1607 will fail when running on SSD drives. Using a ADK1511 boot image will solve that issue.

 

Hope this has helped you out with your deployments

/Peter

ConfigMgr–Extending Hardware Inventory

So if you are using ConfigMgr you probably know that you can extend hardware inventory to inventory pretty much anything. The cool thing is that by almost default there are two classes that are really nice to have.

The first being Win32_QuickFixEngineering which is a WMI class listing all installed patches. Having that inventoried means you can build collections based on missing or certain patches installed which when it comes to critical patches or hotfixes are really nice.

The second is a kind of custom class and its called Microsoft_BDD_Info and it is created by ZTITatoo.wsf when you deploy a computer with either MDT or ConfigMgr with MDT integration. This includes a bunch of information from the deployment. For instance it lists which sequence ID was run and the timestamp. So if you inventory this you can keep collections based on what sequences was used and if you have a nice version control in your sequence you now find all your computer that where deployed with a certain version of sequence.

So how do you enable this awesomeness? Well its pretty simple. Fire off your ConfigMgr console and check under Administration and Client settings. You will have a setting called Default Client Settings. Open it up and on the left hand click Hardware inventory. Next click the button to the right where it says Classes. You will be presented with a long list of WMI classes that can be enabled and disabled. At the top just do a search for “Quick” and select the class Win32_QuickFixEngineering.

QuickFix

To enabled the second class a bit more work is required but don’t worry it is not hard. Go back to the client settings (if you left it) and click the Add button seen at the bottom (look at the image above for guidance). You now need to connect to a computer that has been deployed using MDT/ConfigMgr+MDT so click the connect button and type in the computer name and credentials if needed.

HardwareClass

When connected you will see all the WMI classes available on that computer. Just find the one called Microsoft_BDD_Info and select it and click OK when done.

BDD_info

So now they have both been selected and you have saved the Clients Settings by clicking OK all the way out. Now all that remains is waiting for the next hardware inventory to complete and you can start using the values collected.

Happy deploying!

/Peter