タスクスケジューラに残された使えない機能の怪その知識、ホントに正しい? Windowsにまつわる都市伝説(9)

前回は「パフォーマンスモニター」と「タスクスケジューラ」のヘルプでも説明されていない連携機能の“謎”を解き明かしました。引き続き、今回もタスクスケジューラのお話です。

» 2014年07月01日 18時00分 公開
[山市良テクニカルライター]
「Windowsにまつわる都市伝説」のインデックス

連載目次

「電子メールの送信」と「メッセージの表示」は“非推奨”?

 Windows VistaおよびWindows Server 2008には、Windows XPやWindows Server 2003以前の「タスクスケジューラ(1.0)」から刷新された「タスクスケジューラ2.0」の他、「Microsoft管理コンソール」(Microsoft Management Console:MMC)ベースの新しいGUI、ATコマンドに変わる新しいSchtasksコマンドなど、いくつかの新機能が搭載されました。

 タスクが実行する「操作」として「プログラムの開始」に加え、「電子メールの送信」と「メッセージの表示」を設定できるようになったのは、タスクスケジューラ2.0からの新機能です。なお、最新のWindows(Windows 8、Windows 8.1、Windows Server 2012、Windows Server 2012 R2)もタスクスケジューラ2.0という扱いです。

 Windows 8、Windows 8.1、もしくはWindows Server 2012、Windows Server 2012 R2でタスクスケジューラを利用したことがある人ならすでにお気付きかもしれませんが、タスクの作成や編集のGUIには、「電子メールの送信」「メッセージの表示」ではなく、「電子メールの送信(非推奨)」「メッセージの表示(非推奨)」と表記されるようになりました(画面1)。

画面1 画面1 「電子メールの送信(非推奨)」と「メッセージの表示(非推奨)」の“非推奨”の表記に注目!

 表記の変更だけではありません。これらの“非推奨”の操作を設定しようとしても、「次のエラーが報告されました:推奨されない機能をタスク定義で使用しています」と表示され、設定を完了できません(画面2)。

画面2 画面2 “非推奨”の操作のタスクを作成しようとしても、エラーが発生して完了できない

 このエラーを見ると「自分のPCに何か問題があるのでは?」「自分が何か間違った設定をしたのでは?」と思うかもしれません。安心してください。これは正常な動作です。つまり、Windows 8およびWindows Server 2012以降では、利用できない操作が選択肢として提供されているのです。

電子メールの送信とメッセージの表示は“廃止”

 Windows 8以降のタスクスケジューラにはローカルヘルプは存在せず、オンラインヘルプのリンク先を参照しても、Windows 8より前の古いヘルプが表示されます。そのため、“非推奨”の意味する変更点について知ることはできません(画面3)。

画面3 画面3 「タスクスケジューラ」のオンラインヘルプは古いままであるため、“非推奨”になった操作に関する詳しい説明は得られない

 以下のドキュメントおよびブログの「Features deprecated」をご覧ください。「sendEmail(電子メールの送信)」「showMessage(メッセージの表示)」の2つの操作、およびATコマンドは、Windows 8およびWindows Server 2012の時点で廃止されています。

 マイクロソフトは製品やドキュメントの中で、「deprecated」を「非推奨(推奨されなくなった)」と「廃止(廃止された、削除された)」の2つの意味で使い分けています。今回のタスクスケジューラの場合は、「電子メールの送信(非推奨)」と「メッセージの表示(非推奨)」ではなく、「電子メールの送信(廃止)」と「メッセージの表示(廃止)」とすべきだったのではないでしょうか。

 ちなみに、Windows 8およびWindows Server 2012以降でATコマンドを実行すると、「このATコマンドは廃止されました」と表示されます。このメッセージの英語表現は「The AT command has been deprecated」です(画面4)。

画面4 画面4 ATコマンドでは「deprecated」が「非推奨」ではなく「廃止」と正しくローカライズされている

廃止された機能のGUIがなぜ残っているのか?

 使えなくなった機能がなぜGUIに残っているのか、疑問に思う人は多いでしょう。筆者も最初はそう思っていました。しかし、よく考えればいくつか理由があることが分かります。それらの理由とは、旧バージョンからのアップグレード、移行、旧バージョンの管理です。

 試しに、Windows 7で「メッセージの表示」操作を構成したタスクを作成し、それをWindows 8にアップグレードしてみました(画面5)。

画面5 画面5 Windows 7で作成した「メッセージの表示」操作のタスク。当然のことながら、問題なく実行可能

 Windows 7で作成したカスタムタスクは、アップグレード後のWindows 8にも引き継がれていました。しかし、「メッセージの表示」操作のタスクは設定を読み込む際にエラーとなり、実行できないタスク(表示はされているが存在しないタスク)として引き継がれました(画面6)。ユーザーや管理者はこのタスクのプロパティを開いて、「メッセージの表示(非推奨)」操作を削除し、別の操作に置き換えることで、タスクの問題を解消することができます。

画面6 画面6 Windows 7をWindows 8にアップグレードすると、実行できない(存在しない)タスクとして引き継がれた

 直接的なアップグレードではなく、設定を移行する場合は、旧環境からタスクをファイル(XML)にエクスポートして、新しい環境にインポートするという方法が想定されます。「電子メールの送信」や「メッセージの表示」操作を含むタスクは、インポート時にエラーになるため、インポート時に問題を訂正することができます(画面7)。

画面7 画面7 「電子メールの送信」や「メッセージの表示」操作を含むタスクのエクスポートファイル(XML)は、インポート時にエラーになるので訂正が必要

 Microsoft管理コンソール(MMC)ベースのタスクスケジューラスナップインは、タスクスケジューラ2.0に対応したリモートコンピューターに接続し、タスクの作成や編集を行うことができます。例えば、Windows Server 2012 R2のタスクスケジューラをWindows 7クライアントにリモート接続すれば、“非推奨”という表示は無視して「電子メールの送信(非推奨)」や「メッセージの表示(非推奨)」操作のタスクを作成、編集、および手動実行することが可能です(画面8)。

画面8 画面8 Windows Server 2012 R2の「タスクスケジューラ」をWindows 7クライアントにリモート接続して、Windows 7のタスクを作成、編集する

 このように使えない機能のUIが残っている意味はあるのですが、Windows 8やWindows Server 2012以降で「電子メールの送信」や「メッセージの表示」を行いたい場合はどうすればよいのかという課題が残ります。答えは、どちらも「プログラムの開始」で実現するしかありません。以降では、そのまま使える具体的な例を紹介しておきましょう。

「メッセージの表示(非推奨)」はMsgコマンドで代替

 PCのコンソール(ロック画面を含む)や、ローカルまたはリモートからログオン中のユーザーに対してメッセージを表示するには、MSG(Msg.exe)コマンドが利用できます。MSGコマンドは、Windows XPやWindows Server 2003から利用できる標準コマンドです。Windows XPやWindows Server 2003にはNET SENDコマンドもありますが、NET SENDコマンドはWindows VistaおよびWindows Server 2008で廃止されました。

 例えば、タスクで次のように「プログラムの開始」操作を設定すれば、ローカルPCのロック(サインイン)画面を含む全てのデスクトップセッションに対してメッセージを送信することが可能です。

  • プログラム/スクリプト:Msg.exe
  • 引数の追加:* "メッセージ本文"

 この他、Windows Script Host(WSH)のスクリプトでMsgBoxファンクションを利用する方法もあります。ウィンドウタイトルの指定やアイコン(警告や?、情報)、ボタン(OK、キャンセル、はい、いいえ)のカスタマイズや、押されたボタンに応じた処理を記述することができます。

「電子メールの送信(非推奨)」は自分好みのスクリプトで代替

 「電子メールの送信(非推奨)」操作の代替策としては、WSHまたはWindows PowerShellのスクリプトで電子メール送信処理を記述し、「プログラムの開始」操作で実行する方法があります(画面9)。ここでは、いくつかのサンプルスクリプトを紹介します。そのまま使えるものもあれば、環境に合わせてカスタマイズが必要なものもあります。

画面9 画面9 「メッセージの表示(非推奨)」と「電子メールの送信(非推奨)」を「プログラムの開始」で代替する例。赤枠部分に実行するプログラム/スクリプトと引数を指定する

CDO APIを使う方法

 WSHスクリプトなら、COM(Component Object Model)の「CDO(Collaborative Data Objects Messaging)API」を使う方法がよく知られています。サンプルスクリプト1の「sendmsg.vbs」は、スクリプトの引数として渡されたSMTPサーバー、差出人、宛先、件名、本文のテキスト情報に基づいて電子メールを送信します。

 タスクの設定では、次のように「プログラムの開始」操作を設定してください。なお、サンプルスクリプト1「sendmsg.vbs」の保存先フォルダーは「c:\work」としています。

  • プログラム/スクリプト:cscript.exe
  • 引数の追加:c:\work\sendmsg.vbs "SMTPサーバーのFQDNまたはIPアドレス" "差出人メールアドレス" "宛先メールアドレス" "件名" "メッセージ本文"
Set arg = WScript.Arguments
sendmsg arg(0), arg(1), arg(2), arg(3), arg(4)
Sub sendmsg(smtpHost, msgFrom, msgTo, msgSubject, msgBody)
  Dim objEmail
  Set objEmail = CreateObject("CDO.Message") 
  objEmail.From = msgFrom
  objEmail.To = msgTo
  objEmail.Subject = msgSubject
  objEmail.Textbody = msgBody  
  objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 
  objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = smtpHost 
  objEmail.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
  objEmail.Configuration.Fields.Update 
  objEmail.Send
End Sub
サンプルスクリプト1:sendmsg.vbs

PowerShellのSmtpClientクラスを使う方法

 サンプルスクリプト2の「sendmsg.ps1」は、サンプルスクリプト1と同様の機能を.NET Framework 2.0以降が標準で備える「System.Net.Mail」名前空間のSmtpClientクラスを使って記述したものです。CDOを使うVBScriptコードと比較すると、非常に簡単なコードで記述できます。

 タスクの設定では、次のように「プログラムの開始」操作を設定してください。なお、サンプルスクリプト2の「sendmsg.ps1」の保存先フォルダーは「c:\work」としています。

  • プログラム/スクリプト:powershell.exe
  • 引数の追加:-Command "c:\work\sendmsg.ps1 -smtpHost 'SMTPサーバーのFQDNまたはIPアドレス' -msgFrom '差出人メールアドレス' -msgTo '宛先メールアドレス' -msgSubject '件名' -msgBody 'メッセージ本文'"
param($smtpHost,$msgFrom,$msgTo,$msgSubject,$msgBody)
$objEmail = new-object System.Net.Mail.SmtpClient($smtpHost)
$objEmail.Send($msgFrom,$msgTo,$msgSubject,$msgBody)
サンプルスクリプト2:sendmsg.ps1

 ここまでの2つのサンプルスクリプトは、SMTP接続と転送を既定のポート25/TCPで無条件で受け付けるSMTPサーバーがある場合に利用できます。企業のイントラネット内であれば、そのようなSMTPサーバーがあるかもしれませんが、通常、そのようなSMTPサーバーは迷惑メールやマルウェアの踏み台などに悪用されるため、安全ではありません。

 現在、多くのインターネットサービスプロバイダー(ISP)は、「Outbound Port 25 Blocking」(アウトバウンドポート25ブロッキング、OP25B)の対策をしていますし、SMTP接続に「POP before SMTP」や「SMTP認証」の認証を要求したり、SMTPトラフィックのSSLによる暗号化を要求したりします。こうした最近のセキュリティ対策は、スクリプトやプログラムからの電子メールの自動送信を困難にしています。このことが、タスクスケジューラで廃止されたことにも影響しているのかもしれません。

 以下のサンプルスクリプト3の「sendmsgv2.ps1」は、サンプルスクリプト2を改造して、25以外のポート番号、SMTP認証、SSL暗号化(あり/なし)に対応させたものです。

param($msgTo,$msgSubject,$msgBody)
#SMTPサーバーの設定
$smtpHost = "SMTPサーバーのFQDNまたはIPアドレス"
$msgFrom = "差出人メールアドレス"
$accountName = "メールアカウントのユーザー名"
$accountPass = "メールアカウントのパスワード"
$smtpPort = 587	  #SMTPポート番号
$smtpSSL = $false	  #SSL暗号化($trueまたは$false)
#SMTPクライアントの設定
$objEmail = new-object System.Net.Mail.SmtpClient
$objEmail.Host = $smtpHost
$objEmail.Port = $smtpPort
$objEmail.EnableSSL = $smtpSSL
$objEmail.Credentials = New-Object Net.NetworkCredential
$objEmail.Credentials.UserName = $accountName
$objEmail.Credentials.Password = $accountPass
#メッセージ送信
$objEmail.Send($msgFrom,$msgTo,$msgSubject,$msgBody)
サンプルスクリプト3:sendmsgv2.ps1

PowerShellのSend-MailMessageコマンドレットを使う方法

 Windows PowerShell 2.0以降が備えるSend-MailMessageコマンドレットを使用すると、スクリプトを書かなくても1行のコマンドラインで電子メールを送信することが可能です。タスクの設定で次のように指定すれば、サンプルスクリプト1やサンプルスクリプト2と同じことを実現できます。

  • プログラム/スクリプト:powershell.exe
  • 引数の追加:-Command "& {Send-MailMessage -from '差出人メールアドレス' -to '宛先メールアドレス' -subject '件名' -body 'メッセージ本文' -smtpServer 'SMTPサーバーのFQDNまたはIPアドレス'}"

 ちょっと引数として渡すコマンドラインが長くなってしまいますが、サンプルスクリプト3を1行のSemd-MailMessageコマンドレットで実行しようとすると、タスクの設定で次のように指定します。なお、ポート番号の指定(-Port)はPowerShell 3.0以降でサポートされます。Windows 8はPowerShell 3.0、Windows 8.1はPowerShell 4.0が標準なので、このバージョン要件については気にする必要はありません。また、SSL暗号化が必要な場合は、さらに「-UseSsl」オプションを追加してください。

  • プログラム/スクリプト:powershell.exe
  • 引数の追加:-Command "& {$mailuser = 'メールアカウント名'; $mailpass = convertto-securestring 'メールアカウントのパスワード' -asplaintext -force; $mailcred = New-Object -typename System.Management.Automation.PSCredential -argumentlist $mailuser, $mailpass; Send-MailMessage -from '差出人メールアドレス' -to '宛先メールアドレス' -subject '件名' -body 'メッセージ本文' -smtpServer 'SMTPサーバーのFQDNまたはIPアドレス' -Port ポート番号 -Credential $mailcred}"
「その知識、ホントに正しい? Windowsにまつわる都市伝説」バックナンバー

筆者紹介

山市 良(やまいち りょう)

岩手県花巻市在住。Microsoft MVP:Hyper-V(Oct 2008 - Sep 2014)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。マイクロソフト製品、テクノロジを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手がける。個人ブログは『山市良のえぬなんとかわーるど』。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。