By far the biggest complaint with Windows 8 was the removal of the start menu, and accordingly, it being added back is the most noticeable change with Windows 10. As it turns out though, the start menu in Windows 10 marks a very drastic design change behind the scenes, one that frankly is more significant from an administrator’s standpoint than the mostly aesthetic changes introduced with Windows 8.
There are a lot of “Customize the Win 10 Start Menu” articles out there, but almost all talk about how to make changes using the user interface. Obviously as an admin we need systematic ways of do that through group policies, scrips, etc.
As a school, we try to create a consistent user experience across all our devices. After all, staff and students typically log on to multiple computers over the course of a day. One of the ways we have done that since Windows 2000 was to redirect the start menu to a network share. This has the benefit of supplying the same menu of programs regardless of the computer being used. The user also cannot make any changes to the start menu. Even on Windows 8/8.1 this worked pretty well. I touched on that here.
Windows 10 is completely different, and if you currently redirect the start menu on any prior version of Windows, you are going to have to make significant changes to how you approach doing so.
The first thing to understand is that the “All apps” feature on the start menu is actually a database of applications and shortcuts installed on the system. Keep it in mind; this will come into play later.
Both Windows 10 Enterprise and Windows 10 Education support customizing the start menu via group policy. In theory you create a reference start menu, export it via PowerShell, then assign it via group policy as desired. In reality, that doesn’t work so well. When we tested it we found many of the pinned items were simply missing from the start menu. And thus began – as one of my colleagues likes to call it – the “trip down the rabbit hole” to find out what was happening.
A quick note…most of the below are things I can’t verify through a 3rd party; there simply is no information out there. Nearly everything here is a result of my own testing and some best-guess conclusions, and I’ll concede that some of it defies logic – yet it’s what I found. Take that as you will and please comment if you have anything to add.
Anyway…let’s start by looking at some sample XML generated by the export-startlayout PowerShell command:
<LayoutModificationTemplate Version=”1″ xmlns=”http://schemas.microsoft.com/Start/2014/LayoutModification”>
<DefaultLayoutOverride>
<StartLayoutCollection>
<defaultlayout:StartLayout GroupCellWidth=”6″ xmlns:defaultlayout=”http://schemas.microsoft.com/Start/2014/FullDefaultLayout”>
<start:Group Name=”” xmlns:start=”http://schemas.microsoft.com/Start/2014/StartLayout”>
<start:Tile Size=”2×2″ Column=”2″ Row=”0″ AppUserModelID=”Microsoft.WindowsCalculator_8wekyb3d8bbwe!App” />
<start:DesktopApplicationTile Size=”2×2″ Column=”0″ Row=”2″ DesktopApplicationID=”C:\Apps” />
<start:Tile Size=”2×2″ Column=”4″ Row=”2″ AppUserModelID=”Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge” />
<start:DesktopApplicationTile Size=”2×2″ Column=”0″ Row=”4″ DesktopApplicationID=”{7C5A40EF-A0FB-4BFC-874A-C0F2E0B9FA8E}\Microsoft Office\Office16\EXCEL.EXE” />
<start:DesktopApplicationTile Size=”2×2″ Column=”4″ Row=”4″ DesktopApplicationID=”{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\mspaint.exe” />
</start:Group>
<start:Group Name=”” xmlns:start=”http://schemas.microsoft.com/Start/2014/StartLayout”>
<start:DesktopApplicationTile Size=”2×2″ Column=”2″ Row=”2″ DesktopApplicationID=”{6D809377-6AF0-444B-8957-A3773F02200E}\Windows Media Player\wmplayer.exe” />
<start:DesktopApplicationTile Size=”2×2″ Column=”4″ Row=”2″ DesktopApplicationID=”Microsoft.InternetExplorer.Default” />
</start:Group>
</defaultlayout:StartLayout>
</StartLayoutCollection>
</DefaultLayoutOverride>
</LayoutModificationTemplate>
The official Microsoft documentation for working with this XML is here and you’ll definitely want to review it, but to touch on a few important items:
AppUserModelID – This is for Metro (App Store) apps. The pins for these seem to work all the time.
DesktopApplicationID – In theory this type of link works for file paths, shortcuts, or executables. In reality it only seems to work reliably for shortcut (.lnk) files.
Anyway, some basic testing revealed at least one problem pretty quickly. If the target of an item pinned to the start menu is not present on the system when the start menu loads, the pin will disappear. So consider a situation where a user logs on to a fresh machine that hasn’t finished installing Microsoft Office. Their pin for Excel (as shown in the XML above) will be missing. What’s worse, it will never come back, even when Office gets installed. The only way to get the pin to appear is to delete the user’s profile and allow a new profile to be created. This seriously complicates things as it means you’ve got one single chance to have a user’s start menu display properly.
The problem seems to be the start layout import/export is designed more for a situation where you are creating a reference image, preloaded with software. In our case we do all of our software installations via group policy as needed, so the software installed on a given machine can vary and there’s likewise no guarantee that a piece of software will be installed the second the machine is finished being imaged.
Early testing showed a few other important things:
-
If there are any errors in the XML, Windows will ignore it entirely and revert to the user’s prior start menu, whether that was a previously valid custom one, or the default out-of-box start menu.
- Adding comments to the XML likewise results in the start layout being ignored. (This in fairness is mentioned in the MS documentation.)
After a lot of further testing, trial, and error, we’ve determined the following:
-
You can only pin items that are present in “all apps.”
-
The “all apps” database is generated only
at boot-up, and is generated from the items found in the user’s profile plus the “all users” profile, in these two location:- %APPDATA%\Microsoft\Windows\Start Menu\Programs\
- %ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\
There is clearly some logic that causes the database to be rebuilt when a new program is installed, but that does not seem to be exposed at all to the end user, so for all practical purposes if you want to add an item to “all apps” programmatically, it requires a reboot after adding the item to one of the above paths.
-
As mentioned earlier, if an item that is not found in the “all apps” database is pinned to a custom start menu layout, the pin will disappear, never to be seen again without deleting the user’s profile.
-
Directly linking to EXEs is not reliable. It’s not clear why this is, but it’s better to pin a shortcut to the EXE. To clarify, if you want to pin an EXE, you should instead create a shortcut to that EXE, get the shortcut in “all apps” and then pin that shortcut to the start menu.
-
Attempting to pin a path does not appear to work across users. It’s not clear why this is. I resorted to a very convoluted method: writing a short C# app that opened the desired path, then linking to a shortcut to that EXE. It’s a crazy method but the only way I could get to consistently work.
- The link to “Microsoft.InternetExplorer.Default” works inconsistently as well. I found it better to create a shortcut to IE and pin that to the start menu.
-
Here’s a very strange one…If you redirect the start menu (i.e. the pre-Win 10 way), items pinned to the Win 10 start menu are unreliable. Win 10 sometimes seems to take the shortcut from the local “all apps” and other times from the redirected start menu. You must turn off redirection for Win 10 devices to reliably use the customized start menu layouts.
- You must also disable the group policy “Remove common program groups from Start Menu,” otherwise the “all users” profile items will not be loaded into the user’s all apps database, resulting in missing pins.
There are a lot of moving pieces here, but by following the above we’ve been able to create a custom start menu layout that works the way we need it to. Hope this helps!
Winding up to a deployment of Windows 10 in an enterprise environment, and this was excellent information to have in advance. Thanks for the work putting this together.
LikeLike
I’m glad you found this useful, and thanks for the comment.
LikeLike
The below was sent to me via e-mail, and I wanted to pass it along in case anyone wants to test it out. I haven’t had a chance to do so but will update this post if / when I do.
—
Pinning a path across users: explorer.exe /e, “c:\the\path”
Also, have you tried restarting explorer.exe to rebuild the app menu database after the machine is already booted?
Finally, you can create pinned shortcuts on a per-user basis through:
%USERPROFILE%\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar %USERPROFILE%\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\StartMenu
LikeLike
Hey I found the culprit behind all these errors! The thing is that, for the tiles to be added or removed, the tile shortcuts must first be added or removed from the “All Apps” database view of each of the target users, before exporting the layout to xml and applying it for the update.
What one has to do is add or remove all “.lnk” shortcuts (set as tiles on the start screen) to or from “All users\Microsoft\Windows\Start Menu\Programs” folder of the target computer. This makes the required shortcuts available to each of the target users on that target computer.
Then one is required to login to each target user, one by one, for whom the start screen is applied and open the “All Apps” view of each one. Wait until all the newly added or removed “.lnk” shortcuts show up on or disappear from “All Apps” database view for each target user. This can be done for updating a previously existing Start layout for all these users also.
Then login to any profile from which you wish to arrange and customize the Start layout and export it as xml. When the xml Start Layout GPO is applied, all the shortcuts that are present in the “All Apps” database view of the target users are going to show up flawlessly in the applied Start layout for those users.
And no, there is no need to get this right the first time, or to delete any profile if anything went wrong. Any missing tiles in any of the profiles can be obtained back by repeating the above steps, and then exporting the layout, just once, for every update of the Start layout for all the users, and then logging in to the target profiles.
Thanks to the instructions from the admins on this site I stumbled upon the answer accidentally while trying to fix my system. Cheers! 🙂
LikeLike
Thanks for the comment and I’m glad you found this information helpful.
The key difference between how you seem to be approaching things and the way we do here is we are not (and cannot) log on as each target user. We have hundreds of people using each computer so this is simply impossible, and honestly it should not be necessary if the shortcuts are present in the proper locations.
LikeLike
Hi James,
I am trying to link a vbsscript in my start menu. I created a shortcut in C:\ProgramData\Microsoft\Windows\Start Menu\Programs, but unfortunately this is the only link that doesn’t appear in the start menu. You explained that you wrote a short C# app that opened a path. Is this also possible for a vbsscript?
LikeLike
I am somewhat surprised you’re having an issue with this particular scenario. Presumably you’re calling cscript.exe and passing the script itself as a parameter. I ran into issues when the application being called wasn’t present on the target machine when the profile was generated. Since cscript itself is part of a base Windows install I wouldn’t expect that to pose a problem.
You said you created a shortcut. What does the shortcut point to?
You might want to try linking to a shortcut calling a batch file that runs cscript as an alternative.
LikeLike
Thanks for your reply. The shortcut points to a unc path that is located on my server. I’m going to give your batch idea a try, thanks!
LikeLike
Unfortunately this doesn’t work either. I now have created a link in C:\ProgramData\Microsoft\Windows\Start Menu\Programs that points to a batch file that is located in C:\Program Files\shortcut. But still it doesn’t appear in the start menu.
LikeLike
Eventually I solved my problem by creating a .exe of the batch script that will call my vbs script on the server. Now the shotcut in C:\ProgramData\Microsoft\Windows\Start Menu\Programs that points to the created .exe works fine in my start menu. I used Iexpress.exe to wrap my batch file into an .exe file.
LikeLike
Glad you got it working. Thanks for the follow-up.
LikeLike
First of all full marks for researching this. I know this post is a little bit dated but I did find something else that might address this too. It is not my idea, I found it on another post, I had to modify it a little for my environment, and haven’t fully tested it yet, but initial trials seem promising.
The other link recommended going to HKCU\Software\Microsoft\Windows\currentversion\explorer and adding the following DWORD “SpeicialRoamingOverrideAllowed” with a decimal value of 1.
This didnt work for me but adding the same regkey to HKLM\Software\Microsoft\windows\currentversion\explorer
The above is supposed to address this when your are using a redirected start menu in WIN10 AND a roaming profile, (which we have to to support some legacy applications). My environment is non persistent Citrix VDI and is similar to the School, requirements Mr. Prudente talked about
LikeLike
Very interesting. We’re not using a roaming profile but we are redirecting the user’s document folder, so perhaps the same issue comes into play. It’s crazy how there are all these little quirks we as admin have to work around. Thanks for the feedback.
LikeLike
Windows 10 is “raw sewage theater”, I am POSITIVE that MS is trying to abandon its traditional enterprise management pieces and force everyone to run cloud based. The world had a good, working, understood, business class OS, and now they’re turning it into a chromebook.
In this particular case I THINK what is happening is in order to fake everyone out and make Win10 look like its loading faster, its loading an incomplete desktop and expecting it to catch up. Sometimes it does, but when it doesn’t it doesn’t.
LikeLike
Can’t argue with a thing you’re saying. Case in point, I am trying to buy some WIn 10 licenses to use with a VMWare VDI setup. MS can’t figure out how to sell them to me. All I get is “use Azure.” That’s not what I’m asking!
LikeLike
Oh and additionally you need to have AlwaysWaitForNetwork at Logon enabled in GP.
LikeLike