web-dev-qa-db-fra.com

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

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 de barre de 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 sur:

HKLM\Software\Microsoft\Windows\CurrentVersion\Run

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

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

82
newman

Vous devez le connecter au planificateur de tâches, de sorte qu'il soit lancé après la connexion d'un utilisateur, à l'aide d'un compte utilisateur disposant d'un accès administratif sur le système, avec les privilèges les plus élevés accordés aux processus lancés par ce compte.

Cette implémentation est utilisée pour lancer automatiquement des processus dotés de privilèges administratifs lors de la connexion en tant qu'utilisateur ordinaire.

Je l'ai utilisé pour lancer le processus d'assistance 'OpenVPN GUI' qui nécessite des privilèges élevés pour fonctionner correctement et qui ne se lancerait donc pas 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 souhaitez accomplir. Ainsi, par exemple, nous avons ceci, exporté de mon système, qui devrait démarrer 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 une commande administrateur Invite 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 stackexchange, car ce n'est pas réellement une question de programmation en soi.

59
Petesh
schtasks /create /sc onlogon /tn MyProgram /rl highest /tr "exeFullPath"
40
msPark

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

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

N'oubliez pas que plusieurs utilisateurs peuvent être connectés à la fois.

15
SLaks

Je pense que l’utilisation du planificateur de tâches pour lancer automatiquement des programmes n’est pas très conviviale, et cela a parfois eu des effets secondaires pour moi (par exemple, l’icône de la barre des tâches d’un programme n’est pas ajoutée).

Pour remédier à cela, j'ai créé un programme appelé Démarrage accéléré qui se relance tout d'abord avec des privilèges d'administrateur, puis lance tous les fichiers d'un répertoire. Etant donné que Elevated Startup est maintenant élevé, tous les programmes qu’il lance ensuite disposent également de privilèges d’administrateur. Le répertoire se trouve dans le menu de démarrage à côté du répertoire de démarrage classique et fonctionne pratiquement de la même manière.

Vous pouvez rencontrer une boîte de dialogue UAC lorsque le programme se relance, en fonction de vos paramètres UAC.

Vous pouvez obtenir le programme ici: https://stefansundin.github.io/elevatedstartup/

5
stefansundin

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

Branchez-le sur task scheduler, puis désactivez UAC.

3
Wawan

Vous pouvez le faire en installant la tâche lors de l'exécution en tant qu'administrateur via le bibliothèque TaskSchedler . Je pars du principe que .NET/C # est une plate-forme/un langage adapté à vos questions.

Cette bibliothèque vous donne un accès granulaire à l'API du planificateur de tâches. Vous pouvez ainsi ajuster les paramètres que vous ne pourriez pas définir autrement via la ligne de commande en appelant schtasks, telle que la priorité du démarrage. Etant une application de contrôle parental, vous voudrez qu’elle ait une priorité de démarrage de 0 (maximum), ce qui schtasks créera par défaut une priorité de 7.

Vous trouverez ci-dessous un exemple de code d'installation d'une tâche de démarrage correctement configurée pour exécuter l'application souhaitée en tant qu'administrateur indéfiniment à la connexion. Ce code installera une tâche pour le processus même à partir duquel il est exécuté.

/*
Copyright © 2017 Jesse Nicholson  
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/

/// <summary>
/// Used for synchronization when creating run at startup task.
/// </summary>
private ReaderWriterLockSlim m_runAtStartupLock = new ReaderWriterLockSlim();

public void EnsureStarupTaskExists()
{
    try
    {
        m_runAtStartupLock.EnterWriteLock();


        using(var ts = new Microsoft.Win32.TaskScheduler.TaskService())
        {
            // Start off by deleting existing tasks always. Ensure we have a clean/current install of the task.
            ts.RootFolder.DeleteTask(Process.GetCurrentProcess().ProcessName, false);

            // Create a new task definition and assign properties
            using(var td = ts.NewTask())
            {
                td.Principal.RunLevel = Microsoft.Win32.TaskScheduler.TaskRunLevel.Highest;
                // This is not normally necessary. RealTime is the highest priority that
                // there is.
                td.Settings.Priority = ProcessPriorityClass.RealTime;
                td.Settings.DisallowStartIfOnBatteries = false;
                td.Settings.StopIfGoingOnBatteries = false;
                td.Settings.WakeToRun = false;
                td.Settings.AllowDemandStart = false;
                td.Settings.IdleSettings.RestartOnIdle = false;                    
                td.Settings.IdleSettings.StopOnIdleEnd = false;
                td.Settings.RestartCount = 0;                    
                td.Settings.AllowHardTerminate = false;
                td.Settings.Hidden = true;
                td.Settings.Volatile = false;
                td.Settings.Enabled = true;
                td.Settings.Compatibility = Microsoft.Win32.TaskScheduler.TaskCompatibility.V2;
                td.Settings.ExecutionTimeLimit = TimeSpan.Zero;

                td.RegistrationInfo.Description = "Runs the content filter at startup.";

                // Create a trigger that will fire the task at this time every other day
                var logonTrigger = new Microsoft.Win32.TaskScheduler.LogonTrigger();
                logonTrigger.Enabled = true;                    
                logonTrigger.Repetition.StopAtDurationEnd = false;
                logonTrigger.ExecutionTimeLimit = TimeSpan.Zero;
                td.Triggers.Add(logonTrigger);

                // Create an action that will launch Notepad whenever the trigger fires
                td.Actions.Add(new Microsoft.Win32.TaskScheduler.ExecAction(Process.GetCurrentProcess().MainModule.FileName, "/StartMinimized", null));

                // Register the task in the root folder
                ts.RootFolder.RegisterTaskDefinition(Process.GetCurrentProcess().ProcessName, td);
            }
        }                
    }
    finally
    {
        m_runAtStartupLock.ExitWriteLock();
    }
}
3
user7000146

Vous devez également prendre en compte les implications en termes de sécurité de l'exécution d'un processus en tant qu'utilisateur de niveau administrateur ou en tant que service. Si une entrée n’est pas correctement validée, par exemple si elle est à l’écoute sur une interface réseau. Si l'analyseur pour cette entrée ne valide pas correctement, il peut en être abusé et éventuellement conduire à un exploit qui pourrait exécuter du code en tant qu'utilisateur élevé. dans l'exemple de abatishchev, cela ne devrait pas poser trop de problème, mais s'il devait être déployé dans un environnement d'entreprise, effectuez une évaluation de la sécurité avant un déploiement à grande échelle.

2
Curtis

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

Si cela ne répond pas à vos critères, vous pourrez peut-être le modifier facilement.

farmComm:

  • S'exécute au démarrage sous un service, qui continue lorsque les utilisateurs se connectent ou se connectent.
    • En session 0
    • Sous l'utilisateur "NT AUTHORITY\SYSTEM".
  • Génère des processus arbitraires (à vous de choisir);
    • Aussi en session 0
    • "Invisible" ou sans affichage d'interface utilisateur/interface graphique
    • Avec accès au matériel graphique (par exemple, les GPU).
    • Répond à la session active, même si elle change, y compris Secure Desktop. C'est comme ça:
    • Seuls les processus génèrent après qu'un utilisateur est inactif pendant 8,5 minutes
    • Termine les apparitions lorsqu'un utilisateur quitte son poste de travail

Les scripts sources sont disponibles ici:

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

2
Alex Hall