2010-02-24 13 views
11

¿Alguien sabe cómo acceder a la programación "Todos los usuarios" del menú de inicio?programación acceder a todos los usuarios comienzan Menú

En XP, encuentran aquí:

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

y en Windows 7, que se encuentra aquí:

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

Específicamente, Tengo un proyecto de instalación e implantación, y me gustaría ponga un acceso directo a la aplicación en el menú Inicio para todos los usuarios para que la aplicación se inicie cada vez que alguien inicie sesión.

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

+0

El crédito va para Brian R. Bondy; él respondió la pregunta como lo formulé. Terminé creando una carpeta llamada "Inicio" en "Menú de programas del usuario" (Ver> Sistema de archivos). Y confié en que el usuario instaló el programa con "Instalar ... para usted o para cualquier persona que use esta computadora" en "Todos". Si el usuario seleccionó "Solo yo", solo se habría colocado en el menú Inicio de ese usuario. Y supongo que estoy de acuerdo con eso. Supongo que * podría * haber copiado un atajo en una acción personalizada usando el método de Brian ... – fre0n

Respuesta

17

No hay ninguna constante definida por la forma normal de Environment.GetFolderPath para el todos los usuarios de menú de inicio, pero se puede hacer de esta manera utilizando el 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(); 
    } 
} 
+0

Ojalá no tuviera que usar la API de Win32, pero esto hace el trabajo. – fre0n

+0

Es muy común tener que usar la API de Win32 de C# :) –

+0

@ fre0n: Si no desea usar la API de Win32, puede usar las propiedades de MSI creadas para ese fin. –

4

"Todos los usuarios" reside en la variable de entorno 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 
+0

Esto puede no funcionar dependiendo de la configuración regional de Windows instalado. –

+0

No funciona con Windows 7. – fre0n

+1

@ fre0n Tampoco trabajo con Windows 7. – Seth

2

Se puede acceder a la carpeta de inicio mediante la propiedad MSI adecuado (vea here para más detalles): [StartupFolder]

Sin embargo, como es típico para las variables MSI dependientes del usuario, esta propiedad puntos, ya sea a la carpeta de inicio del usuario o en la carpeta de inicio de todos los usuarios, dependiendo del valor de la propiedad ALLUSERS.

Esto significa que cuando se instala para "Todo el mundo" (por equipo) obtendrá la carpeta

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

de lo contrario se la carpeta de cada usuario dentro del perfil del usuario. Esto es por diseño y también tiene sentido, ya que una instalación por usuario no tendrá permiso para escribir en la carpeta de todos los usuarios.

en su configuración y el proyecto de implementación de, haga lo siguiente para colocar archivos en la carpeta de inicio:

  • abrir el sistema Archivo vista,
  • haga clic con el árbol de carpetas y añadir una carpeta personalizada
  • en las propiedades de esta carpeta, establezca DefaultLocation a [StartupFolder]
  • añadir el contenido a la carpeta personalizada
3

También puede probar!

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

En .NET 4 CommonStartMenu se añadió a la Environment.SpecialFolder enum, por lo que puede utilizar:

Environment.GetFolderPath(Environment.SpecialFolder.CommonStartMenu) 
+0

Esto es increíble, sin embargo, intentar acceder a esa carpeta programáticamente le dará "Acceso a la ruta 'C: \ Documents and Settings \ All Users \ Start Menu' denegado." así que no parece muy útil. –

+0

@LogicsaurusRex ¿Por "acceso" quiere decir modificar elementos en la carpeta? Eso definitivamente requerirá permisos de administrador y se aplica a todas las respuestas a esta pregunta, no solo a esta. –

+0

En mi caso, simplemente estaba tratando de eliminar un acceso directo a una aplicación, y llamar a IO.Directory.GetFiles en esa ruta del menú de inicio estalló con un acceso denegado. Parecería que en aproximadamente la mitad de los casos, las personas querrían modificar el acceso. Solo lectura parece una utilidad muy limitada. Entonces, una cosa es tener un camino hacia algo, pero otra es poder usarlo para cualquier cosa. Me doy cuenta de que "usar" la ruta no era realmente la pregunta, pero la siguiente inferencia lógica incluiría usarla, y quizás modificarla. –

0

De C++, en cuanto a momento de escribir esto, Microsoft recomienda utilizar SHGetKnownFolderPath con valor deseado de KNOWNFOLDERID enum.El valor que necesita usar es FOLDERID_CommonStartMenu. En su caso, el código se vería así:

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); 
} 

Referencia de SHGetKnownFolderPath está ahí:
https://msdn.microsoft.com/en-us/library/windows/desktop/bb762188(v=vs.85).aspx

de referencia de todos los valores disponibles de enumeración KNOWNFOLDERID está ahí:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs.85).aspx

Información, ese proceso de llamada es responsable de liberar recursos, se puede encontrar en la documentación de SHGetKnownFolderPath en la parte que documenta el parámetro ppszPath.

Tenga en cuenta que cuando se ejecuta desde el servicio, algunos valores no están disponibles (por ejemplo, relacionados con los datos del usuario, por ejemplo, FOLDERID_Documents). Además, si algunos valores no están disponibles si está utilizando una arquitectura diferente (el valor de f.ex. relacionado con FOLDERID_ProgramFilesX64 no está disponible en el sistema operativo de 32 bits).

Si alguien está dispuesto a saber dónde anima Microsoft a usar SHGetKnownFolderPath en lugar de otras funciones disponibles, lea la parte superior de la documentación de SHGetFolderPath en desuso.

Cuestiones relacionadas