web-dev-qa-db-ja.com

Windowsでスケジュールされたタスクでは、ユーザーがログインする必要があるという事実の回避策

Windows 2008サーバー上で定期的に実行する必要がある、サードパーティによって作成された小さな実行可能ファイルを実行しています。この実行可能ファイルは、あるシステムから別のシステムに情報を効果的にETLし、1時間ごとに24時間実行する必要があります。その処理の一部として、実行可能ファイルは小さなWindowsフォームタイプのUIを起動します。

ファイルを呼び出すようにスケジュールされたタスクを設定しました。これは、タスクの実行が構成されているユーザーがマシンに(ローカルまたはリモートデスクトップ経由で)ログオンしている場合にのみ機能します。タスクを別のユーザーとして実行するように設定した場合、またはユーザーがログに記録されていないときにタスクを実行するように設定した場合、スケジュールされたタスクが実行され、エラーが発生します。管理者ユーザーとシステムユーザーを含むさまざまなユーザーとして実行してみました。特定のユーザーがログインしていなくてもこのコードを実行できるようにする(アクセスできないサードパーティのコードを変更せずに)可能な回避策はありますか?.

10
AlexC

GUIアプリにはデスクトップが必要であり、ログインしたユーザー用にデスクトップを1つだけ取得します。

4
David Heffernan

この記事では、ログインを必要としないタスクを作成する方法を示します。 https://www.scriptjunkie.us/2013/01/running-code-from-a-non-elevated-account-at-any -時間/

説明する手順は次のとおりです。

まず、現在のユーザーとしてデフォルトのオプションを使用してコマンドを実行するスケジュールされたタスクを作成します(これにより、デフォルトでは、ログインしているときにのみ実行されるスケジュールされたタスクが作成されます)。

schtasks /create /tn mytask /SC HOURLY /TR "calc"

次に、タスクをXMLとしてエクスポートします。

schtasks /query /XML /tn mytask > temp.xml

タスクを削除します。

schtasks /delete /tn mytask /f

次に、xmlファイルを開き、行<LogonType>InteractiveToken</LogonType><LogonType>S4U</LogonType>に置き換えます。

これは、PowerShellがシステム上にあると想定して、次のコマンドで実行できます。powershell -Command "Get-Content '.\temp.xml' | foreach {$_ -replace 'InteractiveToken', 'S4U' }" > new.xml move /y new.xml temp.xml

次に、変更したXMLファイルからタスクを再作成します。

schtasks /create /xml temp.xml /tn mytasks

一時ファイルを削除します。

del /f /q temp.xml

4
Breeze

返信が遅れる可能性がありますが、/ interactiveなしでコマンドで使用することはできません...

https://support.Microsoft.com/en-us/kb/313565

Microsoftによると:/ Interactive:このパラメーターを使用して、タスクの実行時にログオンしているユーザーのデスクトップとタスクが対話できるようにします。

3
MansoorAliA

私はこの状況の解決策を見つけたと思います。サーバーには2つのユーザーアカウント(User1とUser2)が必要です。 User1の下のサーバーへのRMD。このRMD内で、スケジュールされたタスクを作成し、User2アカウントで実行するように設定します。次に、このRMD内から、User2資格情報を使用してサーバー自体にRMDする必要があります(夢の中のInceptionの夢のようなものです)。この新しいRMDウィンドウを最小化しないことが重要です。小さくすることはできますが、開いている必要があります。その後、元のRMDセッションを自由に閉じることができ、User2には2番目のRMDセッションから開いているデスクトップがあるため、タスクはUser2アカウントで実行されます。

ヒント-RMDウィンドウの上部にあるRMDウィンドウハンドルの固定を解除しないでください-正しいRMDを閉じるのは面倒な場合があります。その場合は、RMDから完全に[スタート]> [ログアウト]オプションを使用する必要があります。

2
Marcus Rogers

簡単な解決策があります。グループをローカルグループ「users」に変更すると、パスワードの入力を求められなくなります。 (スケジュールされたタスク-一般-セキュリティオプション-ユーザーまたはグループの変更)。

2
SystemAdmin

私が行った調査(およびDavid Heffernanの回答)から、ソースコードに影響を与えずに、これは不可能であるように思われます。

Windows GUIアプリケーションをサービスとして実行するにはどうすればよいですか? これに関連するいくつかの有用な考えがありますが、この問題に対する実行可能な回避策はありません。

1
AlexC

これは古いスレッドのように見えますが、UAC要件が使用されていなかったため、最近、組織でこれに遭遇しました。私はまだこれをテストしていますが、タスクで/Changeコマンドを使用し、/ITフラグを追加してインタラクティブにすることで、スケジュールされたタスクでインタラクティブモードを有効にできると思います。ここで参照: https://docs.Microsoft.com/en-us/windows/desktop/taskschd/schtasks

schtasks /Change /tn "Task A" /IT /RP "password of user if used"

私の最初のテストでは、これが機能していることが示されていますが、これを実行すると、タスクスケジューラのタスクに目立った違いが見られません。そのため、これを行うように設定されているかどうかを確認する方法がわかりません。

0
Martin Becker