2010-02-24 22 views
11

Est-ce que quelqu'un sait comment accéder par programme au menu de démarrage "Tous les utilisateurs"?Accès par programme à tous les utilisateurs Menu Démarrer

Dans XP, situé ici:

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

Et dans Windows 7, situé ici:

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

Plus précisément, j'ai un projet d'installation et de déploiement, et je voudrais mettre un raccourci vers l'application dans le menu Démarrage pour tous les utilisateurs afin que l'application démarre dès que quelqu'un se connecte.

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

+0

Le mérite revient à Brian R. Bondy; il a répondu à la question comme je l'ai formulée. J'ai fini par créer un dossier nommé "Démarrage" sous "Menu Programmes de l'utilisateur" (Affichage> Système de fichiers). Et je me suis appuyé sur l'utilisateur d'installer le programme avec "Installer ... pour vous, ou pour toute personne qui utilise cet ordinateur" mis à "Tout le monde". Si l'utilisateur a sélectionné "Just me", il n'a été placé que dans le menu de démarrage de cet utilisateur. Et je suppose que je suis d'accord avec ça. Je suppose que j'ai * pu * avoir copié un raccourci dans une action personnalisée en utilisant la méthode de Brian ... – fre0n

Répondre

17

Il n'y a pas constante définie pour la façon normale de Environment.GetFolderPath pour l'ensemble des utilisateurs du menu Démarrer, mais vous pouvez le faire de cette façon en utilisant le 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

J'aimerais ne pas avoir à utiliser l'API Win32, mais cela fait l'affaire. – fre0n

+0

Très commun d'avoir à utiliser l'API Win32 de C# :) –

+0

@ fre0n: Si vous ne voulez pas utiliser l'API Win32, vous pouvez utiliser les propriétés MSI faites à cet effet. –

4

« Tous les utilisateurs » réside dans la variable d'environnement 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

Cela peut ne pas fonctionner selon les paramètres régionaux de Windows installés. –

+0

Ne fonctionne pas avec Windows 7. – fre0n

+1

@ fre0n Je ne travaille pas non plus avec Windows 7. – Seth

2

Vous pouvez accéder au dossier de démarrage en utilisant la propriété MSI approprié (voir here pour plus de détails): [StartupFolder]

Toutefois, comme c'est généralement le cas pour les variables MSI dépendantes de l'utilisateur, cette propriété pointe vers le dossier de démarrage de l'utilisateur ou vers le dossier de démarrage de tous les utilisateurs, en fonction de la valeur de la propriété ALLUSERS.

Cela signifie que lorsque vous installez pour « Tout le monde » (par ordinateur), vous obtiendrez le dossier

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

sinon vous allez dans le dossier par l'utilisateur dans le profil de l'utilisateur. Ceci est par conception et a également un sens, car une installation par utilisateur n'aura pas l'autorisation d'écrire dans le dossier tous les utilisateurs.

Dans votre projet Configuration et déploiement, procédez comme suit pour placer les fichiers dans le dossier de démarrage:

  • ouvrir le File System vue,
  • clic droit sur l'arborescence des dossiers et ajouter un dossier personnalisé.
  • sous les propriétés de ce dossier, définissez DefaultLocation-[StartupFolder]
  • ajouter le contenu dans le dossier personnalisé
3

Vous pouvez également essayer!

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

Dans .NET 4 CommonStartMenu a été ajouté à la Environment.SpecialFolder enum, vous pouvez donc utiliser:

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

Ceci est génial, cependant, essayer d'accéder à ce dossier par programme vous donnera "Accès au chemin 'C: \ Documents and Settings \ Tous les utilisateurs \ Menu Démarrer' est refusé." Cela ne semble donc pas très utile. –

+0

@LogicsaurusRex Par "accès", vous voulez dire modifier les éléments dans le dossier? Cela nécessitera certainement des autorisations d'administrateur et s'applique à toutes les réponses à cette question, pas seulement celle-ci. –

+0

Dans mon cas, j'essayais simplement de supprimer un raccourci vers une application, et appeler IO.Directory.GetFiles sur ce chemin de menu démarrer a explosé avec un accès refusé. Il semblerait que dans environ la moitié des cas, les gens voudraient modifier l'accès. Read Only semble très utile. Donc c'est une chose d'avoir un chemin vers quelque chose, mais une autre chose d'être capable de l'utiliser pour n'importe quoi. Je me rends compte que "utiliser" le chemin n'était pas vraiment la question, mais la prochaine inférence logique inclurait l'utiliser, et peut-être modifier. –

0

De C++, comme pour un moment d'écrire ces lignes, Microsoft encourage à utiliser SHGetKnownFolderPath avec la valeur désirée de KNOWNFOLDERID enum.La valeur que vous devez utiliser est FOLDERID_CommonStartMenu. Dans votre cas, le code ressemblerait à ceci:

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

Référence du SHGetKnownFolderPath est là:
https://msdn.microsoft.com/en-us/library/windows/desktop/bb762188(v=vs.85).aspx

référence de toutes les valeurs disponibles ENUM KNOWNFOLDERID est là:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd378457(v=vs.85).aspx

Info, ce processus d'appel est responsable de la libération des ressources, peut être trouvé dans la documentation de SHGetKnownFolderPath en partie documentant le paramètre ppszPath.

Veuillez noter que, lors de son exécution à partir du service, certaines valeurs ne sont pas disponibles (par exemple en relation avec les données de l'utilisateur, par exemple FOLDERID_Documents). De plus, si certaines valeurs ne sont pas disponibles si vous utilisez une architecture différente (par exemple, la valeur associée à FOLDERID_ProgramFilesX64 n'est pas disponible sur le système d'exploitation 32 bits).

Si quelqu'un veut savoir où Microsoft encourage à utiliser SHGetKnownFolderPath au lieu d'autres fonctions disponibles, veuillez lire le début de la documentation de SHGetFolderPath obsolète.