以编程方式访问所有用户开始菜单

时间:2010-02-24 21:22:57

标签: c# .net setup-deployment special-folders

有谁知道如何以编程方式访问“所有用户”启动菜单?

在XP中,位于此处:

C:\Documents and Settings\All Users\Start Menu\Programs\Startup

在Windows 7中,位于此处:

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

具体来说,我有一个安装和部署项目,我想在所有用户的Startup菜单中为应用程序添加一个快捷方式,以便每当有人登录时启动应用程序。

编辑:I'm pretty sure this is where Brian got his answer from.

6 个答案:

答案 0 :(得分:20)

在.NET 4中,CommonStartMenu添加了Environment.GetFolderPath(Environment.SpecialFolder.CommonStartMenu) ,因此您可以使用:

{{1}}

答案 1 :(得分:17)

对于所有用户的开始菜单,Environment.GetFolderPath的常规方式没有常量定义,但您可以通过使用Win32 API SHGetSpecialFolderPath这样做:

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

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

答案 2 :(得分:4)

“所有用户”驻留在ALLUSERSPROFILE环境变量中:

C:\>dir "%ALLUSERSPROFILE%\Start Menu"
 Volume in drive C is awesome
 Volume Serial Number is 8C57-DB1A

 Directory of C:\Documents and Settings\All Users\Start Menu

12/28/2009  10:27 PM    <DIR>          .
12/28/2009  10:27 PM    <DIR>          ..
12/28/2009  10:01 PM             1,566 Microsoft Update.lnk
02/23/2010  09:57 PM    <DIR>          Programs
12/28/2009  10:27 PM             1,563 Set Program Access and Defaults.lnk
12/28/2009  08:51 PM               398 Windows Catalog.lnk
12/28/2009  08:51 PM             1,507 Windows Update.lnk
               4 File(s)          5,034 bytes
               3 Dir(s)  64,214,460,416 bytes free

答案 3 :(得分:3)

你也可以尝试!

string allUsers=Environment.GetEnvironmentVariable("ALLUSERSPROFILE")+ "\\Start Menu\\Programs";

答案 4 :(得分:2)

您可以使用适当的MSI属性访问启动文件夹(有关详细信息,请参阅here):[StartupFolder]

但是,对于依赖于用户的MSI变量,此属性通常指向用户的启动文件夹或所有用户的启动文件夹,具体取决于ALLUSERS属性的值。

这意味着当您为“Everyone”(每台机器)安装时,您将获得文件夹

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\

否则您将在用户的个人资料中显示每个用户的文件夹。这是设计的,也是有意义的,因为每用​​户安装没有写入all users文件夹的权限。

设置和部署项目中,执行以下操作将文件放入启动文件夹中:

  • 打开文件系统视图,
  • 右键单击文件夹树并添加自定义文件夹。
  • 在此文件夹的属性下,将 DefaultLocation 设置为[StartupFolder]
  • 将内容添加到自定义文件夹

答案 5 :(得分:0)

从C ++开始,至于写这篇文章的时刻,微软鼓励SHGetKnownFolderPath使用所需的KNOWNFOLDERID枚举值。您需要使用的值是FOLDERID_CommonStartMenu。在您的情况下,代码看起来像:

wchar_t * path = nullptr;
const auto result = SHGetKnownFolderPath(FOLDERID_CommonStartMenu, 0, NULL, &path);
if (S_OK == result)
{
    // do what you want with path, f.ex. create string from it
    std::wstring pathAsString(path);
    // according to documentation, calling process is responsible for freeing this resource
    CoTaskMemFree(path);
}

SHGetKnownFolderPath的参考是: https://msdn.microsoft.com/en-us/library/windows/desktop/bb762188(v=vs.85).aspx

枚举KNOWNFOLDERID的所有可用值的引用是:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs.85).aspx

Info,调用流程负责释放资源,可以在SHGetKnownFolderPath的文档中找到,部分记录ppszPath参数。

请注意,从服务执行时,某些值不可用(例如,与用户数据相关,f。FOLDERID_Documents)。此外,如果使用不同的体系结构,则某些值不可用(与FOLDERID_ProgramFilesX64相关的f.ex.值在32位操作系统上不可用)。

如果有人愿意知道Microsoft鼓励使用SHGetKnownFolderPath而非其他可用功能的位置,请阅读已弃用SHGetFolderPath的文档顶部。