• 0

C#: Get path of Start Menu programs (All USERS)


Question

hi guys

does anyone know how can i get the path of the start menu under All Users (X:\Documents and Settings\All Users\Start Menu\Programs) ?

i tried :

DirectoryInfo di = new DirectoryInfo(System.Environment.G? etFolderPath(Environment.SpecialFo? lder.Programs));

but that only gives the Path for current user. How can i get to the All Users start menu?

12 answers to this question

Recommended Posts

  • 0

The built-in .Net methods are underdeveloped, IMO. Use WinAPI.

See here for the function SHGetSpecialFolderPath, and a link to the list of CSIDL's you can use.

http://msdn2.microsoft.com/en-us/library/ms647816.aspx

Here's the function import and a sample on how to use it:

[DllImport("shell32.dll")]
static extern bool SHGetSpecialFolderPath(IntPtr hwndOwner,
   [Out] StringBuilder lpszPath, int nFolder, bool fCreate);

const int CSIDL_PROGRAMS = 2;  // \Windows\Start Menu\Programs
StringBuilder path = new StringBuilder(260);
SHGetSpecialFolderPath(IntPtr.Zero, path, CSIDL_PROGRAMS, false);
// path.ToString() should now hold the path

Here's the full list of CSIDL's from ShlObj.h

const int CSIDL_DESKTOP 					= 0x0000;		// <desktop>
const int CSIDL_INTERNET					= 0x0001;		// Internet Explorer (icon on desktop)
const int CSIDL_PROGRAMS					  = 0x0002;		// Start Menu\Programs
const int CSIDL_CONTROLS					  = 0x0003;		// My Computer\Control Panel
const int CSIDL_PRINTERS					  = 0x0004;		// My Computer\Printers
const int CSIDL_PERSONAL					  = 0x0005;		// My Documents
const int CSIDL_FAVORITES				 	= 0x0006;		// <user name>\Favorites
const int CSIDL_STARTUP				   	= 0x0007;		// Start Menu\Programs\Startup
const int CSIDL_RECENT					  = 0x0008;		// <user name>\Recent
const int CSIDL_SENDTO					  = 0x0009;		// <user name>\SendTo
const int CSIDL_BITBUCKET				   = 0x000a;		// <desktop>\Recycle Bin
const int CSIDL_STARTMENU				   = 0x000b;		// <user name>\Start Menu
const int CSIDL_MYDOCUMENTS				 = CSIDL_PERSONAL; //  Personal was just a silly name for My Documents
const int CSIDL_MYMUSIC					 = 0x000d;		// "My Music" folder
const int CSIDL_MYVIDEO					 = 0x000e;		// "My Videos" folder
const int CSIDL_DESKTOPDIRECTORY			= 0x0010;		// <user name>\Desktop
const int CSIDL_DRIVES					  = 0x0011;		// My Computer
const int CSIDL_NETWORK					 = 0x0012;		// Network Neighborhood (My Network Places)
const int CSIDL_NETHOOD					 = 0x0013;		// <user name>\nethood
const int CSIDL_FONTS					   = 0x0014;		// windows\fonts
const int CSIDL_TEMPLATES				   = 0x0015;
const int CSIDL_COMMON_STARTMENU			= 0x0016;		// All Users\Start Menu
const int CSIDL_COMMON_PROGRAMS			 = 0x0017;		// All Users\Start Menu\Programs
const int CSIDL_COMMON_STARTUP			  = 0x0018;		// All Users\Startup
const int CSIDL_COMMON_DESKTOPDIRECTORY	 = 0x0019;		// All Users\Desktop
const int CSIDL_APPDATA					 = 0x001a;		// <user name>\Application Data
const int CSIDL_PRINTHOOD				   = 0x001b;		// <user name>\PrintHood
const int CSIDL_LOCAL_APPDATA			   = 0x001c;		// <user name>\Local Settings\Applicaiton Data (non roaming)
const int CSIDL_ALTSTARTUP				  = 0x001d;		// non localized startup
const int CSIDL_COMMON_ALTSTARTUP		   = 0x001e;		// non localized common startup
const int CSIDL_COMMON_FAVORITES			= 0x001f;
const int CSIDL_INTERNET_CACHE			  = 0x0020;
const int CSIDL_COOKIES					 = 0x0021;
const int CSIDL_HISTORY					 = 0x0022;
const int CSIDL_COMMON_APPDATA			  = 0x0023;		// All Users\Application Data
const int CSIDL_WINDOWS					 = 0x0024;		// GetWindowsDirectory()
const int CSIDL_SYSTEM					  = 0x0025;		// GetSystemDirectory()
const int CSIDL_PROGRAM_FILES			   = 0x0026;		// C:\Program Files
const int CSIDL_MYPICTURES				  = 0x0027;		// C:\Program Files\My Pictures
const int CSIDL_PROFILE					 = 0x0028;		// USERPROFILE
const int CSIDL_SYSTEMX86				   = 0x0029;		// x86 system directory on RISC
const int CSIDL_PROGRAM_FILESX86			= 0x002a;		// x86 C:\Program Files on RISC
const int CSIDL_PROGRAM_FILES_COMMON		= 0x002b;		// C:\Program Files\Common
const int CSIDL_PROGRAM_FILES_COMMONX86	 = 0x002c;		// x86 Program Files\Common on RISC
const int CSIDL_COMMON_TEMPLATES			= 0x002d;		// All Users\Templates
const int CSIDL_COMMON_DOCUMENTS			= 0x002e;		// All Users\Documents
const int CSIDL_COMMON_ADMINTOOLS		   = 0x002f;		// All Users\Start Menu\Programs\Administrative Tools
const int CSIDL_ADMINTOOLS				  = 0x0030;		// <user name>\Start Menu\Programs\Administrative Tools
const int CSIDL_CONNECTIONS				 = 0x0031;		// Network and Dial-up Connections
const int CSIDL_COMMON_MUSIC				= 0x0035;		// All Users\My Music
const int CSIDL_COMMON_PICTURES			 = 0x0036;		// All Users\My Pictures
const int CSIDL_COMMON_VIDEO				= 0x0037;		// All Users\My Video
const int CSIDL_RESOURCES				   = 0x0038;		// Resource Direcotry
const int CSIDL_RESOURCES_LOCALIZED		 = 0x0039;		// Localized Resource Direcotry
const int CSIDL_COMMON_OEM_LINKS			= 0x003a;		// Links to All Users OEM specific apps
const int CSIDL_CDBURN_AREA				 = 0x003b;		// USERPROFILE\Local Settings\Application Data\Microsoft\CD Burning
const int CSIDL_COMPUTERSNEARME			 = 0x003d;		// Computers Near Me (computered from Workgroup membership)
const int CSIDL_FLAG_CREATE				 = 0x8000;		// combine with CSIDL_ value to force folder creation in SHGetFolderPath()
const int CSIDL_FLAG_DONT_VERIFY			= 0x4000;		// combine with CSIDL_ value to return an unverified folder path
const int CSIDL_FLAG_DONT_UNEXPAND		  = 0x2000;		// combine with CSIDL_ value to avoid unexpanding environment variables
const int CSIDL_FLAG_NO_ALIAS			   = 0x1000;		// combine with CSIDL_ value to insure non-alias versions of the pidl
const int CSIDL_FLAG_PER_USER_INIT		  = 0x0800;		// combine with CSIDL_ value to indicate per-user init (eg. upgrade)

Note that this was quickly converted from the C++ headers to C#, so there may be simple formatting errors, but all of the data is correct.

Edited by jimbo11883
  • 0

Environment.GetEnvironmentVariable("ALLUSERSPROFILE")

return a string "DRIVE:\Documents and Settings\All Users" (from wikipedia), from there you should beable to get to the StartMenu\Programs

It doesnt work for me but im on Vista, all i get is an hidden folder called ProgramData.It might work on XP.

if not then switch "ALLUSERSPROFILE" with "HOMEDRIVE" and you will get just the drive windows is install on example "C:\" from there you can work your way to where you want to go.

Edited by Doli
  • 0
  On 27/01/2010 at 15:41, garethevans1986 said:

Dude this is like 2 years old!

yeah i know, but google found it when i was searching for this solution....

the code that i sent are only usable if you're looking for the user folders, if you need the Common folders, read this:

http://www.codeproject.com/KB/winsdk/SpecialFolders.aspx

  • 0
  On 27/01/2010 at 11:38, Tufo said:

I know its a late reply, but for ppl that find this post on google (like me) its quite simple to find the start menu folder:

String startMenuPath = Environment.GetFolderPath(Environment.SpecialFolder.StartMenu);

That returns the path for the current user's start menu startup.

  On 27/01/2010 at 15:41, garethevans1986 said:

Dude this is like 2 years old!

He apologized for the late reply and contributed something, what's the problem?

Thanks Tufo, I'm just working through the same problem. I think Jimbo's method is probably most reliable.

  • 0

99.9% of thread being replied to after being "dead" for 2+ years are either troll threads or spammers....

Granted, like you said this poster posted something relevant!

GE

  • 0

This thread may be 3 years old but no one has posted the correct answer yet.

Typically you would use

Environment.GetFolderPath

, but there is no constant defined for it.

Here is the correct solution using a Win32 API:

  class Program
    {
        [DllImport("shell32.dll")]
        static extern bool SHGetSpecialFolderPath(IntPtr hwndOwner,
           [Out] StringBuilder lpszPath, int nFolder, bool fCreate);
        const int CSIDL_COMMON_STARTMENU = 0x16;  // \Windows\Start Menu\Programs

        static void Main(string[] args)
        {
            StringBuilder path = new StringBuilder(260);
            SHGetSpecialFolderPath(IntPtr.Zero, path, CSIDL_COMMON_STARTMENU, false);
            string s = path.ToString();
        }
    }

  • 0
  Quote
but there is no constant defined for it
Sure there is; in .NET 4 :)

Just like with registry access, the .NET implementation of the FolderPath APIs is lacking through version 3.5 SP1. However, starting with .NET 4.0, you can do the following:

Environment.GetFolderPath(Environment.SpecialFolder.CommonStartMenu)

Edit: the CODE tags screw up the character casing a little bit; the "s" should be capitalized

Edit 2: WTF, it's impossible to capitalize all three parts of that word anywhere in a forum post. Weird.

It would be nice if they would consider community contribution to the BCL for simple things like this. It's just an enum value and we shouldn't have to wrap 10 year-old APIs in P/Invoke (CSIDL_COMMON_STARTMENU has been available natively starting with XP). Actually, on closer look, it appears this was even defined in Windows 2000.

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • Plasma 6.5 brings improved Emoji Selector, better performance in Activity manager, and more by David Uzondu This week saw the long-awaited release of KDE Plasma 6.4, bringing better window management and a whole lot of color management features. Apart from the release of 6.4, the KDE team was able to get other work done, and this was all outlined in the latest issue of This Week in Plasma, which details what is coming down the pipe for future versions. Looking ahead to Plasma 6.5, the developers are making some notable changes to improve performance and general usability. To prevent its database from growing endlessly and causing performance problems over time, the Activity Manager service will now only store the last four months of your history by default. The Emoji selector app is also getting a much-needed redesign that makes the window more compact and moves the sidebar button to the header for a cleaner look. Other little details for 6.5 are being polished up too. The unpopular vertical line separating the date and time on the horizontal Digital Clock widget is gone; if you want it back, you can add it yourself with a custom date format. The "Add New" button has also been moved to the top toolbar in the Shortcuts page within Settings, freeing up some valuable screen real estate. The devs also reduced the minimum size of custom tiling tiles, a small but significant fix for anyone with an ultrawide monitor. In addition to that, the Networks widget's captive portal banner now uses inline header styling, so it doesn't look like a bunch of frames stacked inside each other anymore. Of course, before we get to 6.5, the current release needs some attention. Plasma 6.4's first bug fix release, 6.4.1, addresses issues like broken item selection in the Folder View widget and a bug that could cause the system to lock or suspend faster than intended. Keyboard navigation in list views in Discover feels smoother now, and text is easier to read in certain list items in KRunner. The devs also cleaned up how list items look when you press or click them in Discover. 6.4.1 also fixes a bug where the clipboard history popup would fail to select the top item, and makes the Earth Science Picture of The Day wallpaper plugin work again after its data source changed. Here's the full list of fixes: Fixed several issues in the Folder View widget that caused selecting or opening items to not work when using certain non-default view settings, when the view was scrollable, or when using a touchscreen. Fixed a bug in the Meta+V clipboard popup that sometimes failed to pre-select the top-most item. The Clipboard settings window’s shortcuts page no longer shows columns for local shortcuts that don’t do anything, since the clipboard is global in scope. Fixed the Earth Science Picture of the Day wallpaper plugin after the source data changed formatting again. Made a few fixes to the “Missing Backends” section of Discover’s settings window that kept it from working properly. Fixed a bug that prevented direct scan-out (and its performance benefits) from activating on rotated screens. Fixed an issue where the system could lock or suspend sooner than expected after an app stopped blocking those actions. Installing a new wallpaper plugin no longer causes the plugin list combobox to appear blank. The team even went back to squash some bugs in the older 6.3.6, tackling an issue that could cause keyboard shortcuts to get lost during a system upgrade and fixing an overflow bug with KRunner's faded completion text. Plasma 6.4.1 is set to arrive on June 24th, with 6.3.6 following on July 8th.
    • UniGetUI 3.2.1 Beta 1 by Razvan Serea UniGetUI is an application whose main goal is to create an intuitive GUI for the most common CLI package managers for Windows 10 and Windows 11, such as Winget, Scoop and Chocolatey. With UniGetUI, you'll be able to download, install, update and uninstall any software that's published on the supported package managers — and so much more. UniGetUI features Install, update and remove software from your system easily at one click: UniGetUI combines the packages from the most used package managers for windows: WinGet, Chocolatey, Scoop, Pip, Npm and .NET Tool. Discover new packages and filter them to easily find the package you want. View detailed metadata about any package before installing it. Get the direct download URL or the name of the publisher, as well as the size of the download. Easily bulk-install, update or uninstall multiple packages at once selecting multiple packages before performing an operation Automatically update packages, or be notified when updates become available. Skip versions or completely ignore updates in a per-package basis. Manage your available updates at the touch of a button from the Widgets pane or from Dev Home pane with UniGetUI Widgets. The system tray icon will also show the available updates and installed package, to efficiently update a program or remove a package from your system. Easily customize how and where packages are installed. Select different installation options and switches for each package. Install an older version or force to install a 32bit architecture. [But don't worry, those options will be saved for future updates for this package] Share packages with your friends to show them off that program you found. Here is an example: Hey @friend, Check out this program! Export custom lists of packages to then import them to another machine and install those packages with previously-specified, custom installation parameters. Setting up machines or configuring a specific software setup has never been easier. Backup your packages to a local file to easily recover your setup in a matter of seconds when migrating to a new machine UniGetUI 3.2.1 Beta 1 changelog: Added per-package-manager default install options Added the ability to run pre-install/update/uninstall and post-install/update/uninstall commands Added the ability to kill process(es) before a package is installed/updated/uninstalled Block custom command-line arguments (and pre/post commands) behind a SecureSetting switch SecureSettings are settings that require administrator privileges to be switched. Bundles won't import custom arguments & custom commands by default Bundles will show a security report when importing potentially dangerous settings Added a better crash message for when UniGetUI files are missing Deep improvements to how bundles and InstallOptions are loaded from disk. Improvements to WebView lifecycle Download: UniGetUI 3.2.1 Beta 1 | 51.7 MB (Open Source) Links: WingetUI Home Page | GitHub | Screenshot Get alerted to all of our Software updates on Twitter at @NeowinSoftware
    • I'm just waiting on what they will do when outlook doesn't load properly, and you have to set a new profile as a test.
    • Weekend PC Game Deals: Rhythm bundles, fishing festivals, and DRM-free summer sales by Pulasthi Ariyasinghe Weekend PC Game Deals is where the hottest gaming deals from all over the internet are gathered into one place every week for your consumption. So kick back, relax, and hold on to your wallets. The Humble Store introduced the June Tunes collection this week. Coming in with music and rhythm titles, the bundle begins with Wanderson, Everhood, and Onde in the first tier for $5. Going up a tier by paying $8 gets you three more games: Rhythm Fighter, One Btn Bosses, and Oddada. Lastly, Trombone Champ, DJMAX RESPECT V, and Ragnarock lead the final tier, which are yours for $10. Just yesterday, Humble also brought out the Serenity Forge Storyteller's Bundle. This carries 12 indie games inside it, including LISA the Joyful and LISA the Painful, Neversong, Death's Gambit, Smile for Me, Long Gone Days, and more, all split into three tiers of prices. Replacing Two Point Hospital, The Operator landed as the latest freebie on the Epic Games Store earlier this week. The 2024-released indie title has you taking the role of a new hire at the Federal Department of Intelligence (FDI). Here you have to analyze evidence, fact-check, and try to solve a streak of mysterious crimes using the agency's advanced investigative software. However, as the story progresses, a conspiracy is revealed that paints the FDI in a different light. The Operator giveaway on the Epic Games Store is slated to last until June 26. On the same day, Sable will become the next freebie in the promotion. Free Events If you're looking to try out some games over the weekend without opening your wallet, there are three games having free weekend offers right now. Starting off, Paradox is offering its grand strategy experience, Victoria 3, to try out. The title has a much higher focus on state management than war and roleplaying compared to the company's other games. If that's too much of a tough start, Len's Island is temporarily free-to-play now too. This is a top-down perspective survival game with support for up to eight players in co-op, with combat, farming, dungeon diving, and other elements being included. Lastly, Dead by Daylight should be the most familiar to most. The multiplayer four-versus-one asymmetric survival horror game has you assuming the roles of survivors or the killer to see who can come out on top. Big Deals With the Steam Summer Sale only being days away, most publishers and developers are laying low to prepare for the big event. Still, we found quite a few games having some attractive discounts. Here's our hand-picked big deals list for this weekend: Red Dead Redemption – $29.99 on Steam Mount & Blade II: Bannerlord – $24.99 on Steam Timberborn – $24.49 on Steam BERSERK and the Band of the Hawk – $23.99 on Steam Wo Long: Fallen Dynasty – $23.99 on Steam Disney Epic Mickey: Rebrushed – $23.99 on Steam Jagged Alliance 3 – $22.49 on Steam [NINJA GAIDEN: Master Collection] NINJA GAIDEN Σ2 – $19.99 on Steam Alone in the Dark – $19.99 on Steam Last Train Home – $19.99 on Steam Len's Island – $19.49 on Steam Nightingale – $17.99 on Steam DYNASTY WARRIORS 8: Xtreme Legends Complete Edition – $16.99 on Steam Mortal Kombat 1 – $16.49 on Steam SOMA – $14.99 on Steam Victoria 3 – $14.99 on Steam Trepang2 – $14.99 on Steam Blasphemous 2 – $14.99 on Steam Wreckfest – $14.99 on Steam Expeditions: Rome – $14.84 on Steam EA SPORTS FC 25 – $13.99 on Steam STAR WARS Jedi: Survivor – $13.99 on Steam DRAGON BALL Z: KAKAROT – $12.99 on Gamesplanet Amnesia: The Bunker – $12.49 on Steam DREDGE – $12.49 on Steam Dead Space – $11.99 on Steam DAVE THE DIVER – $11.99 on Steam WILD HEARTS – $10.49 on Steam It Takes Two – $9.99 on Steam Dragon Age Inquisition – $9.99 on Steam Haven – $9.99 on Steam Hellboy Web of Wyrd – $9.99 on Steam Nova Lands – $9.99 on Steam BIOMUTANT – $9.99 on Steam Destroy All Humans! 2 - Reprobed – $9.99 on Steam Ghostrunner 2 – $9.99 on Steam Need for Speed Unbound – $9.79 on Steam Call of the Wild: The Angler – $8.99 on Steam DEAD OR ALIVE 6 – $8.99 on Steam Operation: Tango – $8.99 on Steam Katana ZERO – $8.99 on Steam Dead by Daylight – $7.99 on Steam Killer Frequency – $7.49 on Steam Nioh: Complete Edition – $7.49 on Steam Overcooked! 2 – $6.24 on Steam A Way Out – $5.99 on Steam Mass Effect Legendary Edition – $5.99 on Steam Darksiders Genesis – $5.99 on Steam Mortal Kombat 11 – $4.99 on Steam Titanfall 2 – $4.49 on Steam Golf With Your Friends – $4.49 on Steam STAR WARS Battlefront II – $3.99 on Steam Yoku's Island Express – $3.99 on Steam theHunter: Call of the Wild – $3.99 on Steam RoboCop: Rogue City – $3.74 on Fanatical Battlefield 2042 – $2.99 on Steam Road Redemption – $2.99 on Steam Shadow Warrior 2 – $2.99 on Steam Battlefield V – $2.49 on Steam Ultimate Fishing Simulator – $1.99 on Steam DRM-free Specials The GOG store has already kicked off its own summer sale, putting thousands of DRM-free games on sale. Here are some highlights: Cyberpunk 2077 - $23.99 on GOG God of War - $19.99 on GOG Fallout 4: Game of the Year Edition - $15.99 on GOG Fallout 4: Game of the Year Edition - $15.99 on GOG Dino Crisis Bundle - $15.29 on GOG Devil May Cry HD Collection & 4SE Bundle - $14.84 on GOG The Witcher 3: Wild Hunt - Complete Edition - $9.99 on GOG Vampire: The Masquerade - Bloodlines - $9.99 on GOG SPORE Collection - $7.49 on GOG Papers, Please - $4.99 on GOG Terraria - $4.99 on GOG SWAT 4: Gold Edition - $4.99 on GOG DOOM (2016) - $3.99 on GOG DOOM 3 - $3.99 on GOG CrossCode - $3.99 on GOG Mad Max - $2.99 on GOG Heroes of Might and Magic 3: Complete - $2.49 on GOG Heroes of Might and Magic 4: Complete - $2.49 on GOG World in Conflict: Complete Edition - $2.49 on GOG Alan Wake - $1.49 on GOG Mortal Kombat 1+2+3 - $1.49 on GOG RollerCoaster Tycoon Deluxe - $1.19 on GOG Keep in mind that availability and pricing for some deals could vary depending on the region. That's it for our pick of this weekend's PC game deals, and hopefully, some of you have enough self-restraint not to keep adding to your ever-growing backlogs. As always, there are an enormous number of other deals ready and waiting all over the interwebs, as well as on services you may already subscribe to if you comb through them, so keep your eyes open for those, and have a great weekend.
    • Is there a 'recovery' settings option in Settings? The one where we can rollback to a previous restore point. I find it very useful if there is some issue and I have to rollback to the last stable point.
  • Recent Achievements

    • Contributor
      GravityDead went up a rank
      Contributor
    • Week One Done
      BlakeBringer earned a badge
      Week One Done
    • Week One Done
      Helen Shafer earned a badge
      Week One Done
    • First Post
      emptyother earned a badge
      First Post
    • Week One Done
      Crunchy6 earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      672
    2. 2
      ATLien_0
      269
    3. 3
      Michael Scrip
      240
    4. 4
      Steven P.
      165
    5. 5
      +FloatingFatMan
      158
  • Tell a friend

    Love Neowin? Tell a friend!