2010-05-17 1 views
1

Je trouve ce joli bout de code en ligne:Obtention du programme à exécuter au démarrage à partir du code C#. Réglage du Registre Run « true » ne fonctionne pas aussi bien

rkApp = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true); 

Ce qui fonctionne très bien, mais hélas sur Windows 7 et Vista Je soupçonne, il se bloque parce que ce n » J'ai la permission d'écrire là-bas.

donc je recherche (sur stackoverflow bien sûr) comment éviter cela, la méthode la plus rapide:

rkApp = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true); 

assez simple! Bien qu'il reste deux problèmes. On est avec les deux méthodes (sur une XP Box qui est), le programme pense que son chemin relatif est quelque part dans le dossier C: \ windows maintenant ... donc I.e. Le deuxième problème est, sur Windows 7, mon programme ne démarrera pas avant que je me connecte. Je veux qu'il démarre en arrière-plan si possible avant que quiconque ne se connecte.

C'est un .exe simple qui se déroule dans la barre des tâches lors de son fonctionnement. Je ne voulais pas créer cette monstruosité d'installateur pour contourner ces problèmes d'administration et de cheminement.

Je pense que je devrais le créer en tant que service (aucune idée de comment le faire) pour le faire démarrer lorsque la machine redémarre avant que quelqu'un se connecte. Deuxièmement, pour faire cela, je suis sûr que je dois comprendre les privilèges d'administration, et puisque je ne veux pas avoir à approuver le programme à exécuter chaque fois qu'il démarre, il semble que je devrais comprendre ses privilèges d'administration au moment de l'installation, mais hélas pas d'installateur.

Donc juste curieux de savoir quelles routes je pourrais prendre pour que cela fonctionne. Je peux même le souffrir seulement après que l'utilisateur se connecte, mais mes méthodes actuelles qui fonctionnent de cette façon vraiment bousiller le chemin de mon programme, car il essaie d'écrire des choses dans un nouveau répertoire (pas celui que j'ai initialement lancé le EXE de). Etc ... et je n'ai aucune idée de comment régler ce problème.

+1

Il n'y a aucun systray jusqu'à ce que quelqu'un se connecte. – SLaks

Répondre

1

Si vous voulez que votre programme démarre en tant que service avant que quiconque ne se connecte, il doit être installé et exécuté en tant qu'utilisateur admin. Il n'y a pas de contournement de ce fait.

Il existe un Microsoft Knowledge Base article sur la création d'un service qui devrait vous aider à démarrer.

Il y a un modèle de projet pour un service Windows installé par défaut dans Visual Studio 2008:

"Fichier> Nouveau> Projet> Visual C#> de Windows> Service Windows"

+0

Merci, je pourrais être en mesure de retravailler cela.À ce stade, je m'en fous si elle fonctionne au démarrage avant de se connecter maintenant, mais les problèmes de cheminement deviennent vraiment ennuyeux pour moi. – Codejoy

2

On dirait que vous avez besoin deux programmes ici.

Vous ne pouvez pas exécuter une application dans la zone de notification et l'exécuter avant de vous connecter. La barre d'état système "n'existe pas" jusqu'à ce que l'utilisateur se connecte et dispose d'un bureau valide.

La façon habituelle de gérer cela est de créer deux programmes. Tout d'abord, créez un service Windows qui fait la plus grande partie de votre travail. Cela sera exécuté au démarrage et sera indépendant de toutes les connexions utilisateur.

Ensuite, créez une application en mode utilisateur qui utilise IPC pour communiquer avec le service. Cela peut s'exécuter lors de la connexion, et «parler» au service à distance, fournissant ainsi vos exigences de barre d'état système.

+0

Merci, je pense aussi que j'ai cassé le problème de cheminement en m'assurant juste que tous les chemins utilisent l'appel Application.StartupPath testant cette théorie aujourd'hui ... – Codejoy

Questions connexes