C# 以编程方式访问所有用户的“开始”菜单

C# 以编程方式访问所有用户的“开始”菜单,c#,.net,setup-deployment,special-folders,C#,.net,Setup Deployment,Special Folders,有人知道如何以编程方式访问“所有用户”启动菜单吗 在XP中,位于以下位置: C:\Documents and Settings\All Users\Start Menu\Programs\Startup C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup 在Windows 7中,位于此处: C:\Documents and Settings\All Users\Start Menu\Programs\Startup C:

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

在XP中,位于以下位置:

C:\Documents and Settings\All Users\Start Menu\Programs\Startup
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
在Windows 7中,位于此处:

C:\Documents and Settings\All Users\Start Menu\Programs\Startup
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
具体地说,我有一个安装和部署项目,我想在所有用户的启动菜单中设置一个应用程序的快捷方式,以便在任何人登录时启动应用程序

编辑:

“所有用户”位于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
C:\>dir”%ALLUSERSPROFILE%\Start Menu“
驱动器C中的音量太棒了
卷序列号为8C57-DB1A
C:\Documents and Settings\All Users\Start菜单目录
2009年12月28日晚上10:27。
2009年12月28日晚上10:27。。
2009年12月28日10:01下午1566 Microsoft Update.lnk
2010年2月23日09:57下午节目
2009年12月28日10:27下午1563设置程序访问和默认值.lnk
2009年12月28日08:51 PM 398 Windows Catalog.lnk
2009年12月28日08:51下午1507 Windows Update.lnk
4个文件5034字节
3个目录64214460416个可用字节

没有为
环境的正常方式定义常量。对于所有用户的“开始”菜单,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();
    }
}

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

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

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

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\
否则,您将在用户配置文件中删除每个用户文件夹。这是出于设计,也是有道理的,因为按用户安装将没有写入“所有用户”文件夹的权限

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

  • 打开文件系统视图
  • 在文件夹树上单击鼠标右键,然后添加自定义文件夹
  • 在此文件夹的属性下,将DefaultLocation设置为
    [StartupFolder]
  • 将内容添加到自定义文件夹
    • 你也可以试试

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

      在.NET 4中,
      CommonStart菜单
      已添加到,因此您可以使用:

      Environment.GetFolderPath(Environment.SpecialFolder.CommonStartMenu)
      

      < C++ >从微软的编写时刻起,微软鼓励使用<代码> SHGetKnownFolderPath <代码>,希望代码<>代码NoNoFuldIDEnUM。您需要使用的值是
      FOLDERID\u commonstart menu
      。在您的情况下,代码如下所示:

      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的引用是否存在:

      enum
      KNOWNFOLDERID的所有可用值的引用是否存在:

      调用进程负责释放资源的信息,可以在
      SHGetKnownFolderPath
      的文档中的部分文档
      ppszPath
      参数中找到

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


      如果有人想知道Microsoft鼓励在何处使用
      SHGetKnownFolderPath
      而不是其他可用功能,请阅读不推荐使用的
      SHGetFolderPath

      文档顶部。根据安装的Windows的区域设置,这可能不起作用。它实际上在Windows 7上起作用,但是它没有指向启动文件夹。我希望我不必使用Win32 API,但这可以完成工作。从C#使用Win32 API非常常见:)@fre0n:如果你不想使用Win32 API,你可以使用为此目的而制作的MSI属性。完整的引用归于Brian R.Bondy;他按我的措辞回答了这个问题。最后,我在“用户程序菜单”(视图>文件系统)下创建了一个名为“Startup”的文件夹。我依赖于用户安装程序时将“为您自己或使用此计算机的任何人安装”设置为“所有人”。如果用户选择了“Just me”,那么它只会被放在该用户的启动菜单中。我想我可以接受。我想我可以用Brian的方法在自定义操作中复制一个快捷方式……这太棒了,但是,尝试以编程方式访问该文件夹会使您“拒绝访问路径‘C:\Documents and Settings\All Users\Start Menu’”。因此似乎不是很有用。@LogicsaurusRex所说的“access”是指修改文件夹中的项目吗?这肯定需要管理员权限,并且适用于此问题的所有答案,而不仅仅是此问题。在我的情况下,我只是尝试删除应用程序的快捷方式,然后调用“开始”菜单路径上的IO.Directory.GetFiles,但访问被拒绝。似乎在大约一半的情况下,人们希望修改访问权限。只读似乎用处不大。因此,有一条通往某物的道路是一回事,但能够利用它做任何事情又是另一回事。我意识到“使用”路径并不是真正的问题,但下一个逻辑推理将包括使用它,也许还包括修改。