Office365 ProPlus changed shortcut names -> Old Windows 10 custom StartLayout.xml breaks

Blog updated 12.4.2018 Added DesktopApplicationID to StartLayout. Thanks Steven Kister for tip.

I noticed this earlier with Windows 10 RS4 (1803) testing but now I noticed this with Windows 10 1709 using updated Office media.

New Office365 ProPlus version has changed shortcut names from Excel 2016.lnk to Excel.lnk. Shortcut name doesn't have year numbers anymore.

Except OneNote 2016.lnk is still same shortcut name in old and new version. This applies at least to Office-version 1803 (9126.2116) Monthly channel.

This broke my existing StartLayoutCustomization.xml so I needed to update these to my deployments.

Here are new shortcut names which Export-StartLayout -cmdlet exports:

        <start:Group Name="Office 2016">
          <start:DesktopApplicationTile Size="2x2" Column="2" Row="0" DesktopApplicationLinkPath="%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\Excel.lnk" />
          <start:DesktopApplicationTile Size="2x2" Column="2" Row="2" DesktopApplicationLinkPath="%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\OneNote 2016.lnk" />
          <start:DesktopApplicationTile Size="2x2" Column="4" Row="2" DesktopApplicationLinkPath="%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\Outlook.lnk" />
          <start:DesktopApplicationTile Size="2x2" Column="4" Row="0" DesktopApplicationLinkPath="%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\PowerPoint.lnk" />
          <start:DesktopApplicationTile Size="2x2" Column="0" Row="2" DesktopApplicationLinkPath="%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\Skype for Business.lnk" />
          <start:DesktopApplicationTile Size="2x2" Column="0" Row="0" DesktopApplicationLinkPath="%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\Word.lnk" />
        </start:Group>

Old syntax was:

        <start:Group Name="Office 2016">
          <start:DesktopApplicationTile Size="2x2" Column="2" Row="0" DesktopApplicationLinkPath="%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\Excel 2016.lnk" />
          <start:DesktopApplicationTile Size="2x2" Column="2" Row="2" DesktopApplicationLinkPath="%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\OneNote 2016.lnk" />
          <start:DesktopApplicationTile Size="2x2" Column="4" Row="2" DesktopApplicationLinkPath="%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\Outlook 2016.lnk" />
          <start:DesktopApplicationTile Size="2x2" Column="4" Row="0" DesktopApplicationLinkPath="%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\PowerPoint 2016.lnk" />
          <start:DesktopApplicationTile Size="2x2" Column="0" Row="2" DesktopApplicationLinkPath="%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\Skype for Business 2016.lnk" />
          <start:DesktopApplicationTile Size="2x2" Column="0" Row="0" DesktopApplicationLinkPath="%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\Word 2016.lnk" />
        </start:Group>

Problem using shortcut names is that now we have 2 StartLayout files and we might have different versions of Office in Windows.

Real fix is to use DesktopApplicationID in StartLayout just like Microsoft says in documentation too (https://docs.microsoft.com/en-us/windows/configuration/customize-and-export-start-layout):

If the Start layout that you export contains tiles for desktop (Win32) apps or .url links, Export-StartLayout will use DesktopApplicationLinkPath in the resulting file. Use a text or XML editor to change DesktopApplicationLinkPath to DesktopApplicationID. See Specify Start tiles for details on using the app ID in place of the link path.

We can export AppIDs in Powershell with command: Get-StartApps
and to show only Office apps we use command: get-startapps |where {$_.AppID -like "*Office*" }

New XML using DesktopApplicationID looks like:
        <start:Group Name="Office 2016">
          <start:DesktopApplicationTile Size="2x2" Column="2" Row="0" DesktopApplicationID="Microsoft.Office.EXCEL.EXE.15" />
          <start:DesktopApplicationTile Size="2x2" Column="2" Row="2" DesktopApplicationID="Microsoft.Office.ONENOTE.EXE.15" />
          <start:DesktopApplicationTile Size="2x2" Column="4" Row="2" DesktopApplicationID="Microsoft.Office.OUTLOOK.EXE.15" />
          <start:DesktopApplicationTile Size="2x2" Column="4" Row="0" DesktopApplicationID="Microsoft.Office.POWERPNT.EXE.15" />
          <start:DesktopApplicationTile Size="2x2" Column="0" Row="2" DesktopApplicationID="Microsoft.Office.lync.exe.15" />
          <start:DesktopApplicationTile Size="2x2" Column="0" Row="0" DesktopApplicationID="Microsoft.Office.WINWORD.EXE.15" />
        </start:Group>

Here are links for example StartScreenlayout.xml which I use in Educational cases.
Old Office-version StartLayoutCustomization.xml
New Office-version StartLayoutCustomization.xml using DesktopApplicationID
New Office-version StartLayoutCustomization.xml using updated shortcut names

Few thoughts on this issue. Office 2019 is coming soon. I would guess Office AppIDs will change at that time so using AppID now may not work in future, but it will work now with old and newer Office-version. Updated shortcuts names could work with Offie 2019. OneNote shortcut name is not updated at this time so this probably also needs to be updated in future or now (depending if we use AppID or shortcut name now).

So whatever we choose now we may need to build new XML file when new Office 2019 is released which is ok because that is a big update.

This example also configures Taskbar icons so this is good example to modify your own startlayout. Remember with your own Taskbar layout modifications to add Taskbar specification also into the first row in XML if you export reference layout with Export-StartLayout -command.

<LayoutModificationTemplate xmlns:defaultlayout="http://schemas.microsoft.com/Start/2014/FullDefaultLayout" xmlns:start="http://schemas.microsoft.com/Start/2014/StartLayout" Version="1" xmlns="http://schemas.microsoft.com/Start/2014/LayoutModification" xmlns:taskbar="http://schemas.microsoft.com/Start/2014/TaskbarLayout">

I always save picture with StartLayoutCustomization.xml.

 

Powershell Windows Driver Management tools

All IT Pros should know cool tools for Modern Driver Management. These tools can automate driver packages for HP, Dell and Lenovo Enterprise workstation models.

However we may need to do driver packages to models which don't have driver packages provided by OEMs.

Here my just released tools will help admins to do driver packages easily. You can find files from my GitHub.

In Powershell we have cmdlet Export-WindowsDriver which will export all 3rd party drivers. Problem with this approach is that it exports all 3rd party drivers in computer (whether used or not) and all inf-files are in one folder so it's hard to see what each actually are.

 Folder structure made by Export-WindowsDriver cmdlet

Folder structure made by Export-WindowsDriver cmdlet

I wanted to categorize drivers and detect drivers which are not used. Or, detect drivers which don't have device. Export_drivers.ps1 exports 3rd party drivers, categorize drivers and detect drivers which are not used.

End result looks like

 Drivers in each categories

Drivers in each categories

Directory _DriversWithoutExistingDevice has all the drivers which are not used at the moment. Usually these are not needed but some might be. For example some HP models shows SD Card device only when SD Card is in place. So that SD Card driver needs to copied with others.

With this approach I have made driver packages for tens of computers models which doesn't have OEM provided driver packages.

Workflow goes like this:
- Install Windows 10 or start new computer (or use even existing installation)
- Update computer to latest patches and drivers
- Export drivers with Export_drivers.ps1
- Decide what to do with _DriversWithoutExistingDevice drivers (I usually move these away, not delete but not include with driver package)
- Make driver package, test new installation and go to production

There are 2 other scripts which tests if driver installation is done as you intended. These scripts will compare driver installation information from baseline and installed computers. In reality scripts will compare Win32_pnpsigneddrivers wmi-class. Export_drivers.ps1 makes these automatically but you can make those manually with command:

Get-WmiObject Win32_pnpsigneddriver | Export-CliXml -Path ".\$((Get-WmiObject -Class win32_computersystem).Manufacturer) $((Get-WmiObject -Class win32_computersystem).Model) Win32_pnpsigneddriver.xml"

Driver comparison script is made because sometimes Windows decides to install wrong driver (usually Microsoft driver) to some devices. We need to easily test that our driver installation end result is working as it should. Comparison script will tell if some driver has different Manufacturer. It is ok to have different driver version but Manufacturer should always be same.

I will open functionality of these tools on other blog posts. Also I have some ideas for OEM Driver Packages :)