1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

スクリプトを使ってWindowsのロック・アンロック時に実行するタスクを登録する

Last updated at Posted at 2021-03-17

Windows では、タスクスケジューラを使うと、Windowsのロック・アンロックをトリガとしたプログラム(タスク)の自動実行を行うことができます(下記関連記事参照)。

この記事では、このスケジューラへの登録を PowerShell スクリプトで実行する方法について記載します。

動作確認した環境

PS> (Get-WmiObject Win32_OperatingSystem).Caption
Microsoft Windows 10 Home
PS> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.18362.1171
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.18362.1171
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
> py --version
Python 3.9.0

手順

Windowsをロックした際に処理を実行したい場合は以下のスクリプトの COMMANDARGUMENT を実行したい処理に置き換えて、管理者権限がある PowerShell で実行してください。

$scheduler = new-object -com("Schedule.Service")
$scheduler.Connect()
$folder = $scheduler.GetFolder("\")
$definition = $scheduler.NewTask(0)
$triggers = $definition.Triggers
$trigger = $triggers.Create(11) # TASK_TRIGGER_SESSION_STATE_CHANGE
$trigger.StateChange = 7 # TASK_SESSION_LOCK 
$action = $definition.Actions.Create(0)
$action.Path = "COMMAND_NAME"
$action.Arguments = "ARGUMENT"
$folder.RegisterTaskDefinition("Lock Logging", $definition, 6, "", "" , 0)

補足情報:

  • 引数が不要な場合は、$action.Arguments = "ARGUMENT" の行は削除してください。
  • アンロックの場合は $trigger.StateChange = 8(8は TASK_SESSION_UNLOCK)にすることで登録できます。

参考文献

Pythonなどの他の言語で実施する場合

サンプルをよく読むとわかりますが、処理としては Schedule.Service のCOMオブジェクトを取得して設定しているだけですので、Windows の COM オブジェクトを操作することができる言語であれば大体どれを使っても良さそうです。

試しに Python で作ってみたところ、動きました。

import win32com.client
import os

def register_task(scheduler, state_change, task_name, command, arguments):
    folder = scheduler.GetFolder('\\')

    definition = scheduler.NewTask(0)

    TASK_TRIGGER_SESSION_STATE_CHANGE = 11
    trigger = definition.Triggers.Create(TASK_TRIGGER_SESSION_STATE_CHANGE)
    trigger.StateChange = state_change

    TASK_ACTION_EXEC = 0
    action = definition.Actions.Create(TASK_ACTION_EXEC)
    action.Path = script
    action.Arguments = arguments

    TASK_CREATE_OR_UPDATE = 6
    TASK_LOGON_NONE = 0
    NO_USER = ''
    NO_PASSWORD = ''
    folder.RegisterTaskDefinition(task_name, definition,
            TASK_CREATE_OR_UPDATE, NO_USER, NO_PASSWORD, TASK_LOGON_NONE)

script = 'COMMAND_NAME'
argument = 'ARGUMENT'
scheduler = win32com.client.Dispatch('Schedule.Service')
scheduler.Connect()
TASK_SESSION_LOCK = 7
TASK_SESSION_UNLOCK = 8
register_task(scheduler, TASK_SESSION_LOCK, 'Lock Logging', script, argument)

予想通りほとんど同じです。


おまけ: PowerShell スクリプトが実行できない場合の対処方法

以下の記事を参照

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?