起動時にWindows7で管理者としてプログラムを自動的に実行するにはどうすればよいですか?


82

子供の活動を監視するために、独自のペアレンタルコントロールアプリを作成しました。アプリの唯一のGUIはタスクバーアイコンです。プログラムは管理者としてインストールされます。このプログラムをWindowsの起動時に管理者ユーザーとして自動的に起動し、標準ユーザーがタスクマネージャーからプログラムを強制終了できないようにします。

レジストリキーは次の場所で作成できます。

HKLM\Software\Microsoft\Windows\CurrentVersion\Run

Windowsの起動時に自動的に実行されるようにします。問題は、プログラムがログインした(標準の)ユーザーとして起動されることです。

どうすれば昇格モードで実行できますか?これはWin7でまったく可能ですか?


1
おそらくより大きな問題は、ログインしているユーザーがいない場合、プログラムがまったく起動しないことです。これは、(.loginUnixのスクリプトのように)ログイン時にプログラムを実行するメカニズムであり、(一部の/etc/rc/...スクリプトのように)起動時に実行するのではありません。
kaz 2012

@Kaz:この質問の文脈では、それは問題ではないようです(ログイン画面での子供の相互作用を観察しようとしない限り)
Ben Voigt

回答:


61

これをタスクスケジューラにプラグインして、ユーザーのログイン後に、システムの管理アクセス権を持つユーザーアカウントを使用して起動するようにする必要があります。このアカウントは、そのアカウントによって起動されるプロセスに与えられる最高の特権を備えています。

これは、通常のユーザーとしてログインするときに、管理者権限でプロセスを自動起動するために使用される実装です。

これを使用して「OpenVPNGUI」ヘルパープロセスを起動しましたが、正しく機能するには昇格された権限が必要であるため、レジストリキーから正しく起動しませんでした。

コマンドラインから、実行したいことの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

この回答は、実際にはプログラミングの質問ではないため、実際には他のスタック交換サイトの1つに移動する必要があります。


情報ありがとうございます。試してみて、どのように機能するかを確認します。
ニューマン2011年

1
「ユーザーのログイン後」は「Windowsの起動」ではありません。
kaz 2012

はい。ただし、ログインするまで実際に使用できるデスクトップはありません
Petesh 2012

6
@PeteshどのようにしてUIベースのアプリをこのように実行するようになりましたか?タスクスケジュールを使用すると、アプリを実行できますが、UIが表示されません。
gonzobrains 2013

レジストリの変更を介してこれを行う方法があるかどうか疑問に思いました。はいの場合、オペレーティングシステムを起動しなくても(起動する前に)スケジュールすることができます。
Sopalajo de Arrierez 2014

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

2
セッション0で実行され、UIが表示されなくなりますか?私は同じことを望んでいましたが、それは私のユーザー名でセッション0で実行されていたため、UIは利用できませんでした
Gautam 2012

4
「onlogon」はWindowsのスタートアップではありません。
kaz 2012

1
Windows 7では、ユーザーのデスクトップで実行されます。calc.exeで試してみてください。
ウラジミールパンテレエフ2012

1
@Cyber​​Shadow管理者権限が必要なアプリでこれを実行しようとしています。タスクマネージャーに表示されますが、UIが表示されません。
gonzobrains 2013

2
答えてくれてありがとう。私たちのIT部門は最近、会社のドメイン上のすべてのコンピューターに対してグループポリシーを介してUACONを強制しました。管理者としてコマンドプロンプトを実行すると、ドライブマッピングが利用できなくなるという悲しい結果があります。以前は、すべてのドライブマッピングを設定する「run」レジストリキーを介してログオン時に実行する短い.batファイルを設定していました。起動時にSYSTEMアカウントに対して同様の.batを実行する方法が必要でした。「schtasks / ruSYSTEM」はまさに私が必要としていたものです。
2014

15

これは不可能です。
ただし、管理ユーザーの下で実行されるサービスを作成することはできます。

このサービスは起動時に自動的に実行され、既存のアプリケーションと通信できます。
アプリケーションが管理者として何かをする必要があるとき、それはサービスにそれをするように頼むことができます。

複数のユーザーが一度にログオンできることに注意してください。


迅速な回答ありがとうございます。実際、Windowsサービスからアプリを実行しようとしましたが、動作させることができませんでした。タスクマネージャーで(SYSTEMユーザーとして)プログラムを見ることができましたが、アイコンがタスクバーに表示されていません。StartInfoにVerb = "runas"を追加すると、「このコマンドを処理するのに十分なストレージがありません」という例外が発生しました。GUIをポップアップしてユーザーに確認を求める方法がないためかもしれません。
ニューマン2011年

8
@miliu:サービスはユーザーと対話できません。相互に通信する2つのプログラムを作成する必要があります。
SLaks 2011年

6

タスクスケジューラを使用してプログラムを自動起動するのはあまりユーザーフレンドリーではないと思います。また、副作用が発生することもあります(たとえば、プログラムのトレイアイコンが追加されていません)。

これを解決するために、最初に管理者権限で自分自身を再起動し、次にディレクトリ内のすべてのファイルを起動するElevatedStartupというプログラムを作成しました。Elevated Startupが昇格されたため、起動するすべてのプログラムにも管理者権限が付与されます。このディレクトリは、従来のスタートアップディレクトリの隣のスタートメニューにあり、ほとんど同じように機能します。

UACの設定によっては、プログラムが再起動したときに1つのUACダイアログが表示される場合があります。

ここでプログラムを入手できます:https//stefansundin.github.io/elevatedstartup/


これは最近の回答ですので、コメントを追加したいと思います。Windows 10のタスクスケジューラを使用して、プログラムでOPと同じことを実行しようとしていますが、プログラムがバックグラウンドプロセスとして起動するため、必要な処理が行われません。管理者としてアプリケーションを正常に起動したい。あなたのプログラムはこれを説明していますか?
ThN 2015年

私はそうなると信じています。ショートカットを右クリックして「管理者権限で実行」を使用した場合と同じようにプログラムが起動します。期待どおりに動作しない場合は、ユースケースについて詳しく知り、プログラムを機能させることができれば幸いです。
stefansundin 2015年

3

アプリケーションの互換性を管理者に設定します(Run theprogram as an administrator)

に接続しtask scheduler、電源を切りUACます。


私も同じ問題を抱えています。UIは表示されません。どんな助けでも
Senthil Muthiah 2013年

1
@SenthilMuthiahこれは、プログラムがアプリケーションとしてではなく、バックグラウンドプロセスとして実行されるためです。同じことが私にも起こりました。
ThN 2015年

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廃棄についてのヒントをありがとう。そうです、通常「リアルタイム」は必要ありません。このコードは、私が作成したオープンソースのWebコンテンツフィルターからコピーされているため、できるだけ早く起動する必要があります。

2

私が書いたプログラムfarmCommは、これを解決するかもしれません。オープンソースとパブリックドメインとしてリリースしました。

基準を満たしていない場合は、簡単に変更できる可能性があります。

farmComm:

  • サービスの下での起動時に実行され、ユーザーがログインまたはログアウトしたときに続行されます。
    • セッション0で
    • ユーザー「NTAUTHORITY \ SYSTEM」の下。
  • 任意のプロセスを生成します(選択します)。
    • セッション0でも
    • 「目に見えない」、またはユーザーインターフェイス/ GUIを表示しない
    • グラフィックハードウェア(GPUなど)にアクセスできます。
    • セキュアデスクトップを含め、アクティブなセッションが変更された場合でも、アクティブなセッションに応答します。これがその方法です:
    • ユーザーが8.5分間アイドル状態になった後にのみ、プロセスを生成します
    • ユーザーがアイドル状態から再開すると、スポーンを終了します

ソーススクリプトはここから入手できます。

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


2

また、管理者レベルのユーザーまたはサービスとしてプロセスを実行することによるセキュリティへの影響も考慮する必要があります。ネットワークインターフェイスでリッスンしている場合など、入力が適切に検証されていない場合。この入力のパーサーが適切に検証されない場合、それが悪用される可能性があり、昇格したユーザーとしてコードを実行する可能性のあるエクスプロイトにつながる可能性があります。abatishchevの例では、それほど問題にはならないはずですが、エンタープライズ環境に展開する場合は、大規模な展開の前にセキュリティ評価を行ってください。


一部のプログラムは昇格が必要であり、必ずしもセキュリティの問題が発生するわけではありません。たとえば、システムの温度を監視して通知領域に表示するプログラムは、ハードウェアにアクセスするために標高が必要であり、自動実行する必要がありますが、セキュリティは重要ではありません。
Synetech 2016

-3

タスクスケジューラはやり過ぎだと思います(imho)。win7のスタートアップフォルダーがあります。

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

自動起動アプリケーションのショートカットを作成し、ショートカットのプロパティを編集して、常に管理者として実行するだけです。

あなたの子供はもちろんそれを閉じることができます、しかし彼らが技術に精通しているならば、彼らはいつもあなたを締め出す方法を見つけます。私は若い頃にやったことを知っています。

幸運を!


6
これは機能しません。Windowsは、管理者として実行するように設定されたスタートアップショートカットを無視します。
ウラジミールパンテレエフ2014年

本当に?やってみました?それは私の側でうまく機能しているからです。仕事にサラウンドサウンドのために、管理者としての私のLogitechSoundManagerを自動起動するには私が...持っている
zhengtonic

私もこの問題を抱えています。スタートアップフォルダのショートカットで[管理者として実行]オプションがオンになっている場合でも、スタートアップ時に読み込まれません。誰かがこれを修正する方法を知っていますか?
ycomp 2014

2
Cyber​​Shadowは正しかったので、コンピューターのUACはオフでした。管理者としてのスタートアップショートカットが機能しない...タスクスケジューラを使用する必要があります
zhengtonic 2014

少なくともWindows10では、これは機能しないことがわかりました。@ vladimir-panteleevが言ったように、Windowsは単にそれを無視しているようです。
E. van Putten 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.