wake-up-neo.com

Wie kann ich ein Programm unter Windows 7 beim Start automatisch als Administrator ausführen?

Ich habe meine eigene Kindersicherungs-App erstellt, um die Aktivitäten meiner Kinder zu überwachen. Die einzige Benutzeroberfläche der App ist ein Taskleistensymbol. Das Programm wird als admin 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 dafür sorgen, dass es in einem erhöhten Modus ausgeführt wird? Ist das überhaupt in Win7 möglich?

82
newman

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 für Prozesse verfügt, die von diesem Konto gestartet werden.

Dies ist die Implementierung, die zum automatischen Starten von Prozessen mit Administratorrechten verwendet wird, 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 korrekt 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 des gewünschten Ziels erstellen. So haben wir zum Beispiel dieses aus meinem System exportiert, das den Editor mit den höchsten Berechtigungen starten würde, 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 durch eine Administrator-Eingabeaufforderung registriert:

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

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

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

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 zu tun.

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

15
SLaks

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 Taskleistensymbol 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 "Erhöhter Start" jetzt erhöht ist, erhalten alle dann gestarteten Programme 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 ein UAC-Dialogfeld angezeigt wird, wenn das Programm neu gestartet wird.

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

5
stefansundin

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

Stecken Sie es in task scheduler und dann UAC ausschalten.

3
Wawan

Sie können dies tun, indem Sie die Task als Administrator über die TaskSchedler-Bibliothek installieren. An dieser Stelle gehe ich davon aus, dass .NET/C # für Ihre Fragen eine geeignete Plattform/Sprache ist.

Diese Bibliothek bietet Ihnen einen detaillierten Zugriff auf die Taskplaner-API, sodass Sie Einstellungen anpassen können, die Sie sonst nicht über die Befehlszeile festlegen können, indem Sie schtasks aufrufen, z. B. die Priorität des Startvorgangs. Als Kindersicherungsanwendung sollten Sie eine Startpriorität von 0 (maximal) festlegen, wobei schtasks standardmäßig eine Priorität von 7 erstellt.

Im Folgenden finden Sie ein Codebeispiel für die Installation einer ordnungsgemäß konfigurierten Startaufgabe, um die gewünschte Anwendung bei der Anmeldung auf unbestimmte Zeit als Administrator auszuführen. Mit diesem Code wird eine Task für den Prozess installiert, von dem aus sie 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();
    }
}
3
user7000146

Sie sollten auch die Sicherheitsaspekte 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 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, durch den 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.

2
Curtis

Ein Programm, das ich geschrieben habe, farmComm, kann dies 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 einfach ändern, um dies zu tun.

farmComm:

  • Läuft beim Booten unter einem Dienst, der fortgesetzt wird, wenn Benutzer sich anmelden oder abmelden.
    • In Sitzung 0
    • Unter dem Benutzer "NT AUTHORITY\SYSTEM".
  • Erzeugt beliebige Prozesse (Sie wählen);
    • Auch in Session 0
    • "Unsichtbar" oder ohne Anzeige einer Benutzeroberfläche/GUI
    • Mit Zugriff auf Grafikhardware (z. B. GPUs).
    • Reagiert auf die aktive Sitzung, auch wenn sie sich ändert, einschließlich des Secure Desktop. So geht's:
    • Es werden nur Prozesse erzeugt, nachdem ein Benutzer 8,5 Minuten im Leerlauf war
    • Beendet Spawns, wenn ein Benutzer den Leerlauf wieder aufnimmt

Die Quellenskripte finden Sie hier:

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

2
Alex Hall