「オペレータの通知機能」の、制約に注意
SQL Server のエージェントで、オペレータの通知機能に Net Send があります。
しかし、Windows Server 2008 や、R2 上では、機能しないので、注意が必要です。
net send コマンドがない!
Windows Server 2008 (R2含む) には、net send コマンドがありません。
- Command-line reference A-Z: Scripting; Management Services | Microsoft Docs
- Net services commands: Management Services | Microsoft Docs
- windows server 2003には、「Net サービス コマンド」の一部として、net send コマンドがありました。
- Net services commands: Management Services | Microsoft Docs
- Windows Server Commands, References, and Tools | Microsoft Docs
- Command-Line Reference | Microsoft Docs
- A-Z List | Microsoft Docs
- net 〜 のコマンドはありますが、数が減り、net send は見つかりません。
- A-Z List | Microsoft Docs
- Command-Line Reference | Microsoft Docs
windows server 2008 R2 SP1
実際にコマンドを実行してみました。
C:\>net /? このコマンドの構文は次のとおりです: NET [ ACCOUNTS | COMPUTER | CONFIG | CONTINUE | FILE | GROUP | HELP | HELPMSG | LOCALGROUP | PAUSE | SESSION | SHARE | START | STATISTICS | STOP | TIME | USE | USER | VIEW ]
windows server 2008 SP2 (x86)
実際にコマンドを実行してみました。
C:\>net /? このコマンドの構文は次のとおりです: NET [ ACCOUNTS | COMPUTER | CONFIG | CONTINUE | FILE | GROUP | HELP | HELPMSG | LOCALGROUP | PAUSE | PRINT | SESSION | SHARE | START | STATISTICS | STOP | TIME | USE | USER | VIEW ]
すでに使えないのですが・・・
オペレータ定義方法の、SQL Server 2008や、R2 版ヘルプを見ると、以下の記載が見つかります。
引用元:オペレーター - SQL Server | Microsoft Docs
今後のバージョンの MicrosoftSQL Server では、SQL Server エージェントからポケットベル オプションと net send オプションが削除される予定です。新しい開発作業では、これらの機能の使用を避け、現在これらの機能を使用しているアプリケーションは修正するようにしてください。
今後の通知は、メールのみになりそうです・・・。
(おまけ)代替のコマンドは?
net send に替わるコマンドを使用するジョブを作成し、同等の事が行えるか探ってみました。ただし、OSのコマンド発行を、 xp_cmdshell で行うため、セキュリティホールになる可能性があります。プロキシアカウントを使用するなどして、使用できる範囲を極力狭めるなど、対策が必要です。
「Command-line Reference」から以下をたどると、Msg というコマンドが見つかります。
ヘルプを表示させてみました
C:\>msg /? ユーザーにメッセージを送信します。 MSG {ユーザー名 | セッション名 | セッション ID | @ファイル名 | *} [/SERVER:サーバー名] [/TIME:秒] [/V] [/W] [メッセージ] ユーザー名 送信先のユーザー名を指定します。 セッション名 セッション名を指定します。 セッションID セッション ID を指定します。 @ファイル名 メッセージの送信先一覧のファイル (ユーザー名、 セッション名、セッション ID) を指定します。 * 指定されたサーバーのすべてのセッションにメッセージを 送信します。 /SERVER:サーバー名 送信先のサーバーを指定します (既定値は現在のサーバー)。 /TIME:秒 受信者の確認応答までの待ち時間を指定します。 /V 実行中に詳細情報を表示します。 /W ユーザーからの応答を待ちます。通常 /V オプションと共に 指定します。 メッセージ 送信するメッセージを指定します。指定しない場合は、入力 プロンプトが表示されるか、または stdin から読み取ります。
クライアント(Vistaや7)へ送信する際は、レジストリ操作が必要そう
Msg コマンドで、クライアント(Vistaや7)へ送信する際は、色々と問題もあるようで、レジストリ操作が必要になったりするようです。 【Management】Msgコマンドを使用すると「セッション名の取得エラー5」 – Junichi Anno's blog
ちなみに、システムプロパティーの「リモート デスクトップ」を、”許可する”にしても、変わりません。サーバ側から「リモート デスクトップ セッション ホストの構成」を使って、リモート接続を試みましたが、以下のエラーで接続できず・・・。
--------------------------- リモート デスクトップ セッション ホストの構成 --------------------------- 指定されたコンピューターから設定を取得できません。接続できるのは、Windows Server オペレーティング システムを実行しているコンピューターのみです。 --------------------------- OK ---------------------------
リモート サーバー管理ツール(Remote Server Administration Tools(RSAT))の、ターミナルや、リモートディスクトップあたりを導入すれば、GUIでも出来そうな気がしたので、Windows 7 に導入してみました。 (参考:RSATツールでWindows Server 2008をリモート管理する:Tech TIPS - @IT)
「Windowsの機能」から、「リモート サーバー管理ツール」 - 「役割管理ツール」 - 「リモート デスクトップ サービス ツール」を有効化。 「リモート デスクトップ サービス マネージャ」と、「リモート デスクトップ」(MMC版)が入りましたが、「リモート デスクトップ セッション ホストの構成」は、入らず。 「リモート デスクトップ サービス マネージャ」を色々と触ってみましたが、ダメですね。 見るところが、違うのかな?
レジストリを操作するしかないのか・・・。
ジョブを作ってみる
以下の様にバッチを実行する、T-SQL を実行するジョブを作りました。
EXEC xp_cmdshell 'C:\BAT\JOB001.BAT'; GO
バッチファイルの中身は、こんな感じ。
msg * /server:0.0.0.0 "hogehoge"
hogehogeに改行を入れたい場合は、"^"(キャレット)を使うなり、リダイレクトするなりで対応。
- 参考
- SQL Server で、コマンド実行。[xp_cmdshell]
- ジョブからジョブを実行。[sp_start_job (Transact-SQL)]
- バッチを実行しているアカウントを調べる。[whoami](Windows Server 2003 や、2008で使えるようです)
- キーボードの入力をファイルからリダイレクトする。[ < ]
- キャレットで改行をエスケープ。[ ^ ]