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?
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.
schtasks /create /sc onlogon /tn MyProgram /rl highest /tr "exeFullPath"
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.
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/
Festlegen der Kompatibilität Ihrer Anwendung mit dem Administrator (Run theprogram as an administrator)
.
Stecken Sie es in task scheduler
und dann UAC
ausschalten.
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();
}
}
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.
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:
Die Quellenskripte finden Sie hier: