「オペレータの通知機能」の、制約に注意

SQL Server のエージェントで、オペレータの通知機能に Net Send があります。
しかし、Windows Server 2008 や、R2 上では、機能しないので、注意が必要です。

net send コマンドがない!

Windows Server 2008 (R2含む) には、net send コマンドがありません。

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に改行を入れたい場合は、"^"(キャレット)を使うなり、リダイレクトするなりで対応。