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)

19

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 de 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 ça?

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 ensuite visible lorsque l'utilisateur se connectera réellement?

D'autres idées?

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

Marcus
la source
2
Firedaemon, installez l'application en tant que service, lorsque RDPed est passé à "Session 0" à l'aide de Firedaemon. Voir l'appli.
TheCleaner
Cela pourrait techniquement être fait si vous développez votre propre service.
Ryan Ries
1
Je viens de répondre à ma propre question. Cependant, je ne peux pas accepter ma propre réponse pendant deux jours, car le système ici sur serverfault.com est extrêmement mauvais (la plupart des gens abandonneraient maintenant cette page sans attendre deux jours et laisseraient à jamais la question marquée comme non résolue).
Marcus
2
@Marcus: Les limites de qui peut faire quoi et quand sont destinées à mettre fin à certains abus. Malheureusement, ils causent parfois des inconvénients pour de véritables tentatives de bien faire les choses, mais parfois de tels compromis doivent être faits. Si vous avez une suggestion qui pourrait améliorer la situation (protéger le site au moins aussi bien mais gêner moins les utilisateurs authentiques), il serait préférable de faire part de votre opinion via un site "méta" pertinent ( meta.serverfault.com , meta. stackoverflow.com ) au lieu de se plaindre dans un commentaire que les coureurs du site sont très peu susceptibles de voir.
David Spillett
Comme vous pouvez le voir lors du vote, la réponse que vous souhaitez accepter n'est pas celle que les gens approuvent parce que la façon dont vous essayez de procéder est incorrecte au départ.
JamesRyan

Réponses:

28

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 non plus. É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 aucun pirate professionnel 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.

Marcus
la source
7
Aucun manque de respect (ou downvote), Marcus. Mais si c'est vraiment le type de réponse que vous cherchiez, cette question aurait été plus appropriée pour SuperUser .
Ryan Bolger
2
Il n'a pas été facile de décider quel échange de pile publier.
Marcus
Salut Marcus, j'ai suivi votre réponse mais j'ai un problème pour lancer deux programmes avec GUI au lieu d'un seul. J'ai posté une question dans SuperUser. Si vous pouviez y répondre, ce sera d'une grande aide - superuser.com/questions/902386/…
user2162550
1
En fait, le fait de voter maintenant aussi parce que ce n'est PAS une réponse à la question. La question définit explicitement la connexion à midi - et votre "solution" crée ici une connexion automatique (donc quelqu'un EST connecté). Peut-être pas une fomulation intelligente dans la question, mais la question est telle qu'elle est.
TomTom
1
@TomTom En tant qu'option présentée à un utilisateur final, "Exécuter si l'utilisateur est connecté ou non" pourrait certainement signifier "Vous n'aurez pas à être ici pour faire du babysitting pour vous assurer qu'il démarre."
Aryeh Leib Taurog
16

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 résoudre ça?

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.

TomTom
la source
3
Amen. Je souhaite que plus de fournisseurs d'applications comprennent ce concept.
Ryan Bolger
15
Wow, vous n'êtes pas arrogant dans votre attitude. Eh bien, je suppose que je n'ai pas de chance. Sauf si vous êtes mal informé et que quelqu'un a un moyen de résoudre ce problème, tout le monde ne peut pas tout savoir, vous pourriez donc vous tromper avec la partie absolue "vous ne pouvez pas" de votre message. Je voudrais laisser la question ouverte pour plus de réponses pendant un certain temps, au cas où quelqu'un aurait une solution de contournement rare à partager. Sinon, j'accepte votre réponse.
Marcus
Il est en fait de plus en plus difficile de donner une interface utilisateur à un service de nos jours sur les versions actuelles de Windows, mais ce n'est pas impossible.
MDMoore313
Il n'est pas activement recherché en raison principalement de problèmes de sécurité. Le principal problème ici est que - et vous devez vraiment l'obtenir - si vous affichez une fenêtre dans mon interface utilisateur, je peux exécuter du code dans votre processus. Je peux ensuite vous envoyer des messages Windows et cela a une tonne de choses qui peuvent être exploitées. Normalement, ce n'est pas un problème - car s'il s'agit d'une application utilisateur, je ne peux faire que ce que je pouvais en tant qu'utilisateur ... mais si le service a des privilèges plus élevés, voici le cauchemar de sécurité. C'est pourquoi cela a été fermé il y a de nombreuses années et tous ceux qui ont appris la programmation et lu la documentation devraient avoir lu à ce sujet
TomTom
1
Si vous voulez vraiment y aller, vous pouvez essayer les étapes de coretechnologies.com/WindowsServices/FAQ.html#GUIServices - pas sûr qu'elles fonctionnent toujours dans les fenêtres actuelles mais il existe des moyens de rendre l'accessibilité de l'interface utilisateur - et d'ouvrir tous les problèmes de sécurité .
TomTom
0

Tout Sessiondépend du programme 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 fonctionne sous Session 0, qui a une interface utilisateur étrange qui ne s'affiche pas comme les autres.

Maintenant, si votre programme détecte le explorer.exelancement (ou une autre manière de 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 connecte verra avec plaisir ce que vous faites.

MDMoore313
la source