Ke3pup Posted August 11, 2007 Share Posted August 11, 2007 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? Link to comment https://www.neowin.net/forum/topic/580258-c-get-path-of-start-menu-programs-all-users/ Share on other sites More sharing options...
0 Ianmac45 Posted August 11, 2007 Share Posted August 11, 2007 ...replace the current user with "All Users," perhaps? Link to comment https://www.neowin.net/forum/topic/580258-c-get-path-of-start-menu-programs-all-users/#findComment-588771452 Share on other sites More sharing options...
0 Ke3pup Posted August 11, 2007 Author Share Posted August 11, 2007 i don't get it! Replace what with All users? Link to comment https://www.neowin.net/forum/topic/580258-c-get-path-of-start-menu-programs-all-users/#findComment-588771922 Share on other sites More sharing options...
0 sathenzar Posted August 12, 2007 Share Posted August 12, 2007 The word {Username} like from: X:\Documents and Settings\{Username here}\Start Menu\Programs to replace that {Username here} with the word "All Users". Link to comment https://www.neowin.net/forum/topic/580258-c-get-path-of-start-menu-programs-all-users/#findComment-588773567 Share on other sites More sharing options...
0 jimbo11883 Posted August 12, 2007 Share Posted August 12, 2007 (edited) 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 August 12, 2007 by jimbo11883 Link to comment https://www.neowin.net/forum/topic/580258-c-get-path-of-start-menu-programs-all-users/#findComment-588773578 Share on other sites More sharing options...
0 Doli Posted August 12, 2007 Share Posted August 12, 2007 (edited) 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 August 12, 2007 by Doli Link to comment https://www.neowin.net/forum/topic/580258-c-get-path-of-start-menu-programs-all-users/#findComment-588773717 Share on other sites More sharing options...
0 Tufo Posted January 27, 2010 Share Posted January 27, 2010 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); Link to comment https://www.neowin.net/forum/topic/580258-c-get-path-of-start-menu-programs-all-users/#findComment-592163924 Share on other sites More sharing options...
0 garethevans1986 Posted January 27, 2010 Share Posted January 27, 2010 Dude this is like 2 years old! Link to comment https://www.neowin.net/forum/topic/580258-c-get-path-of-start-menu-programs-all-users/#findComment-592165224 Share on other sites More sharing options...
0 Tufo Posted January 27, 2010 Share Posted January 27, 2010 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 Link to comment https://www.neowin.net/forum/topic/580258-c-get-path-of-start-menu-programs-all-users/#findComment-592165486 Share on other sites More sharing options...
0 Echilon Posted February 12, 2010 Share Posted February 12, 2010 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. 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. Link to comment https://www.neowin.net/forum/topic/580258-c-get-path-of-start-menu-programs-all-users/#findComment-592230730 Share on other sites More sharing options...
0 garethevans1986 Posted February 12, 2010 Share Posted February 12, 2010 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 Link to comment https://www.neowin.net/forum/topic/580258-c-get-path-of-start-menu-programs-all-users/#findComment-592231192 Share on other sites More sharing options...
0 Brian R. Bondy Posted February 24, 2010 Share Posted February 24, 2010 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(); } } Link to comment https://www.neowin.net/forum/topic/580258-c-get-path-of-start-menu-programs-all-users/#findComment-592278470 Share on other sites More sharing options...
0 boogerjones Posted February 25, 2010 Share Posted February 25, 2010 but there is no constant defined for itSure 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. Link to comment https://www.neowin.net/forum/topic/580258-c-get-path-of-start-menu-programs-all-users/#findComment-592279952 Share on other sites More sharing options...
Question
Ke3pup
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?
Link to comment
https://www.neowin.net/forum/topic/580258-c-get-path-of-start-menu-programs-all-users/Share on other sites
12 answers to this question
Recommended Posts