Ask CORE

Microsoft Japan Windows Technology Support

MSGコマンドを利用してドメイン内のすべてのコンピューターにログオン中のユーザーへメッセージを送信する

Windows プラットフォーム サポートの 佐々木 俊暢 です。

管理者からユーザーに対して業務連絡や緊急の告知を行う際にメーリングリストやメッセンジャーなどを利用した方法が用いられることがありますが、ユーザーがメールやメッセンジャーに気づかず、連絡が行き届かないことがありますね。

もっと、リアルタイムに確実なメッセージの伝達を行いたい!という管理者様のために、Windows 標準コマンドである、MSG コマンドを利用した、ユーザーへのメッセージの通知方法をご紹介させていただきます。

MSG コマンドでは、以下のようなメッセージをユーザーに通知することができます。(OS により、表示フォーマットが異なります。)

img2

※ MSG コマンドのメッセージ表示画面は最前面に表示されるため、他のウィンドウを開いているユーザーに気づいてもらいやすくなります。

なお、MSG コマンドには以下のような注意事項がございます。

注意事項:

  1. すべてのコンピューターに対してメッセージを送ることはできません。1 台のコンピューターに対してのみメッセージ送信が可能です。
  2. このコマンドの実行には管理者権限が必要です。
  3. 初期値では、受信したメッセージは 60 秒間だけ画面に表示されます。/TIME:秒 オプションを指定することで、表示時間を変更することは可能です。

MSG コマンドはメッセージを送信するコンピューターを 1 台しか指定することができないため、複数のコンピューターに通知するためには MSG コマンドのみでは実現することができません。
そのため、複数のコンピューターに通知を行うためにはスクリプティングを行うなどの工夫が必要になります。

今回は PowerShell を用いた複数のコンピューターに対して、MSG コマンドでメッセージを送付する方法をご紹介させていただきます。

PowerShell を用いて、ドメイン内のすべてのコンピューターに対して、MSG コマンドでメッセージを送信する方法。

前提条件:

  1. MSG コマンドは、ドメイン コントローラーから、管理者の権限を持ったユーザーから送信します。
  2. MSG コマンドでメッセージを送付する対象のコンピューターはドメインに参加しているコンピューターとします。
  3. メッセージの表示対象は、ログオン中のユーザーとします。

実際複数のコンピューターに対して、MSG コマンドの送信を行う前に、1 台のコンピューターに対して、期待するメッセージが送信できるか確認しましょう。

(1) MSG コマンドの送信確認

ドメイン コントローラーに管理者権限を持つユーザーでログオンし、コマンド プロンプトから、以下のコマンドを実行します。
メッセージの送信対象のコンピューター名は、COMPUTER-001 とします。

msg /server:COMPUTER-001 * this is test message.

COMPUTER-001 にメッセージが表示されない場合には、メッセージを受ける側のコンピューターで以下の内容を確認してください。

[1] レジストリを変更する
  1. Win + R キーを押下し、[ファイル名を指定して実行] から “regedit” を実行し、[レジストリ エディター] を起動します。
  2. 左側のペインで、以下のレジストリを展開します。
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server
  3. 右側のペインで [AllowRemoteRPC] をダブル クリックして開き、[値のデータ] を “1” に変更し、[OK] ボタンをクリックして閉じます。(*)
  4. [レジストリ エディター] を終了し、コンピューターを再起動します。

(*) 手順: 3 のレジストリが存在しない場合、新規に作成して追加することで同様の動作が可能です。

[2] リモート設定を変更する
  1. Win + R キーを押下し、[ファイル名を指定して実行] から “sysdm.cpl” を実行し、[システムの詳細設定] を開きます。
  2. [システムの詳細設定] で [リモート] タブをクリックします。
  3. [リモート デスクトップ] 枠内で次の設定をチェックします。
    “[ネットワーク レベル認証でリモート デスクトップを実行しているコンピューターからのみ接続を許可する (推奨)]”
  4. [OK] ボタンをクリックします。
[3] ファイアウォールを変更する
  1. Win + R キーを押下し、[ファイル名を指定して実行] から “wf.msc” を実行し、[セキュリティが強化された Windows ファイアウォール] 画面を開きます。
  2. [受信側の規則] の [リモート イベントのログ管理 (NP 受信)] を右クリックし、[規則の有効化] をクリックします。

1台のコンピューターに対し送信できましたら、次は複数のコンピューターに対し送信しましょう。

(2) ドメイン内のすべてのコンピューターでログオンしているユーザーにメッセージを送信する。

PowerShell を用いて、ドメイン コントローラーから、ドメインに参加しているすべてのコンピューター名を取得し、取得したコンピューター名のコンピューターに対して、ブロードキャストでメッセージを送信します。

以下にサンプル スクリプトをご紹介します。
拡張子を .ps1 としてファイルに保存し、管理者として実行します。

foreach($str_name in Get-ADComputer -Filter “*” | Select-Object “Name”){
$prams = “/SERVER:” + $str_name.Name + ” * /TIME:60″
$msg = (Get-Content -Path C:\msg.txt) -join “`r`n”
Start-Process -FilePath msg -ArgumentList $prams, $msg
}

上記のサンプル スクリプトについて、以下のとおり解説します。

Get-ADComputer コマンドレットを用いて、ドメイン内に参加しているすべてのコンピューター名を取得しています。
※ Get-ADComputer のオプションを利用し、検索対象のコンピューターを絞り込むことで、運用上の利便性が上がると思います。
foreach($str_name in Get-ADComputer -Filter “*” | Select-Object “Name”){

/SERVER オプションで、コンピューター名を指定し、/TIME: オプションでメッセージの表示時間を 60 秒間に指定しています。
※ /TIME: で指定するメッセージの表示時間を引数で指定できるように編集すると、運用上の利便性が上がると思います。$prams = $prams = “/SERVER:” + $str_name.Name + ” * /TIME:60″

送信メッセージは、C:\msg.txt に保存されているテキスト ファイルの内容を指定しています。
※ 送信メッセージを保存したファイルのパスを、引数で指定できるように編集すると、運用上の利便性が上がると思います。
$msg = (Get-Content -Path C:\msg.txt) -join “`r`n”

取得したコンピューター名に対して、MSG コマンドでメッセージを送信しています。
Start-Process -FilePath msg -ArgumentList $prams, $msg

補足 1:
PowerShell のスクリプト実行時に以下のようなエラーが表示される場合には、Set-ExecutionPolicy コマンドにて、スクリプトの実行ポリシーを変更してください。

*** スクリプト実行時のエラー
.\<スクリプト名>.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル <スクリプト ファイルパス> を読み込むことができません。詳細については、「about_Execution_Policies」(http://go.microsoft.com/fwlink/?LinkID=135170) を参照し
てください。
発生場所 行:1 文字:1
+ .\<スクリプト名>.ps1
+ ~~~~~~~~~~
+ CategoryInfo : セキュリティ エラー: (: ) []、PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess

Set-ExecutionPolicy コマンドレットの使用
https://technet.microsoft.com/ja-jp/library/ee176961.aspx

補足 2:
Get-ADComputer コマンドレットのオプションを利用して、用途に合わせたコンピューター検索をご検討いただけます。
以下のコマンド ラインでは、OU 単位でのコンピューター名の検索ができます。

Get-ADComputer -Filter “*” -SearchBase “OU=test_ou,DC=contoso,DC=com” | Select-Object “Name”

Get-ADComputer
https://technet.microsoft.com/en-us/library/ee617192.aspx

今回ご紹介させていただきましたユーザーへのメッセージの送信方法が、管理者様の環境運用の一助となりましたら幸いでございます。

近頃は寒暖の差の激しい季節になって参りました。
みなさまも、体調には十分をお気をつけて、お身体ご自愛ください。

佐々木 俊暢