2009-04-19 11 views

Antwort

12

Ein Geschenk (2015) Tag Antwort auf diese Frage.

Beispiel:

New-MsmqQueue -Name "MyQueue" -QueueType Private 
Get-MsmqQueue -Name "MyQueue" -QueueType Private | 
    Set-MsmqQueueAcl -UserName "Everyone" -Allow FullControl 

Betrifft: Windows 8.1, Windows Powershell 4.0, Windows Server 2012 R2

Referenz: https://technet.microsoft.com/en-us/library/dn391735(v=wps.630).aspx

+1

anstelle der 'Get-MsmqQueue' könnten Sie auch' $ newQueue = New-MsmqQueue ... 'und dann' $ newQueue | Set-MsmqQueueAcl ... ' – Greg

2

Es gibt nichts in Powershell für diese gebaut ist, aber Sie können die .NET-Framework-Klassen verwenden. Laden Sie einfach System.Messaging.dll und verwenden Sie MessageQueue.SetPermissions(), um die ACL in der Warteschlange zu ändern.

26

Und hier einige Beispiele einschließlich Powershell die Berechtigungen einstellen ... traurig über die Länge

Write-Host "" 
Write-Host "Examples using the .NET System.Messaging assembly to access MSMQ" 
Write-Host "" 

Write-Host "... load the .NET Messaging assembly" 
[Reflection.Assembly]::LoadWithPartialName("System.Messaging") 

Write-Host "" 

if ([System.Messaging.MessageQueue]::Exists(".\private$\MyQueue")) 
    { 
    [System.Messaging.MessageQueue]::Delete(".\private$\MyQueue") 
    Write-Host "... delete old myqueue" 
    } 
if ([System.Messaging.MessageQueue]::Exists(".\private$\BtsQueue")) 
    { 
    [System.Messaging.MessageQueue]::Delete(".\private$\BtsQueue") 
    Write-Host "... delete old btsqueue" 
    } 

Write-Host "... create a new queue" 
$q1 = [System.Messaging.MessageQueue]::Create(".\private$\MyQueue") 

Write-Host "... create new queue, set FullControl permissions for CORP\BIZTALK" 
$qb = [System.Messaging.MessageQueue]::Create(".\private$\BtsQueue") 

$qb.SetPermissions("CORP\BIZTALK", 
     [System.Messaging.MessageQueueAccessRights]::FullControl,    
     [System.Messaging.AccessControlEntryType]::Set) 

Write-Host "... list existing queues" 
$pqs = [System.Messaging.MessageQueue]::GetPrivateQueuesByMachine(".") 
Write-Host " Count: "$pqs.length -ForegroundColor gray 
foreach($q in $pqs) 
    { 
    Write-Host "  "$q.QueueName -ForegroundColor gray 
    } 

Write-Host "... access existing queue" 
$q2 = New-Object System.Messaging.MessageQueue ".\private$\MyQueue" 

Write-Host "... adding string Formatter and additional properties " 
$q2.Formatter.TargetTypeNames = ,"System.String" 
$q2.MessageReadPropertyFilter.ArrivedTime = $true 
$q2.MessageReadPropertyFilter.SentTime = $true 

Write-Host "... create a new High priorty message " 
$msg = New-Object System.Messaging.Message "TestMessage" 
$msg.label = "Test Msg Label" 
$msg.body = "Add some body to test message" 
$msg.priority = [System.Messaging.MessagePriority]::High 

Write-Host "... send the High message" 
$q2.send($msg) 

$msg.body = "Some more text for the test message" 
$msg.priority = [System.Messaging.MessagePriority]::Low 

Write-Host "... send the Low message" 
$q2.send($msg) 

Write-Host "... check the queue " 
Write-Host " Count: "$q2.GetAllMessages().length -ForegroundColor gray 

Write-Host "... peek at queue" 
$ts = New-Object TimeSpan 10000000 # 1 sec. timeout just in case MSMQ is empty 
$pk = $q2.Peek($ts) 
Write-Host " ArrivedTime: "$pk.ArrivedTime.DateTime -ForegroundColor gray 
Write-Host " SentTime : "$pk.SentTime.DateTime -ForegroundColor gray 

Write-Host "... check the queue " 
Write-Host " Count: "$q2.GetAllMessages().length -ForegroundColor gray 

Write-Host "... receive from queue" 
$rmsg = $q2.receive($ts) 
Write-Host " Body : "$rmsg.body -ForegroundColor gray 
Write-Host " Label: "$rmsg.label -ForegroundColor gray 

Write-Host "... check the queue " 
Write-Host " Count: "$q2.GetAllMessages().length -ForegroundColor gray 

Write-Host "... purge the queue " 
$q2.Purge() 

Write-Host "... check the queue " 
Write-Host " Count: "$q2.GetAllMessages().length -ForegroundColor gray 

Write-Host "" 
Write-Host "All done, but remember to delete the test queues !!" 
+2

Dies ist nun obsolet - @Davids Antwort viel besser ist. –

+0

Dies ist eine großartige Antwort für Benutzer von Windows 7 oder Windows Server 2012 R2. Ansonsten ist @GregSansom korrekt. Vielen Dank, dass Sie diese Antwort gepostet haben. – fourpastmidnight

2

Windows-2012 und 8.1 jetzt haben MSMQ Cmdlets. Der eine, um die Berechtigungen für eine Warteschlange zu setzen ist: Set-MsmqQueueAcl