トップ回答者
Windows 7 SP1 (32bit/64bit)の自動デフラグ をリモートから一括で無効化する方法について

質問
-
こんにちは。
社内で利用している700台のVDIにおいて、デフォルトで毎週水曜日の1:00に設定されているディスク最適化のスケジュールを無効化をしたいと考えています。
対応者が私一人しかおらず、VDIは基本的に社員の皆さんが利用しているので、バックグラウンドから一括で無効化する方法が無いか探しています。
(1台ずつ管理者でログオンして、デフラグのGUIを起動してスケジュールを無効化するのは状況的に厳しいと思っています)タスクスケジューラーに「ScheduledDefrag」というのが有り、こちらを手動またはコマンドラインから無効化すると、後日手動でデフラグをしようとGUIを開こうとすると「ディスク デフラグ ツールは他のプログラムを使ってスケジュールされました」と出てきてしまうのですが、この状況で問題が無いのかが木になっています。
(このタスクは、デフラグのGUI画面から無効化しても、タスクは無効化されていませんでした。でも、自動でデフラグは行われなかったので、GUIから設定した場合の本来の設定とは異なるようなので、タスクを無理やり無効化するのはいかがなものかとも懸念しております)コマンドプロンプトやPowerShell、VBScriptなどでディスク最適化のスケジューリングを無効化にする方法ってあるのでしょうか?
それとも、上記のタスクの無効化をするしか方法が無いのでしょうか?
(その場合、その対応は問題ないものなのでしょうか?)ご存知の方いらっしゃいましたら、ご教示いただけると幸いです。
宜しくお願いいたします。2016年11月17日 5:29
回答
-
デフラグをGUIからチェックを外すと無効になるのは、タスクではなく、タスクのトリガーだと思います。
個人的にはタスクを無効化しても問題無いと思いますが、以下の様な感じでトリガーを無効に出来ると思います。
$targetComputer = $env:COMPUTERNAME $taskScheduler = New-Object -COMObject Schedule.Service $taskScheduler.Connect($targetComputer) $taskFolder = $taskScheduler.GetFolder("\Microsoft\Windows\Defrag") $task = $taskFolder.GetTask("ScheduledDefrag") #既存のタスクの定義を取得してトリガを無効に変更 $newDef = $task.Definition $newDef.Triggers.Item(1).Enabled = $false #変更した定義でタスクを更新 $taskFolder.RegisterTaskDefinition($task.Name, $newDef, 4, $null, $null, 3, $null)
APIについては以下URLを参照して下さい。
https://msdn.microsoft.com/en-us/library/windows/desktop/aa383606.aspx
2016年11月17日 9:21
すべての返信
-
デフラグをGUIからチェックを外すと無効になるのは、タスクではなく、タスクのトリガーだと思います。
個人的にはタスクを無効化しても問題無いと思いますが、以下の様な感じでトリガーを無効に出来ると思います。
$targetComputer = $env:COMPUTERNAME $taskScheduler = New-Object -COMObject Schedule.Service $taskScheduler.Connect($targetComputer) $taskFolder = $taskScheduler.GetFolder("\Microsoft\Windows\Defrag") $task = $taskFolder.GetTask("ScheduledDefrag") #既存のタスクの定義を取得してトリガを無効に変更 $newDef = $task.Definition $newDef.Triggers.Item(1).Enabled = $false #変更した定義でタスクを更新 $taskFolder.RegisterTaskDefinition($task.Name, $newDef, 4, $null, $null, 3, $null)
APIについては以下URLを参照して下さい。
https://msdn.microsoft.com/en-us/library/windows/desktop/aa383606.aspx
2016年11月17日 9:21 -
自分で調べたわけではないですが、調べた人が居るので参考にしてください。
- Windowsの自動メンテナンスを止める方法② (http://ameblo.jp/cinemasoundworks/entry-12063535169.html)
hebikuzure
2016年11月18日 6:55 -
LazyDoggさん
有難うございます!
いただいたPowerShellのコードを参考に、引数が有れば第一引数を対象ホストとして、無ければローカルホストを対象とする形にアレンジして、思ったとおりの動きになりそうでした!#引数を確認 if ($Args[0] -eq "" -or $Args[0] -eq $null) { #引数が無かったらローカルホストを対象にする $strComputerName = "localhost" } else { #引数が有れば、第一引数をターゲットのホスト名とする $strComputerName = $Args[0] } #Schedule.Service オブジェクトを作成 $taskScheduler = New-Object -COMObject("Schedule.Service") #ターゲットホストのSchedule.Serviceに接続 $taskScheduler.Connect($strComputerName) #スケジュールされたデフラグのタスクを取得 $taskFolder = $taskScheduler.GetFolder("\Microsoft\Windows\Defrag") $task = $taskFolder.GetTask("ScheduledDefrag") #変更する設定内容を作成 $newDef = $task.Definition $newDef.Triggers.Item(1).Enabled = $false #タスクを設定 $taskFolder.RegisterTaskDefinition($task.Name, $newDef, 4, $null, $null, 3, $null)
有難うございました!
大変参考になりました。2016年11月18日 8:50