Программный доступ к меню "Все пользователи"
Кто-нибудь знает, как программно получить доступ к стартовому меню "Все пользователи"?
В XP, расположенном здесь:
C:\Documents and Settings\All Users\Start Menu\Programs\Startup
И в Windows 7, расположенной здесь:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
В частности, у меня есть проект установки и развертывания, и я хотел бы поместить ярлык в приложение в меню "Автозагрузка" для всех пользователей, чтобы приложение запускалось всякий раз, когда кто-либо входил в систему.
EDIT: Я уверен, что именно здесь Брайан получил свой ответ.
Ответы
Ответ 1
Не существует константы, определенной для обычного способа 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
В .NET 4 CommonStartMenu
был добавлен в Environment.SpecialFolder
enum, поэтому вы можете использовать:
Environment.GetFolderPath(Environment.SpecialFolder.CommonStartMenu)
Ответ 3
"Все пользователи" находятся в переменной среды 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
Ответ 4
Вы также можете попробовать!
string allUsers=Environment.GetEnvironmentVariable("ALLUSERSPROFILE")+ "\\Start Menu\\Programs";
Ответ 5
Вы можете получить доступ к папке запуска с использованием соответствующего свойства MSI (подробнее см. здесь): [StartupFolder
]
Однако, как типично для зависящих от пользователя переменных MSI, это свойство указывает либо на папку автозагрузки пользователя, либо на папку запуска всех пользователей, в зависимости от значения свойства ALLUSERS.
Это означает, что при установке для "Каждого" (для каждой машины) вы получите папку
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\
в противном случае вы будете в папке для каждого пользователя в профиле пользователя. Это по дизайну, а также имеет смысл, поскольку установка для каждого пользователя не будет иметь права на запись во все папки пользователей.
В проекте "Установка и развертывание" выполните следующие действия, чтобы поместить файлы в папку автозагрузки:
- откройте представление файловой системы,
- щелкните правой кнопкой мыши дерево папок и добавьте пользовательскую папку.
- в свойствах этой папки установите для параметра DefaultLocation значение
[StartupFolder]
- добавить содержимое в пользовательскую папку
Ответ 6
Из С++, что касается момента написания этого, 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
.
Обратите внимание, что когда он выполняется из службы, некоторые значения недоступны (например, связанные с данными пользователя, f.ex. FOLDERID_Documents
). Более того, если некоторые значения недоступны, если вы используете другую архитектуру (значение f.ex., связанное с FOLDERID_ProgramFilesX64
, недоступно в 32-разрядной операционной системе).
Если кто-то хочет знать, где Microsoft рекомендует использовать SHGetKnownFolderPath
вместо других доступных функций, прочитайте верхнюю часть документации устаревшего SHGetFolderPath
.