Как запустить программу автоматически как администратор на Windows 7 при запуске? - PullRequest
82 голосов
/ 25 марта 2011

Я создал собственное приложение для родительского контроля, чтобы контролировать активность моих детей. Единственный графический интерфейс приложения - это значок на панели задач. Программа установлена ​​как администратор. Я хотел бы, чтобы эта программа запускалась автоматически как пользователь-администратор при запуске Windows, чтобы обычные пользователи не могли убить ее из диспетчера задач.

Я могу создать раздел реестра по адресу:

HKLM\Software\Microsoft\Windows\CurrentVersion\Run

для автоматического запуска при запуске Windows. Проблема в том, что программа запускается как зарегистрированный (стандартный) пользователь.

Как я могу заставить его работать в повышенном режиме? Возможно ли это вообще в Win7?

Ответы [ 9 ]

58 голосов
/ 25 марта 2011

Вам необходимо подключить его к планировщику задач, чтобы он запускался после входа пользователя в систему, используя учетную запись пользователя, имеющего административный доступ в системе, с наивысшими привилегиями, которые предоставляются процессам, запускаемым этой учетной записью.

Это реализация, которая используется для автоматического запуска процессов с правами администратора при входе в систему как обычный пользователь.

Я использовала его для запуска вспомогательного процесса OpenVPN GUI, который требует повышенных правпривилегии для правильной работы и, следовательно, не будут запускаться должным образом из раздела реестра.

Из командной строки вы можете создать задачу из XML-описания того, что вы хотите выполнить;так, например, у нас есть это, экспортированное из моей системы, которое запустит блокнот с самыми высокими привилегиями при входе в систему:

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

, и это будет зарегистрировано в командной строке администратора с помощью:

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

этот ответ действительно должен быть перенесен на один из других сайтов обмена стека, так как на самом деле это не вопрос программирования как таковой.

40 голосов
/ 26 апреля 2012
schtasks /create /sc onlogon /tn MyProgram /rl highest /tr "exeFullPath"
15 голосов
/ 25 марта 2011

Это невозможно.
Тем не менее, вы можете создать службу, которая запускается от имени администратора.

Служба может запускаться автоматически при запуске и взаимодействовать с существующим приложением.
Когда приложению необходимо сделать что-то от имени администратора, оно может попросить службу сделать это за него.

Помните, что несколько пользователей могут войти в систему одновременно.

5 голосов
/ 09 марта 2015

Я думаю, что использование планировщика задач для автозапуска программ не очень удобно для пользователя, и иногда оно имеет побочные эффекты для меня (например, значок на панели задач для программы не добавляется).

Чтобы исправить это, я создал программу под названием Elevated Startup, которая сначала перезапускает себя с правами администратора, затем запускает все файлы в каталоге. Поскольку повышенный запуск теперь повышен, всем запускаемым им программам также предоставляются права администратора. Каталог находится в меню «Пуск» рядом с классическим каталогом «Автозагрузка» и работает практически так же.

При повторном запуске программы вы можете встретить одно диалоговое окно UAC, в зависимости от настроек UAC.

Вы можете получить программу здесь: https://stefansundin.github.io/elevatedstartup/

3 голосов
/ 09 октября 2012

Настройка совместимости вашего приложения с администратором (Run theprogram as an administrator).

Подключите его к task scheduler, затем выключите UAC.

2 голосов
/ 05 февраля 2017

Это можно сделать, установив задачу во время работы от имени администратора с помощью библиотеки TaskSchedler . Здесь я предполагаю, что .NET / C # является подходящей платформой / языком, учитывая ваши связанные вопросы.

Эта библиотека предоставляет вам детальный доступ к API планировщика заданий, поэтому вы можете настраивать параметры, которые иначе нельзя установить через командную строку, вызывая schtasks, например, приоритет запуска. Будучи приложением родительского контроля, вы захотите, чтобы у него был приоритет запуска 0 (максимальный), который schtasks создаст по умолчанию приоритет 7.

Ниже приведен пример кода установки правильно сконфигурированной задачи запуска для запуска нужного приложения от имени администратора на неопределенный срок при входе в систему. Этот код установит задачу для самого процесса, из которого он выполняется.

/*
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();
    }
}
2 голосов
/ 13 апреля 2014

Также следует учитывать последствия для безопасности при запуске процесса как пользователь уровня администратора или как Сервис.Если какой-либо вход не проверяется должным образом, например, если он прослушивает сетевой интерфейс.Если синтаксический анализатор для этого ввода не проверяется должным образом, он может быть использован неправильно и может привести к эксплойту, который может запускать код с повышенными правами.в примере с Абатищевым это не должно быть большой проблемой, но если его развернуть в корпоративной среде, сделайте оценку безопасности до широкомасштабного развертывания.

2 голосов
/ 14 августа 2013

Программа, которую я написал, farmComm, может решить эту проблему.Я выпустил его как открытый исходный код и Public Domain.

Если он не соответствует вашим критериям, вы можете легко изменить его для этого.

farmComm:

  • Запускается при загрузке в службе, которая продолжается, когда пользователи входят или выходят из системы.
    • В сеансе 0
    • Под пользователем "NT AUTHORITY \ SYSTEM."
  • Создает произвольные процессы (по вашему выбору);
    • Также в сеансе 0
    • «Невидимо» или без отображения какого-либо пользовательского интерфейса / графического интерфейса пользователя
    • С доступом к графическому оборудованию (например, графическим процессорам).
    • Реагирует на активный сеанс, даже если он изменяется, включая Secure Desktop.Вот как это:
    • Только порождает процессы после того, как пользователь простаивает в течение 8,5 минут
    • Завершает порождения, когда пользователь выходит из режима ожидания

Исходные скрипты доступны здесь:

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

0 голосов
/ 17 декабря 2013

Я думаю, что планировщик задач будет излишним (imho).Существует папка автозагрузки для win7.

C: \ Users \ miliu \ AppData \ Roaming \ Microsoft \ Windows \ Пуск \ Меню \ Программы \ Запуск

Просто создайте ярлык для автозапуска приложенияредактировать свойства ярлыка и всегда запускать его от имени администратора.

Ваши дети, конечно, могут закрыть его, но если они разбираются в технологиях, они всегда найдут способ не дать вам пройти мимо.Я знаю, что сделал, когда я был моложе.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...