82 votes

Comment exécuter un programme automatiquement en tant qu'administrateur au démarrage de Windows 7 ?

J'ai créé ma propre application de contrôle parental pour surveiller l'activité de mes enfants. La seule interface graphique de l'application est une icône dans la barre des tâches. Le programme est installé en tant qu'administrateur. J'aimerais que ce programme soit lancé automatiquement en tant qu'utilisateur admin au démarrage de Windows, afin que les utilisateurs standard ne puissent pas le tuer à partir du gestionnaire de tâches.

Je peux créer une clé de registre à :

HKLM\Software\Microsoft\Windows\CurrentVersion\Run

pour qu'il s'exécute automatiquement au démarrage de Windows. Le problème est que le programme est lancé en tant qu'utilisateur (standard) connecté.

Comment puis-je le faire fonctionner en mode élevé ? Est-ce possible dans Win7 ?

1 votes

Un problème peut-être plus important est que le programme est pas ne démarre pas du tout s'il n'y a pas d'utilisateur connecté. Il s'agit d'un mécanisme permettant de lancer un programme lors de la connexion (comme votre .login script sur Unix), et non pas à exécuter au moment du démarrage (comme certaines /etc/rc/... script).

0 votes

@Kaz : Dans le contexte de cette question, cela ne semble pas être un problème (à moins d'essayer d'observer l'interaction des enfants avec l'écran de connexion).

61voto

Petesh Points 29374

Vous devez le brancher sur le planificateur de tâches, de sorte qu'il soit lancé après la connexion d'un utilisateur, en utilisant un compte d'utilisateur qui a un accès administratif sur le système, avec les privilèges les plus élevés qui sont accordés aux processus lancés par ce compte.

Il s'agit de l'implémentation utilisée pour démarrer automatiquement les processus avec des privilèges administratifs lors de la connexion en tant qu'utilisateur ordinaire.

Je l'ai utilisé pour lancer le processus d'aide 'OpenVPN GUI' qui a besoin de privilèges élevés pour fonctionner correctement, et donc ne pourrait pas être lancé correctement à partir de la clé de registre.

À partir de la ligne de commande, vous pouvez créer la tâche à partir d'une description XML de ce que vous voulez accomplir ; ainsi, par exemple, nous avons ceci, exporté de mon système, qui lancerait le bloc-notes avec les privilèges les plus élevés lorsque je me connecte :

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2015-01-27T18:30:34</Date>
    <Author>Pete</Author>
  </RegistrationInfo>
  <Triggers>
    <LogonTrigger>
      <StartBoundary>2015-01-27T18:30:00</StartBoundary>
      <Enabled>true</Enabled>
    </LogonTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>CHUMBAWUMBA\Pete</UserId>
      <LogonType>InteractiveToken</LogonType>
      <RunLevel>HighestAvailable</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
    <AllowHardTerminate>true</AllowHardTerminate>
    <StartWhenAvailable>false</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>true</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
    <Priority>7</Priority>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>"c:\windows\system32\notepad.exe"</Command>
    </Exec>
  </Actions>
</Task>

et il est enregistré par un administrateur à l'invite de commande en utilisant :

schtasks /create /tn "start notepad on login" /xml startnotepad.xml

cette réponse devrait vraiment être déplacée vers l'un des autres sites de stackexchange, car il ne s'agit pas d'une question de programmation à proprement parler.

0 votes

Merci beaucoup pour l'information. Je vais l'essayer et voir comment cela fonctionne.

2 votes

"après la connexion d'un utilisateur" n'est pas "le démarrage de Windows".

0 votes

Oui, mais vous n'avez pas de bureau à utiliser tant que vous ne vous êtes pas connecté.

40voto

msPark Points 169
schtasks /create /sc onlogon /tn MyProgram /rl highest /tr "exeFullPath"

2 votes

Ne va-t-il pas s'exécuter en session 0 et vous ne pourrez pas voir l'interface utilisateur ? Je voulais la même chose et il l'a fait mais il fonctionnait en session 0 sous mon nom d'utilisateur et donc l'interface utilisateur n'était pas disponible.

4 votes

"onlogon" n'est pas le démarrage de Windows.

1 votes

Sous Windows 7, il s'exécute sur le bureau de l'utilisateur. Essayez-le avec calc.exe.

15voto

SLaks Points 391154

Ce n'est pas possible.
Cependant, vous pouvez créer un service qui fonctionne sous un utilisateur administratif.

Le service peut s'exécuter automatiquement au démarrage et communiquer avec votre application existante.
Lorsque l'application a besoin de faire quelque chose en tant qu'administrateur, elle peut demander au service de le faire pour elle.

N'oubliez pas que plusieurs utilisateurs peuvent être connectés en même temps.

0 votes

Merci beaucoup pour votre réponse rapide. En fait, j'ai essayé d'exécuter l'application à partir d'un Service Window, mais je n'ai pas réussi à le faire fonctionner. J'ai pu voir le programme dans le gestionnaire de tâches (en tant qu'utilisateur SYSTEM), mais l'icône ne s'affiche pas dans la barre des tâches. Lorsque j'ajoute Verb="runas" à StartInfo, j'obtiens une exception "Not enough storage is available to process this command". Je suppose que cela peut être dû au fait qu'il n'y a aucun moyen de faire apparaître une interface graphique pour demander à l'utilisateur une confirmation.

8 votes

@miliu : Un service ne peut pas interagir avec l'utilisateur. Vous devez créer deux programmes qui communiquent entre eux.

3voto

Wawan Points 21

Définition de la compatibilité de votre application avec l'administrateur (Run theprogram as an administrator) .

Branchez-le sur task scheduler puis éteindre UAC .

0 votes

J'ai également le même problème. L'interface utilisateur n'est pas visible. Je peux vous aider ?

1 votes

@SenthilMuthiah C'est parce que votre programme est exécuté comme un processus d'arrière-plan et non comme une application. La même chose m'est arrivée.

2voto

Alex Hall Points 31

Un programme que j'ai écrit, farmComm, peut résoudre ce problème. Je l'ai publié en tant que source ouverte et dans le domaine public.

S'il ne répond pas à vos critères, vous pourrez peut-être le modifier facilement pour qu'il y réponde.

farmComm :

  • S'exécute au démarrage sous la forme d'un service, qui continue lorsque les utilisateurs se connectent ou se déconnectent.
    • En session 0
    • Sous l'utilisateur "AUTORITÉ NT \SYSTEM. "
  • Lance des processus arbitraires (à vous de choisir) ;
    • Également dans la session 0
    • "Invisiblement", ou sans montrer d'interface utilisateur/GUI
    • Avec un accès au matériel graphique (par exemple, les GPU).
    • Répond à la session active, même si elle change, y compris le Secure Desktop. C'est ainsi :
    • Ne crée des processus qu'après une période d'inactivité de 8,5 minutes.
    • Termine les spawns lorsque l'utilisateur sort de l'inactivité.

Les scripts sources sont disponibles ici :

https://github.com/r-alex-hall/farmComm

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X