Как автоматически запустить программу от имени администратора в Windows 7 при запуске?


82

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

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

HKLM\Software\Microsoft\Windows\CurrentVersion\Run

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

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


1
Возможно, более серьезная проблема заключается в том, что программа вообще не запускается, если нет зарегистрированного пользователя. Это механизм для запуска программы при входе в систему (например, ваш .loginсценарий в Unix), а не для запуска во время загрузки (например, какой-либо /etc/rc/...сценарий).
Kaz

@Kaz: В контексте этого вопроса это не кажется проблемой (если не пытаться наблюдать за взаимодействием ребенка с экраном входа в систему)
Бен Войгт,

Ответы:


61

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

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

Я использовал его для запуска вспомогательного процесса «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

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


Спасибо Вам большое за информацию. Попробую и посмотрю, как работает.
Newman

2
«после входа пользователя в систему» ​​не означает «запуск Windows».
Kaz

Да, но на самом деле у вас нет рабочего стола, пока вы не
войдете

6
@Petesh, как вы заставили приложение на основе пользовательского интерфейса работать таким образом? Когда я использую расписание задач, я могу запустить приложение, но не вижу его пользовательского интерфейса.
gonzobrains

Мне было интересно, есть ли способ сделать это с помощью изменений реестра. Если да, то его можно запланировать даже без (до) загрузки операционной системы.
Sopalajo de Arrierez

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

2
Разве он не будет работать в сеансе 0, и вы не сможете увидеть пользовательский интерфейс? Я хотел то же самое, и он сделал это, но он работал в сеансе 0 под моим именем пользователя, и, следовательно, пользовательский интерфейс был недоступен
Гаутам

4
«onlogon» - это не запуск Windows.
Kaz

1
В Windows 7 он запускается на рабочем столе пользователя. Попробуйте с помощью calc.exe.
Владимир Пантелеев

1
@CyberShadow Я пытаюсь сделать это с помощью приложения, требующего прав администратора. Я вижу это в диспетчере задач, но его пользовательский интерфейс не отображается.
gonzobrains

2
Спасибо за ответ. Наш ИТ-отдел недавно принудительно включил UAC через групповую политику для всех компьютеров в домене нашей компании. К печальным последствиям: если вы запустите командную строку от имени администратора, сопоставления дисков будут недоступны. Раньше я настраивал короткий файл .bat для запуска при входе в систему через раздел реестра «run», который настраивал все мои сопоставления дисков. Мне нужен был способ запустить аналогичный .bat для учетной записи SYSTEM при запуске. "schtasks / ru SYSTEM" - именно то, что мне нужно.
Die in Sente

15

Это невозможно.
Однако вы можете создать службу, работающую от имени администратора.

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

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


Большое спасибо за быстрый ответ. На самом деле я пытался запустить приложение из оконной службы, но не смог заставить его работать. Я мог видеть программу в диспетчере задач (как пользователь SYSTEM), но значок не отображается на панели задач. Когда я добавляю Verb = "runas" в StartInfo, я получаю исключение «Недостаточно памяти для обработки этой команды». Я предполагаю, что это может быть потому, что нет возможности открыть графический интерфейс, чтобы запросить у пользователя подтверждение.
Newman

8
@miliu: Сервис не может взаимодействовать с пользователем. Вам нужно сделать две программы, которые взаимодействуют друг с другом.
SLaks

6

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

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

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

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


так как это недавний ответ, я хотел бы добавить комментарий. Я пытаюсь сделать то же самое, что и OP, с моей программой, используя планировщик задач в Windows 10. Однако он запускает мою программу как фоновый процесс, чего я не хочу. Я хочу, чтобы мое приложение нормально запускалось от имени администратора. Учитывает ли это ваша программа?
ThN

Я верю, что да. Программа должна запуститься, как если бы вы щелкнули правой кнопкой мыши ярлык и использовали «Запуск с правами администратора». Если он ведет себя не так, как вы хотите, я буду рад узнать больше о вашем варианте использования и заставить программу работать на вас.
stefansundin

3

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

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


У меня такая же проблема. UI не виден. Любая помощь
Senthil Muthiah

1
@SenthilMuthiah Это потому, что ваша программа запускается как фоновый процесс, а не как приложение. Со мной случилось то же самое.
ThN

3

Вы можете сделать это, установив задачу при работе от имени администратора через библиотеку 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();
    }
}

Это отличная библиотека - только примечание. В большинстве случаев запускать что-либо в режиме реального времени необязательно. И вы никогда не избавитесь от tdблагодарности за то, что указали мне в этом направлении.
Энди

1
@Sonic Спасибо за подсказку об утилизации. Вы правы, в «реальном времени» обычно нет необходимости. Этот код скопирован из написанного мной фильтра веб-контента с открытым исходным кодом, поэтому необходимо, чтобы он был запущен как можно скорее.

2

Я написал программу farmComm, чтобы решить эту проблему. Я выпустил его как с открытым исходным кодом и как общественное достояние.

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

ферма

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

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

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


2

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


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

-3

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

C: \ Users \ miliu \ AppData \ Roaming \ Microsoft \ Windows \ Start Menu \ Programs \ Startup

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

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

Удачи!


6
Так не пойдет. Windows игнорирует ярлыки запуска, настроенные для запуска от имени администратора.
Владимир Пантелеев

В самом деле? Ты пробовала? Потому что он отлично работает на моей стороне. Мне нужно автоматически запустить LogitechSoundManager в качестве администратора, чтобы объемный звук работал ...
zhengtonic

У меня тоже есть эта проблема, хотя для ярлыков в папке автозагрузки установлен флажок «Запуск от имени администратора», они все равно не загружаются при запуске. Кто-нибудь знает способы исправить это?
ycomp 01

2
CyberShadow был прав, UAC компьютера был выключен. Ярлыки автозагрузки в качестве администратора не работают ... нужно использовать планировщик задач
zhengtonic 01

Я обнаружил, что, по крайней мере, в Windows 10 это не работает. Как сказал @ vladimir-panteleev, Windows просто игнорирует это.
Э. ван Путтен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.