Программный доступ ко всем пользователям меню «Пуск» - PullRequest
12 голосов
/ 25 февраля 2010

Кто-нибудь знает, как программно получить доступ к меню запуска «Все пользователи»?

В XP, расположенной здесь:

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

А в Windows 7, расположенной здесь:

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

В частности, у меня есть проект установки и развертывания, и я хотел бы добавить ярлык для приложения в меню «Пуск» для всех пользователей, чтобы приложение запускалось при каждом входе в систему.

РЕДАКТИРОВАТЬ: Я почти уверен, что именно здесь Брайан получил свой ответ.

Ответы [ 6 ]

20 голосов
/ 30 марта 2012

В .NET 4 CommonStartMenu был добавлен Environment.SpecialFolder enum , поэтому вы можете использовать:

Environment.GetFolderPath(Environment.SpecialFolder.CommonStartMenu)
17 голосов
/ 25 февраля 2010

Для обычного способа 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();
    }
}
4 голосов
/ 25 февраля 2010

«Все пользователи» находятся в переменной среды 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 голосов
/ 25 сентября 2011

Вы также можете попробовать!

string allUsers=Environment.GetEnvironmentVariable("ALLUSERSPROFILE")+ "\\Start Menu\\Programs";
2 голосов
/ 25 февраля 2010

Вы можете получить доступ к папке автозагрузки, используя соответствующее свойство MSI (см. здесь для более подробной информации): [StartupFolder]

Однако, как обычно для пользовательских переменных MSI, это свойство указывает либо на папку запуска пользователя, либо на папку запуска всех пользователей, в зависимости от значения свойства ALLUSERS.

Это означает, что при установке для «Все» (для каждой машины) вы получите папку

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

в противном случае вы откроете папку для каждого пользователя в профиле пользователя. Это разработано и имеет смысл, так как установка для каждого пользователя не будет иметь права на запись в папку всех пользователей.

В вашем проекте Setup and Deployment выполните следующие действия, чтобы поместить файлы в папку автозагрузки:

  • открыть файловую систему представление,
  • щелкните правой кнопкой мыши дерево папок и добавьте пользовательскую папку.
  • в свойствах этой папки установите DefaultLocation на [StartupFolder]
  • добавить содержимое в пользовательскую папку
0 голосов
/ 17 ноября 2016

Начиная с C ++, на момент написания этой статьи Microsoft рекомендует использовать SHGetKnownFolderPath с желаемым значением KNOWNFOLDERID enum. Значение, которое вам нужно использовать: 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

Ссылка на все доступные значения enum KNOWNFOLDERID есть:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs.85).aspx

Информацию о том, что вызывающий процесс отвечает за освобождение ресурса, можно найти в документации по SHGetKnownFolderPath в части, документирующей параметр ppszPath.

Обратите внимание, что при запуске из службы некоторые значения недоступны (например, связанные с данными пользователя, например: FOLDERID_Documents). Более того, если некоторые значения недоступны, если вы используете другую архитектуру (например, значение, связанное с FOLDERID_ProgramFilesX64, недоступно в 32-разрядной операционной системе).

Если кто-то хочет знать, где Microsoft рекомендует использовать SHGetKnownFolderPath вместо других доступных функций, пожалуйста, прочитайте верхнюю часть документации по устаревшим SHGetFolderPath.

...