[windows] 시작시 Windows 7에서 관리자로 프로그램을 자동으로 실행하는 방법은 무엇입니까?

자녀 활동을 모니터링하기 위해 나만의 자녀 보호 앱을 만들었습니다. 앱의 유일한 GUI는 작업 표시 줄 아이콘입니다. 이 프로그램은 관리자로 설치됩니다. 이 프로그램이 Windows 시작시 관리자로 자동으로 시작되어 표준 사용자가 작업 관리자에서이를 죽일 수 없도록하고 싶습니다.

다음 위치에서 레지스트리 키를 만들 수 있습니다.

HKLM\Software\Microsoft\Windows\CurrentVersion\Run

Windows가 시작될 때 자동으로 실행되도록합니다. 문제는 프로그램이 로그인 한 (표준) 사용자로 시작된다는 것입니다.

관리자 모드에서 실행하려면 어떻게해야합니까? 이것이 Win7에서 가능합니까?



답변

시스템에 대한 관리 액세스 권한이 있고 해당 계정에 의해 시작된 프로세스에 부여되는 최고 권한이있는 사용자 계정을 사용하여 사용자 로그인 후 시작되도록 작업 스케줄러에 연결해야합니다.

일반 사용자로 로그인 할 때 관리 권한으로 프로세스를 자동 시작하는 데 사용되는 구현입니다.

올바르게 작동하려면 상승 된 권한이 필요한 ‘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 사이트 중 하나로 옮겨 져야합니다.


답변

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


답변

이건 불가능 해.
그러나 관리 사용자로 실행되는 서비스를 만들 수 있습니다.

이 서비스는 시작시 자동으로 실행되고 기존 애플리케이션과 통신 할 수 있습니다.
응용 프로그램이 관리자로서 작업을 수행해야하는 경우 서비스에이를 수행하도록 요청할 수 있습니다.

한 번에 여러 사용자가 로그온 할 수 있습니다.


답변

작업 스케줄러를 사용하여 프로그램을 자동 시작하는 것은 매우 사용자 친화적이지 않고 때로는 나에게 부작용이있는 것 같습니다 (예 : 프로그램의 트레이 아이콘이 추가되지 않음).

이 문제를 해결하기 위해 먼저 관리자 권한으로 다시 시작된 다음 디렉터리의 모든 파일을 시작하는 Elevated Startup이라는 프로그램을 만들었습니다. 이제 Elevated Startup이 상승되었으므로 실행되는 모든 프로그램에도 관리자 권한이 부여됩니다. 이 디렉토리는 기본 시작 디렉토리 옆의 시작 메뉴에 있으며 거의 ​​동일하게 작동합니다.

UAC 설정에 따라 프로그램이 자체적으로 다시 시작될 때 하나의 UAC 대화 상자가 나타날 수 있습니다.

여기에서 프로그램을 얻을 수 있습니다 : https://stefansundin.github.io/elevatedstartup/


답변

응용 프로그램의 호환성을 관리자에게 설정합니다 (Run theprogram as an administrator).

에 연결 task scheduler한 다음 전원을 끕니다 UAC.


답변

TaskSchedler 라이브러리 를 통해 관리자 권한으로 실행하는 동안 작업을 설치하면 됩니다. 여기서는 .NET / C #이 관련 질문에 적합한 플랫폼 / 언어라고 가정하고 있습니다.

이 라이브러리는 Task Scheduler 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();
    }
}


답변

내가 작성한 프로그램 인 farmComm이이 문제를 해결할 수 있습니다. 나는 그것을 오픈 소스 및 퍼블릭 도메인으로 출시했습니다.

기준을 충족하지 않는 경우 쉽게 변경할 수 있습니다.

farmComm :

  • 사용자가 로그인하거나 로그 아웃 할 때 계속되는 서비스에서 부팅 할 때 실행됩니다.
    • 세션 0
    • 사용자 “NT AUTHORITY \ SYSTEM”아래에 있습니다.
  • 임의의 프로세스를 생성합니다 (선택).
    • 세션 0에서도
    • “보이지 않게”또는 사용자 인터페이스 / GUI 표시없이
    • 그래픽 하드웨어 (예 : GPU)에 액세스 할 수 있습니다.
    • 보안 데스크톱을 포함하여 변경된 경우에도 활성 세션에 응답합니다. 이것이 방법입니다.
    • 사용자가 8.5 분 동안 유휴 상태 일 때만 프로세스를 생성합니다.
    • 사용자가 유휴 상태에서 재개 할 때 스폰을 종료합니다.

소스 스크립트는 여기에서 사용할 수 있습니다.

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