Як запустити програму автоматично як адміністратор у Windows 7 під час запуску?


82

Я створив власний додаток для батьківського контролю для моніторингу активності своїх дітей. Єдиним графічним інтерфейсом програми є значок на панелі завдань. Програма встановлюється як адміністратор. Я хотів би, щоб цю програму запускали автоматично як адміністратора під час запуску Windows, щоб звичайні користувачі не могли вбити її з диспетчера завдань.

Я можу створити ключ реєстру за адресою:

HKLM\Software\Microsoft\Windows\CurrentVersion\Run

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

Як я можу змусити його працювати в підвищеному режимі? Чи можливо це взагалі в Win7?


1
Можливо, більшою проблемою є те, що програма взагалі не запускається, якщо немає авторизованого користувача. Це механізм для запуску програми під час входу (як ваш .loginсценарій на Unix), а не для запуску під час завантаження (як якийсь /etc/rc/...сценарій).
Каз

@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

цю відповідь насправді слід перенести на один з інших сайтів стек-обміну, оскільки насправді це не питання програмування як таке.


велике спасибі за інформацію. Я спробую і подивлюсь, як це працює.
Ньюмен

2
"після входу користувача" - це не "запуск Windows".
Каз

Так, але ви фактично не маєте робочого столу, щоб користуватися ним, поки не увійдете в систему
Петеш,

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

Мені було цікаво, чи існує якийсь спосіб зробити це за допомогою змін реєстру. Якщо так, його можна запланувати навіть без (до) завантаження операційної системи.
Сопалахо де Аррієрес

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

2
Чи не запуститься він у сеансі 0, і ви не зможете побачити інтерфейс ?? Я хотів те саме, і він це зробив, але він працював у сесії 0 під моїм іменем користувача, а отже, інтерфейс був недоступний
Гаутам

4
"onlogon" не є запуском Windows.
Каз

1
У Windows 7 він працює на робочому столі користувача. Спробуйте за допомогою calc.exe.
Володимир Пантелеєв

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

2
Дякую за відповідь. Нещодавно наш ІТ відділ примусив UAC УВІМКНУТИ групову політику для всіх комп’ютерів у домені нашої компанії. З сумним наслідком того, що якщо ви запускаєте командний рядок як адміністратор, ваші зіставлення дисків недоступні. Раніше я створив короткий файл .bat для запуску при вході за допомогою ключа реєстру "запустити", який встановлював би всі мої зіставлення дисків. Мені потрібен був спосіб запуску подібного .bat для облікового запису SYSTEM під час запуску. "schtasks / ru SYSTEM" - саме те, що мені потрібно.
Помер у Сенте

15

Це неможливо.
Однак ви можете створити службу, яка працює під адміністративним користувачем.

Послуга може запускатися автоматично під час запуску та взаємодіяти з наявною програмою.
Коли додатку потрібно щось зробити як адміністратор, він може попросити службу зробити це за нього.

Пам'ятайте, що кілька користувачів можуть увійти в систему одночасно.


велике спасибі за оперативну відповідь. Насправді, я намагався запустити програму із служби вікон, але не зміг змусити її працювати. Я міг бачити програму в диспетчері завдань (як користувач СИСТЕМИ), але піктограма не відображається на панелі завдань. Коли я додаю Verb = "runas" до StartInfo, я отримую виняток "Недостатньо місця для обробки цієї команди". Припускаю, що це може бути тому, що немає можливості відобразити графічний інтерфейс, щоб запитати у користувача підтвердження.
newman

8
@miliu: Послуга не може взаємодіяти з користувачем. Потрібно скласти дві програми, які взаємодіють між собою.
Слакс

6

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

Щоб виправити це, я створив програму під назвою Підвищений запуск, яка спочатку перезапускається із правами адміністратора, а потім запускає всі файли в каталозі. Оскільки підвищений запуск тепер підвищений, всі програми, які він запускає, також отримують права адміністратора. Каталог знаходиться в меню «Пуск» поряд із класичним каталогом запуску і працює майже так само.

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

Ви можете отримати програму тут: https://stefansundin.github.io/elevatedstartup/


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

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

3

Налаштування сумісності вашої програми для адміністратора (Run theprogram as an administrator).

Підключіть його task scheduler, а потім вимкніть UAC.


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

Якщо воно не відповідає вашим критеріям, ви можете легко змінити його для цього.

farmComm:

  • Запускається під час завантаження під службою, яка триває, коли користувачі входять або виходять із системи.
    • На сесії 0
    • Під користувачем "NT AUTHORITY \ SYSTEM."
  • Породжує довільні процеси (ви обираєте);
    • Також у сесії 0
    • "Невидимо", або без відображення будь-якого інтерфейсу користувача / графічного інтерфейсу
    • З доступом до графічного обладнання (наприклад, графічних процесорів).
    • Відповідає на активний сеанс, навіть якщо він змінюється, включаючи безпечний робочий стіл. Ось як це:
    • Процеси породжують лише після того, як користувач не працює 8,5 хвилин
    • Припиняє появу, коли користувач переходить з режиму очікування

Вихідні сценарії доступні тут:

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


2

Ви також повинні врахувати наслідки безпеки, що стосуються запуску процесу як користувач рівня адміністратора або як Сервіс. Якщо будь-який вхід не перевіряється належним чином, наприклад, якщо він прослуховується в мережевому інтерфейсі. Якщо синтаксичний аналізатор для цього вводу не перевіряється належним чином, ним можна зловживати і, можливо, призвести до експлоїту, який може запускати код як підвищений користувач. на прикладі Абатіщева це не повинно становити великих проблем, але якщо воно буде розгорнуто в корпоративному середовищі, зробіть оцінку безпеки перед широкомасштабним розгортанням.


Деякі програми вимагають підвищення і не обов'язково піддаються проблемам безпеки. Наприклад, програмі, яка контролює температуру системи та відображає її в області сповіщень, знадобиться висота для доступу до апаратного забезпечення, і її потрібно буде автоматично запустити, проте безпека для неї є суттєвою проблемою.
Synetech

-3

Я думаю, що планувальник завдань був би надмірним (imho). Існує папка запуску для win7.

C: \ Users \ miliu \ AppData \ Roaming \ Microsoft \ Windows \ Меню "Пуск" \ Programs \ Startup

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

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

Удачі!


6
Це не спрацює. Windows ігноруватиме ярлики запуску, встановлені для роботи в якості адміністратора.
Володимир Пантелеєв

Справді? Ти намагався? Тому що це працює добре на моїй стороні. Мені потрібно автоматично запустити LogitechSoundManager як адміністратор, щоб об'ємний звук працював ...
zhengtonic

У мене також є ця проблема, навіть незважаючи на те, що ярлики в папці запуску мають опцію "запустити від імені адміністратора", вони все одно не завантажуватимуться під час запуску. Хтось знає будь-які способи виправити це?
ycomp

2
CyberShadow мав рацію, UAC комп’ютера був вимкнений. Ярлики StartUp, оскільки адміністратор не працює ... потрібно використовувати планувальник завдань
zhengtonic

Я виявив, що принаймні в Windows 10 це не працює. Як сказав @ vladimir-panteleev, Windows, здається, просто ігнорує це.
E. van Putten
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.