web-dev-qa-db-fra.com

Démarrer le programme au démarrage de l'ordinateur lorsque personne n'est connecté et afficher la fenêtre lorsque quelqu'un se connecte (OS: Windows)

J'ai un programme qui est lancé au démarrage du système à l'aide du Planificateur de tâches sur Windows Server 2012. Le programme doit démarrer même si l'ordinateur redémarre automatiquement.

L'administrateur est le compte utilisé pour démarrer le programme, l'option "Exécuter si l'utilisateur est connecté ou non" est cochée pour la tâche.

Le problème est que lorsque quelqu'un se connecte finalement en tant qu'administrateur à l'aide de la connexion Bureau à distance, l'interface (fenêtre du programme) est masquée.

Si je comprends bien, il n'y a aucun moyen de résoudre ce problème en utilisant le Planificateur de tâches.

Comment puis-je résoudre ce problème?

Ce devrait être un problème assez courant, mais je ne trouve rien en cherchant sur le net. Je suis assez surpris que Microsoft autorise une telle limitation dans leur planificateur. Puis-je créer un VBScript ou quelque chose qui s'exécute au démarrage et lance le programme qui sera alors visible lorsque l'utilisateur se connectera réellement?

D'autres idées?

(Je ne veux pas avoir à créer un programme GUI uniquement séparé qui se connecte au programme d'origine en passant. Je le préférerais également si je n'ai pas à terminer le déjà -exécution du programme à la connexion de l'utilisateur, puis relancez-le.)

20
Marcus

J'ai compris comment le faire moi-même. C'est en quelque sorte une solution de contournement, mais c'est ce à quoi je m'attendais.

Arrêtez! Ne grincez pas tout de suite. Continuer à lire...

  • Exécutez-le, définissez-le pour que l'administrateur se connecte automatiquement.

  • Créez une tâche dans le Planificateur de tâches. Définissez-le pour qu'il s'exécute uniquement lorsque l'utilisateur (administrateur) est connecté. Le déclencheur est "à la connexion" et spécifiez que ce n'est que lorsque l'administrateur se connecte.

  • Créez une deuxième tâche. Exécuter uniquement lorsque l'utilisateur est connecté, déclencher lors de la connexion administrateur. L'action doit être "démarrer un programme" et le programme est "C:\Windows\System32\rundll32.exe" avec le champ d'argument défini sur "user32.dll, LockWorkStation".

Ce qui se passe maintenant si vous redémarrez l'ordinateur, c'est que l'administrateur se connecte automatiquement, le programme que vous souhaitez démarrer est démarré et le poste de travail se verrouille. Si je me connecte via Remote Desktop Connection, je peux voir la fenêtre du programme et utiliser l'interface graphique. Je peux verrouiller/déverrouiller l'ordinateur sans problème et déconnecter/reconnecter à ma guise. Il n'y a aucun problème si je vais sur le serveur et me connecte au poste de travail réel. Étant donné que l'administrateur est déjà connecté, la tâche ne s'exécutera pas à nouveau (elle ne crée pas une boucle de verrouillage de connexion infinie dont vous ne pouvez pas sortir).

Aussi simple que cela. Certes, il y a un délai d'une seconde avant que l'ordinateur ne se verrouille après la connexion automatique et je suppose qu'un pirate professionnel avec un accès physique à l'ordinateur pourrait faire quelque chose de sournois pendant cette fenêtre de temps, mais dans mon cas, je peux ignorer ce risque de sécurité. Tant que je ne laisse pas de pirates professionnels entrer chez moi et que je leur montre l'ordinateur, le système doit être relativement sûr. Surtout, il n'y a pas beaucoup de valeur sur l'ordinateur qui nécessite une protection super-coffre-fort, donc je suis assez satisfait de cette solution.

29
Marcus

J'ai un programme qui est lancé au démarrage du système à l'aide du Planificateur de tâches sur Windows Server 2012. Le programme doit démarrer même si l'ordinateur redémarre automatiquement.

Alors pourquoi n'en faites-vous pas un service système, comme le définissent les spécifications Windows?

Comment puis-je resoudre ceci?

Vous ne pouvez pas. Les programmes d'arrière-plan ne sont pas censés interagir avec l'interface utilisateur. Ou: l'interface utilisateur doit exécuter son propre programme qui se connecte ensuite au service. L'interface utilisateur exécutée dans l'espace utilisateur de l'utilisateur connecté effectue la présentation, le service Windows effectue le traitement. C'est ainsi que le modèle est conçu pour une quinzaine d'années.

Je suis assez surpris que Microsoft autorise une telle limitation dans leur planificateur.

Je suis plus surpris que vous n'ayez jamais hésité à demander pourquoi.

Il y a plusieurs problèmes:

  • Lorsque plusieurs personnes sont connectées, qui obtient l'interface utilisateur?
  • Lorsque l'utilisateur se déconnecte, vous tuez le programme? AIE.
  • Sécurité. Le programme d'arrière-plan peut s'exécuter sous des droits limités - exposer l'interface utilisateur à l'utilisateur signifie que l'utilisateur peut y exécuter du code. Le modèle de messagerie Windows est - ah - plein de problèmes.

Je ne veux pas avoir à créer un programme GUI séparé uniquement qui se connecte au programme d'origine en passant.

Ni moi ni Microsoft ne se soucient à ce stade de ce que vous aimez faire. Il existe un modèle établi et pris en charge pour lier le traitement en arrière-plan à une interface utilisateur utilisateur connectée - utilisez-le ou non. Mais sinon, ne vous plaignez pas des problèmes de sécurité que vous posez.

17
TomTom

Il s'agit de Session dans lequel votre programme s'exécute. Si personne n'est connecté, il n'y a pas de session interactive à afficher sous, je crois qu'il s'exécute sous Session 0, qui a une interface utilisateur étrange qui n'apparaît pas comme les autres.

Maintenant, si votre programme détecte quand Explorer.exe se lance (ou d'une autre manière pour détecter la connexion de l'utilisateur) et se remémore par magie ou a engendré un processus enfant sur ce nouvel identifiant de session, alors quiconque se connectera verra avec plaisir ce que vous faites.

0
MDMoore313