啟用完MSMQ功能,接著要新增MSMQ佇列。
以前新增MSMQ佇列也都用Windows GUI操作,有時候一口氣要在很多台伺服器各新增10組MSMQ佇列就還蠻花力氣的,如果也要個別指定使用權限,會讓設定的人想要深呼吸,這時候自動化的Poweshell 指令碼再度派上用場!
1.啟動電腦管理
開始 / 執行/ compmgmt.msc /S
2.電腦管理 > 服務與應用程式 > 訊息佇列 > 私有佇列新增
3.輸入佇列名稱
4.右鍵選取佇列的內容設定權限。
然後剛剛的動作如果執行n台伺服器各10次,我們或是SP就會沒有靈魂個幾分鐘。
就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)
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?