私はWindows 10を実行しており、スケジュールされたタスクのペアを機能させようとしています。これらのタスクは、ワークステーションロックとワークステーションロック解除で実行するように設定され、隣接するArch-linuxワークステーションをリモートでロックまたはロック解除するスクリプトを実行します。これは、WinSCPコマンドラインインターフェイス、WinSCP.com、およびその組み込みスクリプト機能によって実現されます。これらのスクリプトは正常に機能しています。手動で呼び出すと、目的の効果を得ることができます。設定したタスクを右クリックして[実行]をクリックし、目的の効果を確認することもできます。問題は、実際にワークステーションをロックおよびロック解除したときに、ワークステーションロックおよびワークステーションロック解除イベントがトリガーされないように見えることです。これと同じスケジュールされたタスクのセットは、Windows 7で期待どおりに機能しました。
これまでの回答に基づいて、[ユーザーがログオンしたときにのみ実行する]チェックボックスをオンにすると、タスクを期待どおりに実行できますが、タスクがトリガーされたときにコマンドウィンドウが表示されるという望ましくない副作用があります。 。
OSはWindows 10 Enterprise LTSB 2016(x64)です。洞察やアイデアをいただければ幸いです。
私がすでに試したこと:
GPOを使用してワークステーションのロック/ロック解除イベントの監査を有効にする-影響なし(ロック/ロック解除イベントが期待どおりにイベントビューアに表示される)
代替のWindowsユーザーを作成し、そのプリンシパルとして実行するようにタスクを設定します。
WinSCP.comへの呼び出しをバッチスクリプトでラップします。
ローカルのGPO=を変更して、バッチとしてログオンが有効になっていることを確認します。
その他の関連情報:その他のスケジュールされたタスク(設定された時間や間隔で実行されているタスクなど)は正常に機能しています。これら2つのタスクのみがトリガーに失敗しています。
編集:Twistyのコメントに従って、タスク履歴をオンにすると、実際のエラーメッセージが表示されました:
そのため、タスクは実際にトリガーされているように見えますが、起動に失敗します。興味深いことに、これはタスクの「最終実行時間」プロパティを更新しません。
おおざっぱなグーグルは、このエラーがログオン/パスワード情報に関連している可能性があることを示しています。保存したパスワードが正しいことを確認しましたが、同じ問題が解決しません。これは、リクエストされた「一般」タブのスクリーンショットです。
実行中の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
これは手動で実行でき、スケジュールされたタスクとして、[ユーザーがログオンしているときのみ実行する]をオンにすると機能します。残念ながら、以前と同様に、タスクを「ユーザーがログオンしているかどうかにかかわらず実行する」に設定すると、通常のエラーが発生します。
リクエストに応じて、これはアクションタブのスクリーンショットです:
隠されたテキストは次のとおりです。
Add Arguments (Optional): /script=unlock-Arch.winscp
Start in (Optional): C:\Program Files (x86)\WinSCP
以下の手順に従って問題のトラブルシューティングと解決を行ってください
タスクスケジューラのプロパティ。。。
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では、この特権はローカルまたはドメインセキュリティポリシーを通じて付与されます。 ローカルセキュリティポリシーを使用してこれを行うには、次の手順に従います。
- コントロールパネルで管理ツールを開き、次にローカルセキュリティポリシーを開きます。
- セキュリティ設定の下でローカルポリシーを開き、ユーザー権利の割り当てを強調表示します。
- バッチジョブとしてログオンを見つけます。 プロパティを開き、この権限を必要とするユーザーを追加します。
- 完了したら、保存変更を加えてローカルセキュリティ設定ウィンドウを閉じます。
変更はすぐに有効になります。ドメインセキュリティポリシーを変更するには、ドメインコントローラでコントロールパネルのドメインセキュリティポリシーユーティリティを使用します。
スクリプトがマップされたネットワークドライブを参照しているが、それをRun whether the user is logged on or not
にしたい場合、このコンテキストでは、バッチプロセスが期待どおりのことを行うためのドライブマッピングが実際には存在しない可能性があります。
問題を回避するために、可能であれば、マップされたドライブ文字ではなく、UNC
パスをバッチスクリプトロジックで使用します。それ以外の場合は、バッチプロセスの最初にPUSHD \\ServerName\ShareName
を使用し、バッチプロセスの最後にPOPD
を使用する必要があります。バッチプロセスの最初にNet Use X: \\ServerName\ShareName
を使用してドライブをマップし、バッチプロセスの最後にNet Use X: /DELETE
を使用してドライブを切断できます。
印刷画面A
印刷画面B
印刷画面C
以下は、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 not
とRun 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
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)
幸運を!
「On Workstation Lock/Unlock」トリガータイプをバイパスし、トリガーを設定してWindowsイベントログを直接確認することで、これを解決しました。
理想的ではありませんが、持続可能である必要があります。ただし、タスクスケジューラによって提供されるトリガーが機能しない理由については、まだ興味があります。
デフォルトでは、ロック/ロック解除イベントはイベントログに対して監査されません。これらのイベントのロギングを有効にする必要があります。これは、グループポリシーエディターから行うことができます。
実行-> gpedit.msc
次のカテゴリを構成します。
コンピューター構成->
Windows設定->
セキュリティ設定->
高度な監査ポリシー構成->
システム監査ポリシー-ローカルグループポリシーオブジェクト->
ログオン/ログオフ->
他のログイン/ログオフイベントを監査
(Explainタブでは、「...監査を許可...ワークステーションのロックとロック解除」と表示されます。)
クレジット: https://stackoverflow.com/a/15904838/1216896
そこから、次のように4800(ロック)および4801(ロック解除)イベントへのトリガーを設定できます。