Как автоматически запустить программу от имени администратора в 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"
msPark
источник
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

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

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

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

SLaks
источник
Большое спасибо за быстрый ответ. На самом деле я пытался запустить приложение из оконной службы, но не смог заставить его работать. Я мог видеть программу в диспетчере задач (как пользователь 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.

Wawan
источник
У меня такая же проблема. 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 просто игнорирует это.
Э. ван Путтен