Jak automatycznie uruchomić program jako administrator w systemie Windows 7 podczas uruchamiania?

82

Stworzyłem własną aplikację do kontroli rodzicielskiej, aby monitorować aktywność moich dzieci. Jedynym GUI aplikacji jest ikona paska zadań. Program jest instalowany jako administrator. Chciałbym, aby ten program był uruchamiany automatycznie jako administrator podczas uruchamiania systemu Windows, aby zwykli użytkownicy nie mogli go zabić z poziomu menedżera zadań.

Mogę utworzyć klucz rejestru pod adresem:

HKLM\Software\Microsoft\Windows\CurrentVersion\Run

aby uruchamiał się automatycznie podczas uruchamiania systemu Windows. Problem w tym, że program jest uruchamiany jako zalogowany (standardowy) użytkownik.

Jak mogę sprawić, by działał w trybie podwyższonym? Czy to w ogóle możliwe w Win7?

Nowy człowiek
źródło
1
Być może większym problemem jest to, że program w ogóle się nie uruchamia, jeśli nie ma zalogowanego użytkownika. Jest to mechanizm służący do uruchamiania programu przy logowaniu (jak .loginskrypt w systemie Unix), a nie do uruchamiania podczas uruchamiania (jak w przypadku niektórych /etc/rc/...skryptów).
Kaz
@Kaz: W kontekście tego pytania nie wydaje się to stanowić problemu (chyba że próbujesz obserwować interakcję dziecka z ekranem logowania)
Ben Voigt

Odpowiedzi:

61

Musisz go podłączyć do harmonogramu zadań, tak aby był uruchamiany po zalogowaniu użytkownika, przy użyciu konta użytkownika, który ma dostęp administracyjny do systemu, z najwyższymi uprawnieniami, jakie mają procesy uruchamiane przez to konto.

Jest to implementacja używana do automatycznego uruchamiania procesów z uprawnieniami administratora podczas logowania się jako zwykły użytkownik.

Użyłem go do uruchomienia procesu pomocniczego `` OpenVPN GUI '', który wymaga podwyższonych uprawnień do poprawnego działania, a zatem nie uruchamia się poprawnie z klucza rejestru.

Z wiersza poleceń możesz utworzyć zadanie na podstawie opisu XML tego, co chcesz osiągnąć; na przykład mamy to, wyeksportowane z mojego systemu, które uruchomiłoby Notatnik z najwyższymi uprawnieniami po zalogowaniu:

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

i jest rejestrowany przez wiersz poleceń administratora za pomocą:

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

ta odpowiedź powinna być naprawdę przeniesiona do jednej z innych stron wymiany stosów, ponieważ w rzeczywistości nie jest to pytanie programistyczne jako takie.

Petesh
źródło
Dziękuję bardzo za informację. Spróbuję i zobaczę, jak to działa.
newman
2
„po zalogowaniu się użytkownika” nie oznacza „uruchomienia systemu Windows”.
Kaz
Tak, ale tak naprawdę nie masz pulpitu, którego możesz używać, dopóki się nie zalogujesz
Petesh
6
@Petesh, w jaki sposób otrzymałeś aplikację opartą na interfejsie użytkownika, aby działała w ten sposób? Kiedy używam harmonogramu zadań, mogę uruchomić aplikację, ale nie widzę jej interfejsu użytkownika.
gonzobrains
Zastanawiałem się, czy można to zrobić za pomocą zmian w rejestrze. Jeśli tak, można to zaplanować nawet bez (przed) uruchomieniem systemu operacyjnego.
Sopalajo de Arrierez
40
schtasks /create /sc onlogon /tn MyProgram /rl highest /tr "exeFullPath"
msPark
źródło
2
Czy nie będzie działać w sesji 0 i nie będzie można zobaczyć interfejsu użytkownika? Chciałem tego samego i zrobiło to, ale działało w sesji 0 pod moją nazwą użytkownika, a zatem interfejs użytkownika nie był dostępny
Gautam
4
„onlogon” nie oznacza uruchomienia systemu Windows.
Kaz,
1
W systemie Windows 7 działa na pulpicie użytkownika. Spróbuj z calc.exe.
Vladimir Panteleev
1
@CyberShadow Próbuję to zrobić za pomocą aplikacji, która wymaga uprawnień administratora. Widzę to w menedżerze zadań, ale jego interfejs użytkownika nie jest widoczny.
gonzobrains
2
Dziękuję za odpowiedź. Nasz dział IT niedawno wymusił WŁĄCZENIE UAC za pomocą zasad grupy dla wszystkich komputerów w domenie naszej firmy. Ze smutną konsekwencją tego, że jeśli uruchomisz wiersz polecenia jako administrator, mapowania dysków nie będą dostępne. Wcześniej skonfigurowałem krótki plik .bat do uruchamiania podczas logowania za pomocą klucza rejestru „run”, który konfigurowałby wszystkie mapowania moich dysków. Potrzebowałem sposobu na uruchomienie podobnego .bat dla konta SYSTEM podczas uruchamiania. „schtasks / ru SYSTEM” jest dokładnie tym, czego potrzebowałem.
Zgiń w Sente
15

To jest niemożliwe.
Możesz jednak utworzyć usługę działającą jako administrator.

Usługa może działać automatycznie podczas uruchamiania i komunikować się z istniejącą aplikacją.
Gdy aplikacja musi zrobić coś jako administrator, może poprosić usługę o zrobienie tego za to.

Pamiętaj, że jednocześnie może być zalogowanych wielu użytkowników.

SLaks
źródło
bardzo dziękuję za szybką odpowiedź. W rzeczywistości próbowałem uruchomić aplikację z usługi Windows, ale nie mogłem jej uruchomić. Widziałem program w menedżerze zadań (jako użytkownik SYSTEM), ale ikona nie pojawia się na pasku zadań. Kiedy dodałem Verb = "runas" do StartInfo, pojawił się wyjątek "Za mało miejsca do przetworzenia tego polecenia". Myślę, że może to być spowodowane tym, że nie ma sposobu, aby wyświetlić GUI z prośbą o potwierdzenie.
newman
8
@miliu: Usługa nie może wchodzić w interakcje z użytkownikiem. Musisz stworzyć dwa programy, które komunikują się ze sobą.
SLaks
6

Myślę, że korzystanie z harmonogramu zadań do autostartu programów nie jest zbyt przyjazne dla użytkownika, a czasami ma dla mnie efekty uboczne (np. Ikona tacki programu nie jest dodawana).

Aby temu zaradzić, stworzyłem program o nazwie Elevated Startup, który najpierw uruchamia się ponownie z uprawnieniami administratora, a następnie uruchamia wszystkie pliki w katalogu. Ponieważ podwyższony poziom uruchamiania jest teraz podwyższony, wszystkie programy, które następnie uruchamia, mają również uprawnienia administratora. Katalog znajduje się w menu Start obok klasycznego katalogu startowego i działa bardzo podobnie.

Możesz napotkać jedno okno dialogowe UAC, gdy program uruchomi się ponownie, w zależności od ustawień UAC.

Możesz pobrać program tutaj: https://stefansundin.github.io/elevatedstartup/

stefansundin
źródło
ponieważ jest to ostatnia odpowiedź, chciałbym dodać komentarz. Próbuję zrobić to samo, co OP z moim programem przy użyciu harmonogramu zadań w systemie Windows 10. Jednak uruchamia mój program jako proces w tle, co nie jest tym, czego chcę. Chcę, aby moja aplikacja uruchamiała się normalnie jako administrator. Czy Twój program to uwzględnia?
czw.
Myślę, że tak. Program powinien się uruchomić tak, jakbyś kliknął skrót prawym przyciskiem myszy i użył opcji „Uruchom z uprawnieniami administratora”. Jeśli nie zachowuje się tak, jak chcesz, z przyjemnością dowiem się więcej o Twoim przypadku użycia i sprawię, że program będzie działał dla Ciebie.
stefansundin
3

Ustawianie zgodności aplikacji z administratorem (Run theprogram as an administrator).

Podłącz go task scheduler, a następnie wyłącz UAC.

Wawan
źródło
Ja też mam ten sam problem. Interfejs użytkownika nie jest widoczny. Jakakolwiek pomoc
Senthil Muthiah,
1
@SenthilMuthiah Dzieje się tak dlatego, że Twój program działa jako proces w tle, a nie jako aplikacja. To samo przytrafiło się mnie.
Czw
3

Możesz to zrobić, instalując zadanie podczas pracy jako administrator za pośrednictwem biblioteki TaskSchedler . Zakładam tutaj, że .NET / C # jest odpowiednią platformą / językiem, biorąc pod uwagę powiązane pytania.

Ta biblioteka zapewnia szczegółowy dostęp do interfejsu API harmonogramu zadań, dzięki czemu można dostosować ustawienia, których nie można ustawić w inny sposób za pomocą wiersza poleceń, wywołując schtasks, takie jak priorytet uruchamiania. Będąc aplikacją do kontroli rodzicielskiej, chcesz, aby miała ona priorytet uruchamiania równy 0 (maksymalny), co schtasksspowoduje domyślnie utworzenie priorytetu 7.

Poniżej znajduje się przykład kodu instalowania poprawnie skonfigurowanego zadania startowego, aby podczas logowania uruchamiać żądaną aplikację jako administrator przez czas nieokreślony. Ten kod zainstaluje zadanie dla samego procesu, z którego jest uruchamiane.

/*
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();
    }
}

źródło
To zręczna biblioteka - ale tylko notatka. Przez większość czasu uruchamianie czegoś w „czasie rzeczywistym” nie jest konieczne. I nigdy nie pozbywasz się tdpodziękowań za wskazanie mi tego kierunku.
Andy
1
@Sonic Dzięki za wskazówkę dotyczącą utylizacji. Masz rację, „w czasie rzeczywistym” zwykle nie jest konieczne. Ten kod jest kopiowany z otwartego filtru treści WWW, który napisałem, więc konieczne jest, aby został uruchomiony jak najszybciej.
2

Program, który napisałem, farmComm, może rozwiązać ten problem. Wydałem go jako open source i Public Domain.

Jeśli nie spełnia Twoich kryteriów, możesz łatwo to zmienić, aby to zrobić.

farmComm:

  • Uruchamia się podczas uruchamiania w ramach usługi, co jest kontynuowane, gdy użytkownicy się logują lub wylogowują.
    • W sesji 0
    • Pod użytkownikiem „ZARZĄDZANIE NT \ SYSTEM”.
  • Odradza dowolne procesy (wybierzesz);
    • Również w sesji 0
    • „Niewidocznie” lub bez wyświetlania interfejsu użytkownika / GUI
    • Z dostępem do sprzętu graficznego (np. GPU).
    • Odpowiada na aktywną sesję, nawet jeśli ulegnie zmianie, w tym na Bezpieczny pulpit. Oto jak to:
    • Odradza procesy tylko wtedy, gdy użytkownik jest bezczynny przez 8,5 minuty
    • Kończy odradzanie się, gdy użytkownik wznawia stan bezczynności

Skrypty źródłowe są dostępne tutaj:

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

Alex Hall
źródło
2

Należy również wziąć pod uwagę konsekwencje dla bezpieczeństwa wynikające z uruchamiania procesu jako użytkownik na poziomie administratora lub jako usługa. Jeśli jakiekolwiek wejście nie jest prawidłowo sprawdzane, na przykład jeśli nasłuchuje na interfejsie sieciowym. Jeśli parser dla tych danych wejściowych nie sprawdza poprawności poprawnie, może to być nadużycie i prawdopodobnie prowadzić do exploita, który mógłby uruchomić kod jako użytkownik z podwyższonym poziomem uprawnień. w przykładzie abatishcheva nie powinno to stanowić większego problemu, ale jeśli miałoby zostać wdrożone w środowisku przedsiębiorstwa, należy przeprowadzić ocenę bezpieczeństwa przed wdrożeniem na szeroką skalę.

Curtis
źródło
Niektóre programy wymagają podniesienia uprawnień i niekoniecznie wiążą się z problemami dotyczącymi bezpieczeństwa. Na przykład program, który monitoruje temperaturę systemu i wyświetla ją w obszarze powiadomień, wymagałby podniesienia uprawnień, aby uzyskać dostęp do sprzętu, i musiałby być uruchamiany automatycznie, ale bezpieczeństwo jest dla niego kwestią sporną.
Synetech
-3

Myślę, że harmonogram zadań byłby przesadą (imho). Istnieje folder startowy dla win7.

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

Po prostu utwórz skrót do swojego autostartu Applicaton, edytuj właściwości skrótu i ​​używaj go zawsze jako administrator.

Twoje dzieci mogą to oczywiście zamknąć, ale jeśli są obeznane z technologią, zawsze znajdą sposób, aby Cię chronić. Wiem, że tak było, kiedy byłem młodszy.

Powodzenia!

zhengtonic
źródło
6
To nie zadziała. System Windows zignoruje skróty startowe skonfigurowane do uruchamiania jako administrator.
Vladimir Panteleev,
Naprawdę? Czy próbowałeś? Ponieważ po mojej stronie działa dobrze. Muszę automatycznie uruchomić LogitechSoundManager jako administrator, aby dźwięk przestrzenny działał ...
zhengtonic
Ja też mam ten problem, mimo że skróty w folderze startowym mają zaznaczoną opcję „uruchom jako administrator”, to nadal nie ładują się przy starcie. Czy ktoś wie, jak to naprawić?
ycomp
2
CyberShadow miał rację, UAC komputera był wyłączony. Skróty StartUp, ponieważ admin nie działa ... trzeba użyć harmonogramu zadań
zhengtonic
Odkryłem, że przynajmniej w systemie Windows 10 to nie działa. Jak powiedział @ vladimir-Panteleev, Windows wydaje się po prostu go ignorować.
E. van Putten