[Powershell]建立MSMQ(訊息佇列)設定

啟用完MSMQ功能,接著要新增MSMQ佇列。

以前新增MSMQ佇列也都用Windows GUI操作,有時候一口氣要在很多台伺服器各新增10組MSMQ佇列就還蠻花力氣的,如果也要個別指定使用權限,會讓設定的人想要深呼吸,這時候自動化的Poweshell 指令碼再度派上用場!

 

先回顧透過Windows GUI手動新增MSMQ佇列的操作:

 

1.啟動電腦管理

  開始 / 執行/ compmgmt.msc /S

2.電腦管理 > 服務與應用程式 > 訊息佇列 > 私有佇列新增

3.輸入佇列名稱

4.右鍵選取佇列的內容設定權限。

然後剛剛的動作如果執行n台伺服器各10次,我們或是SP就會沒有靈魂個幾分鐘。

 

Powershell建立訊息佇列

就3行指令!

[System.Reflection.Assembly]::LoadWithPartialName("System.Messaging") | Out-Null
$Queue = [System.Messaging.MessageQueue]::Create(".\private$\logQueue")
$Queue.SetPermissions("everyone",[System.Messaging.MessageQueueAccessRights]::FullControl, [System.Messaging.AccessControlEntryType]::Set)

執行結果:

是不是快!

 

 

用MqViewer工具檢查,除了快,也正確新增了一組logqueue!

 

接著驗證powershell設定的權限是否也正確!啟動電腦管理查詢

開始 > 輸入compmgmt.msc /S

權限也設定正確!(Everyone給full control)

 

 

查詢目前MSMQ所有的訊息佇列
Get-MsmqQueue -QueueType Private | % {$_.QueueName}
或
Get-WmiObject Win32_PerfRawdata_MSMQ_MSMQQueue | ?{$_.Name -match "private"} | %{$_.Name}

執行結果

 

 

試試看新增兩則訊息

1.先準備寫入poswershell方法

[Reflection.Assembly]::LoadWithPartialName("System.Messaging")
function WriteMessageToMSMQ($queueName, $message, $label)
  {
     $queue = new-object System.Messaging.MessageQueue $queueName
     $utf8 = new-object System.Text.UTF8Encoding
     $msgBytes = $utf8.GetBytes($message)
     $msgStream = new-object System.IO.MemoryStream
     $msgStream.Write($msgBytes, 0, $msgBytes.Length)
     $msg = new-object System.Messaging.Message
     $msg.BodyStream = $msgStream
     if ($label -ne $null)
       {
         $msg.Label = $label
       }
     $queue.Send($msg)
    Write-Host "Message written"
  }

 

測試新增第一則訊息

$queueName = ".\private$\logqueue"
$message = "This is my 1st test message"
WriteMessageToMSMQ $queueName $message $null

新增第二則訊息,並且設定Label名稱

$message = "This is my 2nd test message"
WriteMessageToMSMQ $queueName $message "MyLabel"

 

 

使用Mqueue viewer查詢第1則訊息

使用電腦管理介面查詢

試試看MSMQ佇列在服務狀態重新啟動時的狀態!

NET STOP MSMQ

NET START MSMQ

MSMQ也會因此消失!

 

 

小結:

  • Mqueue viewer可以很方便的查詢Queue!
  • Powershell can do EVERYTHING!

 

參考:


安裝訊息佇列 (MSMQ)

how-to-retrieve-names-of-all-private-msmq-queues-efficiently

Write to MSMQ from Powershell (And View in Server Manager)

Set the Default Lifetime for Messages

How to change default MSMQ Time-To-Reach-Queue time?