Wie führe ich ein Programm beim Start automatisch als Administrator unter Windows 7 aus?


82

Ich habe meine eigene Kindersicherungs-App erstellt, um die Aktivitäten meiner Kinder zu überwachen. Die einzige GUI der App ist ein Taskleistensymbol. Das Programm wird als Administrator installiert. Ich möchte, dass dieses Programm beim Start von Windows automatisch als Administrator gestartet wird, damit Standardbenutzer es nicht über den Task-Manager beenden können.

Ich kann einen Registrierungsschlüssel erstellen unter:

HKLM\Software\Microsoft\Windows\CurrentVersion\Run

Damit es beim Start von Windows automatisch ausgeführt wird. Das Problem ist, dass das Programm als angemeldeter (Standard-) Benutzer gestartet wird.

Wie kann ich es in einem erhöhten Modus ausführen lassen? Ist das in Win7 überhaupt möglich?


1
Ein vielleicht größeres Problem ist, dass das Programm überhaupt nicht gestartet wird, wenn kein Benutzer angemeldet ist. Dies ist ein Mechanismus, um ein Programm beim Anmelden auszuführen (wie Ihr .loginSkript unter Unix) und nicht beim Booten (wie bei einigen /etc/rc/...Skripten).
Kaz

@Kaz: Im Zusammenhang mit dieser Frage scheint das kein Problem zu sein (es sei denn, man versucht, die Interaktion des Kindes mit dem Anmeldebildschirm zu beobachten)
Ben Voigt

Antworten:


61

Sie müssen es in den Taskplaner einbinden, sodass es nach der Anmeldung eines Benutzers mit einem Benutzerkonto gestartet wird, das über Administratorzugriff auf das System verfügt und über die höchsten Berechtigungen verfügt, die für von diesem Konto gestartete Prozesse gewährt werden.

Dies ist die Implementierung, mit der Prozesse mit Administratorrechten automatisch gestartet werden, wenn Sie sich als normaler Benutzer anmelden.

Ich habe es verwendet, um den Hilfsprozess 'OpenVPN GUI' zu starten, der erhöhte Berechtigungen benötigt, um ordnungsgemäß zu funktionieren, und daher nicht ordnungsgemäß über den Registrierungsschlüssel gestartet werden kann.

Über die Befehlszeile können Sie die Aufgabe aus einer XML-Beschreibung dessen erstellen, was Sie erreichen möchten. So haben wir zum Beispiel dies aus meinem System exportiert, wodurch der Editor mit den höchsten Berechtigungen gestartet wird, wenn ich mich anmelde:

<?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>

und es wird von einer Administrator-Eingabeaufforderung registriert mit:

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

Diese Antwort sollte wirklich auf eine der anderen Stackexchange-Sites verschoben werden, da es sich eigentlich nicht um eine Programmierfrage an sich handelt.


Vielen Dank für die Info. Ich werde es versuchen und sehen, wie es funktioniert.
Newman

1
"Nach Anmeldung eines Benutzers" ist nicht "Windows-Start".
Kaz

Ja, aber Sie haben tatsächlich keinen Desktop, den Sie verwenden können, bis Sie sich angemeldet haben
Petesh

6
@Petesh Wie haben Sie eine UI-basierte App auf diese Weise ausgeführt? Wenn ich Task Schedule verwende, kann ich eine App ausführen, aber die Benutzeroberfläche wird nicht angezeigt.
Gonzobrains

Ich habe mich gefragt, ob es eine Möglichkeit gibt, dies über Registrierungsänderungen zu tun. Wenn ja, kann dies auch ohne (vor) dem Booten des Betriebssystems geplant werden.
Sopalajo de Arrierez

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

2
Wird es nicht in Sitzung 0 ausgeführt und Sie können die Benutzeroberfläche nicht sehen? Ich wollte dasselbe und es tat es, aber es lief in Sitzung 0 unter meinem Benutzernamen und daher war die Benutzeroberfläche nicht verfügbar
Gautam

4
"onlogon" ist kein Windows-Start.
Kaz

1
Unter Windows 7 wird es auf dem Desktop des Benutzers ausgeführt. Versuchen Sie es mit calc.exe.
Vladimir Panteleev

1
@CyberShadow Ich versuche dies mit einer App zu tun, für die Administratorrechte erforderlich sind. Ich sehe es im Task-Manager, aber seine Benutzeroberfläche ist nicht sichtbar.
Gonzobrains

2
Danke für die Antwort. Unsere IT-Abteilung hat kürzlich die Benutzerkontensteuerung über Gruppenrichtlinien für alle Computer in unserer Unternehmensdomäne erzwungen. Mit der traurigen Folge, dass Ihre Laufwerkszuordnungen nicht verfügbar sind, wenn Sie als Administrator eine Eingabeaufforderung ausführen. Zuvor hatte ich eine kurze .bat-Datei eingerichtet, die bei der Anmeldung über den Registrierungsschlüssel "run" ausgeführt werden sollte, um alle meine Laufwerkszuordnungen einzurichten. Ich brauchte eine Möglichkeit, beim Start ein ähnliches .bat für das SYSTEM-Konto auszuführen. "schtasks / ru SYSTEM" ist genau das, was ich brauchte.
Stirb in Sente

15

Das ist nicht möglich.
Sie können jedoch einen Dienst erstellen, der unter einem Administrator ausgeführt wird.

Der Dienst kann beim Start automatisch ausgeführt werden und mit Ihrer vorhandenen Anwendung kommunizieren.
Wenn die Anwendung als Administrator etwas tun muss, kann sie den Dienst bitten, dies für sie zu tun.

Denken Sie daran, dass mehrere Benutzer gleichzeitig angemeldet sein können.


Vielen Dank für die schnelle Antwort. Eigentlich habe ich versucht, die App über einen Windows-Dienst auszuführen, konnte sie jedoch nicht zum Laufen bringen. Ich konnte das Programm im Task-Manager (als SYSTEM-Benutzer) sehen, aber das Symbol wird nicht in der Taskleiste angezeigt. Wenn ich StartInfo Verb = "runas" hinzufüge, wird die Ausnahme "Es ist nicht genügend Speicher verfügbar, um diesen Befehl zu verarbeiten" angezeigt. Ich denke, das kann daran liegen, dass es keine Möglichkeit gibt, eine GUI zu öffnen, um den Benutzer um Bestätigung zu bitten.
Newman

8
@miliu: Ein Dienst kann nicht mit dem Benutzer interagieren. Sie müssen zwei Programme erstellen, die miteinander kommunizieren.
SLaks

5

Ich denke, dass die Verwendung des Taskplaners zum automatischen Starten von Programmen nicht sehr benutzerfreundlich ist und manchmal Nebenwirkungen für mich hatte (z. B. wird kein Tray-Symbol für ein Programm hinzugefügt).

Um dies zu beheben, habe ich ein Programm namens Elevated Startup erstellt, das sich zuerst mit Administratorrechten neu startet und dann alle Dateien in einem Verzeichnis startet. Da der erhöhte Start jetzt erhöht ist, erhalten alle Programme, die dann gestartet werden, auch Administratorrechte. Das Verzeichnis befindet sich im Startmenü neben dem klassischen Startverzeichnis und funktioniert ähnlich.

Abhängig von Ihren UAC-Einstellungen kann es vorkommen, dass beim Neustart des Programms ein UAC-Dialogfeld angezeigt wird.

Sie können das Programm hier herunterladen : https://stefansundin.github.io/elevatedstartup/


Da dies die jüngste Antwort ist, möchte ich einen Kommentar hinzufügen. Ich versuche, dasselbe wie das OP mit meinem Programm unter Verwendung des Taskplaners unter Windows 10 zu tun. Es startet jedoch mein Programm als Hintergrundprozess, was nicht das ist, was ich will. Ich möchte, dass meine Anwendung als Administrator normal gestartet wird. Berücksichtigt Ihr Programm dies?
Do

Ich glaube es würde. Das Programm sollte so starten, als hätten Sie mit der rechten Maustaste auf die Verknüpfung geklickt und "Mit Administratorrechten ausführen" verwendet. Wenn es sich nicht so verhält, wie Sie es möchten, würde ich mich freuen, mehr über Ihren Anwendungsfall zu erfahren und das Programm für Sie arbeiten zu lassen.
Stefansundin

3

Festlegen der Kompatibilität Ihrer Anwendung mit dem Administrator (Run theprogram as an administrator).

Stecken Sie es ein task schedulerund schalten Sie es aus UAC.


Ich habe auch das gleiche Problem. Benutzeroberfläche ist nicht sichtbar. Jede Hilfe
Senthil Muthiah

1
@SenthilMuthiah Das liegt daran, dass Ihr Programm als Hintergrundprozess und nicht als Anwendung ausgeführt wird. Das gleiche ist mir passiert.
Do

3

Sie können dies tun, indem Sie die Aufgabe installieren, während Sie als Administrator über die TaskSchedler-Bibliothek ausgeführt werden . Ich gehe hier davon aus, dass .NET / C # angesichts Ihrer Fragen eine geeignete Plattform / Sprache ist.

Über diese Bibliothek erhalten Sie detaillierten Zugriff auf die Taskplaner-API, sodass Sie Einstellungen anpassen können, die Sie ansonsten nicht über die Befehlszeile festlegen können schtasks, z. B. die Priorität des Startvorgangs. Als Kindersicherungsanwendung sollten Sie eine Startpriorität von 0 (maximal) haben, wodurch schtasksstandardmäßig eine Priorität von 7 erstellt wird.

Unten finden Sie ein Codebeispiel für die Installation einer ordnungsgemäß konfigurierten Startaufgabe, um die gewünschte Anwendung als Administrator bei der Anmeldung auf unbestimmte Zeit auszuführen. Dieser Code installiert eine Aufgabe für den Prozess, von dem aus er ausgeführt wird.

/*
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();
    }
}

Das ist eine schicke Bibliothek - aber nur eine Notiz. Etwas in "Echtzeit" auszuführen ist die meiste Zeit nicht notwendig. Und Sie verfügen nie über tdDanke, dass Sie mich in diese Richtung weisen.
Andy

1
@Sonic Danke für den Tipp zur Entsorgung. Sie haben Recht, "Echtzeit" ist normalerweise nicht notwendig. Dieser Code wird von einem Open-Source-Filter für Webinhalte kopiert, den ich geschrieben habe. Daher muss er so schnell wie möglich gestartet werden.

2

Ein Programm, das ich geschrieben habe, farmComm, könnte dieses Problem lösen. Ich habe es als Open Source und Public Domain veröffentlicht.

Wenn es Ihren Kriterien nicht entspricht, können Sie es möglicherweise leicht ändern, um dies zu tun.

farmComm:

  • Wird beim Booten unter einem Dienst ausgeführt, der fortgesetzt wird, wenn sich Benutzer anmelden oder abmelden.
    • In Sitzung 0
    • Unter dem Benutzer "NT AUTHORITY \ SYSTEM".
  • Erzeugt beliebige Prozesse (Sie wählen);
    • Auch in Sitzung 0
    • "Unsichtbar" oder ohne Anzeige einer Benutzeroberfläche / GUI
    • Mit Zugriff auf Grafikhardware (zB GPUs).
    • Reagiert auf die aktive Sitzung, auch wenn sie sich ändert, einschließlich des sicheren Desktops. So ist es:
    • Spawnt Prozesse erst, nachdem ein Benutzer 8,5 Minuten lang inaktiv war
    • Beendet Spawns, wenn ein Benutzer aus dem Leerlauf zurückkehrt

Die Quellenskripte finden Sie hier:

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


2

Sie sollten auch die Sicherheitsauswirkungen berücksichtigen, die sich aus der Ausführung eines Prozesses als Benutzer auf Administratorebene oder als Dienst ergeben. Wenn eine Eingabe nicht ordnungsgemäß überprüft wird, z. B. wenn sie über eine Netzwerkschnittstelle abgehört wird. Wenn der Parser für diese Eingabe nicht ordnungsgemäß überprüft wird, kann er missbraucht werden und möglicherweise zu einem Exploit führen, bei dem Code als Benutzer mit erhöhten Rechten ausgeführt werden kann. In Abatishchevs Beispiel sollte dies kein großes Problem sein. Wenn es jedoch in einer Unternehmensumgebung bereitgestellt werden soll, führen Sie vor einer umfassenden Bereitstellung eine Sicherheitsbewertung durch.


Einige Programme erfordern eine Erhöhung und unterliegen nicht unbedingt Sicherheitsproblemen. Zum Beispiel würde ein Programm, das die Systemtemperatur überwacht und im Benachrichtigungsbereich anzeigt, eine Erhöhung benötigen, um auf die Hardware zuzugreifen, und es müsste automatisch ausgeführt werden, aber die Sicherheit ist ein wichtiger Punkt dafür.
Synetech

-3

Ich denke, der Taskplaner wäre übertrieben (imho). Es gibt einen Startordner für win7.

C: \ Benutzer \ miliu \ AppData \ Roaming \ Microsoft \ Windows \ Startmenü \ Programme \ Start

Erstellen Sie einfach eine Verknüpfung für Ihre Autostart-Anwendung, bearbeiten Sie die Eigenschaften der Verknüpfung und lassen Sie sie immer als Administrator ausführen.

Ihre Kinder könnten es natürlich schließen, aber wenn sie technisch versiert sind, finden sie immer einen Weg, Sie fernzuhalten. Ich weiß, dass ich es getan habe, als ich jünger war.

Viel Glück!


6
Dies wird nicht funktionieren. Windows ignoriert Startverknüpfungen, die als Administrator ausgeführt werden sollen.
Vladimir Panteleev

"Ja wirklich?" Hast du es versucht? Weil es auf meiner Seite gut funktioniert. Ich muss meinen LogitechSoundManager als Administrator automatisch starten, damit der Surround-Sound funktioniert ...
zhengtonic

Ich habe auch dieses Problem, obwohl die Verknüpfungen im Startordner die Option "Als Administrator ausführen" aktiviert haben, werden sie beim Start immer noch nicht geladen. Kennt jemand Möglichkeiten, dies zu beheben?
ycomp

2
CyberShadow hatte Recht, die Benutzerkontensteuerung des Computers war ausgeschaltet. StartUp-Verknüpfungen, da der Administrator nicht funktioniert ... man muss den Taskplaner verwenden
zhengtonic

Ich habe zumindest unter Windows 10 festgestellt, dass dies nicht funktioniert. Wie @ vladimir-panteleev sagte, scheint Windows es einfach zu ignorieren.
E. van Putten
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.