質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

1回答

2767閲覧

PowerShell:タスクスケジュールの登録(ユーザーセッションへの接続時・切断時)のやり方

FUJITOMO37

総合スコア25

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2019/03/14 03:28

ご存じでしたら、お願いします。

やりたいことは、タスクスケジュールの登録です。
登録内容は、ユーザーセッションへの接続時と切断時にバッチファイルを実行するタスクです。
タスクスケジュールの登録自体は、わかりました。
Register-ScheduledTaskでログイン時のバッチファイル起動は、出来ました。
しかし、トリガとなる"ユーザーセッションへの接続時"と"ユーザーセッションへの切断時"の登録方法がわかりません。。
"リモートコンピューターからの接続"と"ローカルコンピューターからの接続"の両方設定したいです。

MSのドキュメントを見てもさっぱりです。
https://docs.microsoft.com/en-us/powershell/module/scheduledtasks/new-scheduledtasktrigger?view=win10-ps

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

おそらくPowerShellのタスクスケジューラ関連のコマンドはユーザーセッションへの接続時等のトリガには対応してないと思います。
もう一つの手段としてschtasksコマンドがありますが、こちらも残念ながら対応してないようです。
これらのコマンドはよく使われるような用途以外は対応してないことが結構多いです。

その他にタスクのXMLを直接編集して登録する方法があります。
以下にXMLを差し替えるコードを書いてみました。
文字列として置換すれば一発なのですが、そういうやり方は怒られそうなのでXMLDocumentを使っています。なので無駄に長いですが、要は<Triggers>要素以下の<Trigger>要素を置き換えてるだけです。

powershell

1# タスクのトリガーを"ユーザーセッションへの接続/切断時"に設定する 2filter Set-ConnectTrigger 3{ 4 $ns = "http://schemas.microsoft.com/windows/2004/02/mit/task" # タスクのXML名前空間 5 6 $doc = [xml]$_ # 入力XMLをXMLDocumentに変換 7 8 # Triggerノードの雛形を作成 9 $triggerNode = $doc.CreateElement("SessionStateChangeTrigger", $ns) 10 $enabledNode = $doc.CreateElement("Enabled", $ns) # Triggerノードの子になるEnabledノード 11 $enabledNode.InnerText = "true" 12 $stateChangeNode = $doc.CreateElement("StateChange", $ns) # Triggerノードの子になるStateChangeノード 13 # Triggerノードの子ノードとして追加 14 $triggerNode.AppendChild($enabledNode) > $null 15 $triggerNode.AppendChild($stateChangeNode) > $null 16 17 # 雛形を複製して実際に登録するノードを作成 18 $t1 = $triggerNode.Clone() 19 $t1.StateChange = "ConsoleConnect" 20 $t2 = $triggerNode.Clone() 21 $t2.StateChange = "RemoteConnect" 22 $t3 = $triggerNode.Clone() 23 $t3.StateChange = "ConsoleDisconnect" 24 $t4 = $triggerNode.Clone() 25 $t4.StateChange = "RemoteDisconnect" 26 27 # Triggersノードを選択 28 $nsm = New-Object Xml.XmlNamespaceManager $doc.NameTable 29 $nsm.AddNamespace("task", $ns) # XmlNamespaceManagerで名前空間名を略称と関連づける 30 $triggersNode = $doc.SelectSingleNode("//task:Triggers", $nsm) # Triggersノードを選択 31 32 # ダミーのデータを削除して、作成したノードをTriggers以下に追加する 33 $triggersNode.RemoveAll() 34 $t1,$t2,$t3,$t4 | foreach { $triggersNode.AppendChild($_) } > $null 35 36 $doc.OuterXml 37} 38 39

以下はノートパッドを起動するタスクを登録する例です。
ユーザーセッションへの接続/切断をトリガにする場合は管理者権限で実行する必要があるようです。

powershell

1# アクション作成 (ノートパッドの起動) 2$action = New-ScheduledTaskAction notepad 3# トリガー作成 (ダミー) 4$trigger = New-ScheduledTaskTrigger -At 0 -Once 5 6# タスクオブジェクトをXMLに変換し、トリガーを差し替えて登録する 7New-ScheduledTask $action $trigger | Export-ScheduledTask | Set-ConnectTrigger | 8Register-ScheduledTask "testtask" 9

投稿2019/03/15 07:38

編集2019/03/15 07:42
mitarai

総合スコア223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FUJITOMO37

2019/03/17 04:48

ご回答、ありがとうございました。 色々ありまして、残念ながら、今回はc#で対応する事になりました。。 しかし、教えて頂いた事は大変勉強になりました。 感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問