Changing icons for non-UAC protected folders works by right clicking the folder -> Properties -> Customize tab.
Changing icons for folders protected by User Account Control has been made extremely hard ever since Windows Vista. For folders which are protected by UAC (such as the folders inside C:\ProgramData\Microsoft\Windows\Start Menu\Programs), you need to elevate the program which changes the icon using the desktop.ini method. However, Microsoft doesn't easily allow Explorer.exe to be elevated (which is the process responsible for changing icon from the Properties).
Also, changing icon manually is a very tedious process because it requires modifying desktop.ini with elevated permissions again and setting the right attributes for the folder (for Explorer to show the icon correctly). Finally, a bug in the Explorer shell introduced ever since Vista causes icons to not refresh correctly unless some undocumented API function is called.
I use a commercial app to effortlessly change icons from the context menu. It is called Microangelo OnDisplay:
https://shopper.mycommerce.com/checkout/product/15248-3 It does all the hard work of correctly modifying desktop.ini in elevated mode for UAC protected folders, setting the right folder attributes and refreshing the icon cache. OnDisplay also has an excellent icon handler shell extension so it can change literally any Windows icon, gives you control over icon overlays etc. But at $25, it doesn't exactly offer much value though. Should've been priced $3 or $5 at most.