Windowsタスクスケジューラでカスタムのスケジュールされたタスクを設定しましたが、どういうわけか、そのタスクのアクセス制御権限が壊れています。管理者としてログインしているにもかかわらず、タスクが実行されているユーザーアカウントを変更したり、タスクを削除したり、タスクを無効にしたりできません。代わりに「Permission Denied」エラーが発生します。
マシンはWindows 10 Pro 1803を実行しています。これはワークグループマシンであり、ドメイン内ではありません。
タスクは私が自分で作成したものです(これは、PowerShellスクリプトを1日に2回起動するだけで、派手なものではありません)。そのため、禁止すべきではありません。 -Windows Update関連タスクなどの改ざんメカニズム。
私は以下を試しました:
The user account does not have permission to delete this task.
Unregister-ScheduledTask -TaskName 'My custom task'
を実行して、タスクを削除します。これはAccess is denied
を返します。.\psexec -i -d -s mmc taskschd.msc
を起動します。正しく理解している場合、これはタスクスケジューラコンソールスナップインをSYSTEMとして起動しているはずです。これを使用してタスクを削除できません。どちらか-通常のユーザーアカウントを使用して実行した場合と同じエラーメッセージが表示され、管理者としてスナップインが起動します。なぜこれが起こっているのか、そしてどうすればそれを修正できるのかについて誰かが私にいくつかの指針を与えることができますか?
タスク定義はどこに保存されますか?ファイルシステム、またはレジストリ、または他の場所?破損したセキュリティ情報を修正する必要があるようです。
両方に保存されているすべてのタスク定義
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\*
そして
C:\Windows\System32\Tasks\*
セキュリティ記述子は、ファイルシステム内のファイルに存在し、タスクごとにレジストリに保存されます。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache\Tree\<TaskName>\SD
このレジストリ値はバイナリ形式であり、適切なUIがないようです。
あなたはPowershellとタスクスケジューラAPIを介してそれを取得することができます( https://docs.Microsoft.com/en-us/windows/win32/api/_taskschd/index ):
$ts = New-Object -ComObject "Schedule.Service"
$ts.Connect("localhost")
$task = $ts.GetFolder("").GetTask("<TaskName>")
Write-Host $task.GetSecurityDescriptor(0xF)
だが:
C:\$WINDOWS.~BT\NewOS\Windows\System32\Tasks_Migrated\
に、タスクのファイルへのハードリンクがC:\Windows\System32\Tasks
に含まれているかどうかを確認しますC:\$WINDOWS.~BT\NewOS\Windows\System32\Tasks_Migrated\
からすべてのハードリンクを削除しましたが、その後Unregister-ScheduledTask
は期待どおりに機能します。更新:
Windows 10の「壊れた」タスクのアクセス許可に関する問題を最終的に調査しました。これは、アクセス許可にまったく共通点がなく、セキュリティパッチの予期しない結果のように見えます。
2019年6月11日、マイクロソフトは CVE-2019-1069 のパッチをリリースしました。このパッチは、タスクスケジューラの脆弱性を修正し、それを悪用するために 何らかのタスクに関連付けられたファイルへのハードリンクを作成する を悪用します。