web-dev-qa-db-ja.com

Windows 10:ワークステーションのロック/ロック解除がトリガーされていないスケジュールされたタスク

私はWindows 10を実行しており、スケジュールされたタスクのペアを機能させようとしています。これらのタスクは、ワークステーションロックとワークステーションロック解除で実行するように設定され、隣接するArch-linuxワークステーションをリモートでロックまたはロック解除するスクリプトを実行します。これは、WinSCPコマンドラインインターフェイス、WinSCP.com、およびその組み込みスクリプト機能によって実現されます。これらのスクリプトは正常に機能しています。手動で呼び出すと、目的の効果を得ることができます。設定したタスクを右クリックして[実行]をクリックし、目的の効果を確認することもできます。問題は、実際にワークステーションをロックおよびロック解除したときに、ワークステーションロックおよびワークステーションロック解除イベントがトリガーされないように見えることです。これと同じスケジュールされたタスクのセットは、Windows 7で期待どおりに機能しました。

Lock/Unlock tasks overview

Task Scheduler window

これまでの回答に基づいて、[ユーザーがログオンしたときにのみ実行する]チェックボックスをオンにすると、タスクを期待どおりに実行できますが、タスクがトリガーされたときにコマンドウィンドウが表示されるという望ましくない副作用があります。 。

OSはWindows 10 Enterprise LTSB 2016(x64)です。洞察やアイデアをいただければ幸いです。

私がすでに試したこと:

  • GPOを使用してワークステーションのロック/ロック解除イベントの監査を有効にする-影響なし(ロック/ロック解除イベントが期待どおりにイベントビューアに表示される)

  • 代替のWindowsユーザーを作成し、そのプリンシパルとして実行するようにタスクを設定します。

  • WinSCP.comへの呼び出しをバッチスクリプトでラップします。

  • ローカルのGPO=を変更して、バッチとしてログオンが有効になっていることを確認します。

その他の関連情報:その他のスケジュールされたタスク(設定された時間や間隔で実行されているタスクなど)は正常に機能しています。これら2つのタスクのみがトリガーに失敗しています。

編集:Twistyのコメントに従って、タスク履歴をオンにすると、実際のエラーメッセージが表示されました: Task scheduler error message

そのため、タスクは実際にトリガーされているように見えますが、起動に失敗します。興味深いことに、これはタスクの「最終実行時間」プロパティを更新しません。

おおざっぱなグーグルは、このエラーがログオン/パスワード情報に関連している可能性があることを示しています。保存したパスワードが正しいことを確認しましたが、同じ問題が解決しません。これは、リクエストされた「一般」タブのスクリーンショットです。 General Tab

実行中のWINSCPスクリプトは次のとおりです(キー打ち切り):

# Connect
open sftp://[email protected]:2222/ -hostkey="ssh-rsa 2048 
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"
call cinnamon-screensaver-command -d
close
exit

私はこれを非常に単純なバッチファイルでラップしようとしました:

@ECHO ON

SET prgwinscp="C:\Program Files (x86)\WinSCP\WinSCP.com"
%prgwinscp% /script=lock-Arch.winscp

これは手動で実行でき、スケジュールされたタスクとして、[ユーザーがログオンしているときのみ実行する]をオンにすると機能します。残念ながら、以前と同様に、タスクを「ユーザーがログオンしているかどうかにかかわらず実行する」に設定すると、通常のエラーが発生します。

リクエストに応じて、これはアクションタブのスクリーンショットです: actions pane

隠されたテキストは次のとおりです。

Add Arguments (Optional):    /script=unlock-Arch.winscp
Start in (Optional):    C:\Program Files (x86)\WinSCP
9
Fopedush

以下の手順に従って問題のトラブルシューティングと解決を行ってください

タスクスケジューラのプロパティ。。。

WindowsからTask Schedulerをジョブでproperties(一番下のスクリーンショットを参照) 。 。

  • 1.Generalタブで、Print Screen Aに示すように、以下のオプションが選択/チェックされているかチェックされていないことを確認します

    • チェックを外すRun only when user is logged on
    • チェックRun whether user is logged on or not
    • チェックRun with the highest privileges
  • 2.Conditionsタブで、以下のオプションが印刷画面Bと同じように選択オン、またはオフであることを確認します

    • チェックWake the computer to run this task
  • .Actionsタブで、Edit、およびStart in (optional)が、バッチスクリプトがある場所を指す完全パスに対して、以下の例(DO NOTを二重引用符で囲む)のように設定されていることを確認します。位置[〜#〜]なし[〜#〜]最後のバックスラッシュ "\" Print Screen C


セキュリティに関する考慮事項

  • OK(上記の2.)資格情報を実行するように求めるメッセージが表示されます。その資格情報は、バッチファイルが存在するEXECUTEへのアクセスが必要なものであり、また、スクリプトを実行して実行したバッチファイルを実行するためのアクセス権も必要です。

  • このプロセスの静的サービス/プロキシユーザーアカウントをセットアップし、その資格情報を使用してプロセスを実行するのが最善の方法です。パスワードが強力で、有効期限なしに設定されていることを確認する必要があります。また、EXECUTEにアクセスし、バッチスクリプトプロセスが実行しているもの、コマンドやリソースなどを実行する必要があります。それも利用します。

  • オプションRun whether user is logged on or notのようですが、タスクスケジューラから期待どおりに実行するには、オプションRun with highest privilegesを確認する必要があります。

エラーチェック

  • 実際のバッチスクリプトに問題があるが、Windows タスクスケジューラは実際にそれを実行してそれを実行しますが、何らかの理由でバッチスクリプトロジックがエラーになるなどの場合、タスクスケジューラは、このレベルでこの障害を認識しない場合があります。その観点から(デフォルトではほとんどの場合)、バッチファイルを実行しているので、実行可能であり、そのためのアクセス権があれば、ジョブは正常に完了しています。

  • エラーチェックまたはロギングをバッチスクリプトロジックに追加して、セキュリティコンテキストの確保を含むこのレベルでのキャッチ(またはトラブルシューティング)の問題を追加します。バッチスケジューラが実行するコマンド、リソースなどへの適切なアクセス権を持つバッチスケジューラがそれを実行します。


グループポリシーに関する考慮事項

グループポリシーを確認し、バッチジョブの権限としてログオン

回答:Windowsでは、この特権はローカルまたはドメインセキュリティポリシーを通じて付与されます。 ローカルセキュリティポリシーを使用してこれを行うには、次の手順に従います。

  1. コントロールパネル管理ツールを開き、次にローカルセキュリティポリシーを開きます。
  2. セキュリティ設定の下でローカルポリシーを開き、ユーザー権利の割り当てを強調表示します。
  3. バッチジョブとしてログオンを見つけます。 プロパティを開き、この権限を必要とするユーザーを追加します。
  4. 完了したら、保存変更を加えてローカルセキュリティ設定ウィンドウを閉じます。

変更はすぐに有効になります。ドメインセキュリティポリシーを変更するには、ドメインコントローラでコントロールパネルドメインセキュリティポリシーユーティリティを使用します。


マップされたドライブまたは完全なUNCパスを使用したバッチスクリプトロジック、および問題。 。 。

スクリプトがマップされたネットワークドライブを参照しているが、それをRun whether the user is logged on or notにしたい場合、このコンテキストでは、バッチプロセスが期待どおりのことを行うためのドライブマッピングが実際には存在しない可能性があります。

問題を回避するために、可能であれば、マップされたドライブ文字ではなく、UNCパスをバッチスクリプトロジックで使用します。それ以外の場合は、バッチプロセスの最初にPUSHD \\ServerName\ShareNameを使用し、バッチプロセスの最後にPOPDを使用する必要があります。バッチプロセスの最初にNet Use X: \\ServerName\ShareNameを使用してドライブをマップし、バッチプロセスの最後にNet Use X: /DELETEを使用してドライブを切断できます。


スクリーンの印刷

印刷画面A

enter image description here

印刷画面B

enter image description here

印刷画面C

enter image description here


WinSCPバッチスクリプトの例

以下は、WinSCP.comを使用してFTPサーバーにアップロードするFTPスクリプトとFTPサーバーからダウンロードするFTPスクリプトの2つの非常に基本的で簡単な例です。 SET winscplogin=変数が、WinSCP GUI内から定義したFTP接続の名前に設定されていることを確認してください。

このようにしてスクリプトを動的に構築し、バッチスクリプト内からFTPコマンドを構築しますが、FTPコマンドが含まれている静的WinSCPスクリプトを指定するだけで、それ以外の場合も簡単にセットアップできます。 。

FTPサーバーへのアップロード

@ECHO ON

SET logfile=C:\folder\path\log.log

::SET WinSCP variables, etc.
SET prgwinscp="C:\Program Files\WinSCP3\WinSCP.com"
SET winscplogin="ABC Company"
SET winscpfile=C:\folder\path\ABCompany_FTP_OUT_WinSCP.txt
IF EXIST "%winscpfile%" DEL /Q /F "%winscpfile%"

:ftpout
ECHO.                                              >> "%logfile%"
ECHO *******************FTP OUT******************* >> "%logfile%"
ECHO Delivering file(s) to ABC Company FTP server  >> "%logfile%"
SET ftpdir="ToABC"
ECHO option batch on           >> %winscpfile%
ECHO option confirm off        >> %winscpfile%
ECHO option transfer binary    >> %winscpfile%
ECHO open %winscplogin%        >> %winscpfile%
ECHO cd %ftpdir%               >> %winscpfile%
ECHO put "C:\Folder\Path\*.*"  >> %winscpfile%
ECHO dir                       >> %winscpfile%
ECHO close                     >> %winscpfile%
ECHO exit                      >> %winscpfile%
ECHO %winscpfile%                                >> "%logfile%"
TYPE %winscpfile%                                >> "%logfile%"
ECHO - - - - - - - - - - - - - - - - - - - - - - >> "%logfile%"
%prgwinscp% /script=%winscpfile%                 >> "%logfile%"
ECHO - - - - - - - - - - - - - - - - - - - - - - >> "%logfile%"
IF EXIST "%winscpfile%" DEL /Q /F "%winscpfile%"
ECHO Transmission complete                       >> "%logfile%"

FTPサーバーからダウンロード

@ECHO ON

SET logfile=C:\folder\path\log.log

::SET WinSCP variables, etc.
SET prgwinscp="C:\Program Files\WinSCP3\WinSCP.com"
SET winscplogin="ABC Company"
SET winscpfile=C:\folder\path\ABCompany_FTP_IN_WinSCP.txt
IF EXIST "%winscpfile%" DEL /Q /F "%winscpfile%"

:ftpin
ECHO.                                             >> %logfile%
ECHO *******************FTP IN******************* >> %logfile%
ECHO Retrieving files from ABC Company server     >> %logfile%
SET ftpdir="FromABC"
ECHO option batch on          >> %winscpfile%
ECHO option confirm off       >> %winscpfile%
ECHO option transfer binary   >> %winscpfile%
ECHO open %winscplogin%       >> %winscpfile%
ECHO cd %ftpdir%              >> %winscpfile%
ECHO ls                       >> %winscpfile%
ECHO get "*.*" "C:\Folder\path\"  >> %winscpfile%
ECHO close                    >> %winscpfile%
ECHO exit                     >> %winscpfile%
ECHO %winscpfile%                                >> %logfile%
TYPE %winscpfile%                                >> %logfile%
ECHO ------------------------------------------- >> %logfile%
%prgwinscp% /script=%winscpfile%                 >> %logfile%
ECHO ------------------------------------------- >> %logfile%
IF EXIST "%winscpfile%" DEL /Q /F "%winscpfile%"
ECHO FTP Downloading Complete                    >> %logfile%
ECHO Transmission complete                       >> %logfile%

カスタムサンプルスクリプト

バッチスクリプトをスケジュールするときは、必ずRun whether user is logged on or notRun with the highest privilegesの両方のオプションを使用してください。これらの変更を適用したら、明示的にタスクを実行するための資格情報を入力する必要があります。 C:\Program Files (x86)\WinSCP\WinSCP.comファイルへの実行アクセス権があり、上記のその他の一般的な要件も満たしているアカウントを使用してください。

それでも問題があり、OSのセキュリティに関連していないことを確認する場合は、マシンに新しいローカルアカウントを作成し、強力なパスワードを設定します。期限が切れないように設定し、バッチとして実行する権限を付与します。アカウントをローカル管理者にして、アカウントにマシンのローカル管理者アクセスを与えることで違いが生じるかどうかを確認するためにテストすることもできます。

つまり、バッチスクリプトとWinSCPの2つのファイルがあることになります。バッチスクリプトはWinSCPスクリプトをWinSCP.comに渡し、実行するだけでプロセスを実行できます。実行するように設定する前に、タスクスケジューラからも機能することを確認するために、Run only when user is logged onオプションを使用してマシンセッションにログオンしているときに、このスクリプトを実行してテストし、同じアカウントでテストして、ログオン中に同じスクリプトとして機能することを確認してください。ログオンしているかどうかなど.

タスクスケジューラのActionsタブでは、Program/Script:フィールドのみを使用し、他のすべてのフィールドは空白のままにしますが、Program/Script:フィールドの値はC:\folder\path\yourbatchscript.cmdになります。

バッチスクリプト

@ECHO ON

SET prgwinscp="C:\Program Files (x86)\WinSCP\WinSCP.com"
%prgwinscp% /script=lock-Arch.winscp

EXIT

WinSCPスクリプト

open sftp://[email protected]:2222/ -hostkey="ssh-rsa 2048 
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"
call cinnamon-screensaver-command -d
close
exit
8
Pimp Juice IT

Win10タスクスケジューラには、特にGUIに多くのバグがあります。参照: https://www.ctrl.blog/entry/idle-task-scheduler-powershell

あなたはインターフェースを再コンパイルする幸運があるかもしれません:

mofcomp c:\Windows\System32\wbem\SchedProv.mof

PowerShellのCOMインターフェイスを介してタスクを作成することもできます。私はXML定義を含む文字列変数を使用することを好みます。 GUIで作成したタスクのXMLをエクスポートして、クリーンアップ/修正できます。次に:

$TaskService = new-object -ComObject('Schedule.Service')
$TaskService.connect()
$Task = $TaskService.NewTask($null)
$task.XmlText = $XMLstring
$null = $Global:TaskFolder.RegisterTaskDefinition('Lock Arch Workstation', $Task, 6, $null, $null, 3)

幸運を!

4
Teknowledgist

「On Workstation Lock/Unlock」トリガータイプをバイパスし、トリガーを設定してWindowsイベントログを直接確認することで、これを解決しました。

理想的ではありませんが、持続可能である必要があります。ただし、タスクスケジューラによって提供されるトリガーが機能しない理由については、まだ興味があります。


ロック/ロック解除イベントの構成

デフォルトでは、ロック/ロック解除イベントはイベントログに対して監査されません。これらのイベントのロギングを有効にする必要があります。これは、グループポリシーエディターから行うことができます。

実行-> gpedit.msc

次のカテゴリを構成します。

コンピューター構成->
Windows設定->
セキュリティ設定->
高度な監査ポリシー構成->
システム監査ポリシー-ローカルグループポリシーオブジェクト->
ログオン/ログオフ->
他のログイン/ログオフイベントを監査

Explainタブでは、「...監査を許可...ワークステーションのロックとロック解除」と表示されます。)

クレジット: https://stackoverflow.com/a/15904838/1216896


Create Triggers

そこから、次のように4800(ロック)および4801(ロック解除)イベントへのトリガーを設定できます。

Trigger configuration

3
Waxen