Well there are 2 Programs folders and one of them is protected by UAC starting with Windows Vista.
For items stored in %appdata%\Microsoft\Windows\Start Menu\Programs, you can right click on a folder icon, select Properties, select Customize, click on "Change icon" and select an icon.
But 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 if you use the desktop.ini method. That is because Microsoft doesn't easily allow Explorer.exe to be elevated (which is the process responsible for changing icon from the Properties).
Also, changing folder icon manually is a very tedious process because it requires modifying desktop.ini with elevated permissions *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. So basically, changing icons for UAC protected folders is only for advanced users.
To simplify the whole process, I use a commercial app to effortlessly change icons from the context menu. It is called Microangelo OnDisplay (
http://www.microangelo.us/mod.asp). 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. But it has an Evaluation version:
http://microangelo.us/free-icon-editor-download.asp and I don't think the folder icon changing feature expires even if the Evaluation expires because it is a shell extension.
This is how On Display's Shell extension looks: