我试图使用PowerShell自动创建MSMQ队列
我没有创建队列的问题,我似乎无法正确设置权限
我一直在关注这里记录的Setting permissions on a MSMQ queue in a script
在这里https://docs.microsoft.com/en-us/powershell/module/msmq/set-msmqqueueacl?view=win10-ps
这是我创建队列的命令
New-MsmqQueue -Name "ThisIsTestName" -QueueType Private
但是当我尝试设置权限时,使用此命令
Get-MsmqQueue -Name "ThisIsATestName" -QueueType Private | Set-MsmqQueueAcl -UserName "Everyone" -Allow Peek,Receive,Send,Delete,GetProperties,GetPermissions
我收到了这个错误
Set-MsmqQueueACL : Cannot convert 'System.Object[]' to the type 'System.Nullable`1[Microsoft.Msmq.PowerShell.Commands.MessageQueueAccessRights]' required by parameter 'Allow'.
Specified method is not supported.
At line:1 char:105
+ ... veryone" -Allow Peek,Receive,Send,Delete,GetProperties,GetPermissions
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Set-MsmqQueueACL], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgument,Microsoft.Msmq.PowerShell.Commands.SetMSMQQueueACLComm
所以我尝试删除所有允许,只使用FullAccess。
这没有给我一个错误,但它没有设置权限
进一步看,我发现了这篇文章:
Set-MsmqQueueACL - Allow - can't use list as per docs?
所以我更新到以下内容
$allows = [Microsoft.Msmq.PowerShell.Commands.MessageQueueAccessRights]::Peek -bor
[Microsoft.Msmq.PowerShell.Commands.MessageQueueAccessRights]::Receive -bor
[Microsoft.Msmq.PowerShell.Commands.MessageQueueAccessRights]::Send -bor
[Microsoft.Msmq.PowerShell.Commands.MessageQueueAccessRights]::Delete -bor
[Microsoft.Msmq.PowerShell.Commands.MessageQueueAccessRights]::GetPermissions -bor
[Microsoft.Msmq.PowerShell.Commands.MessageQueueAccessRights]::GetProperties
Get-MsmqQueue -Name "ThisIsATestName" -QueueType Private | Set-MsmqQueueAcl -UserName "Everyone" -Allow $allows
但我仍然得到同样的错误
我知道我在某个地方犯了一个愚蠢的错误,但我看不出我做错了什么
试图在Windows 10机器上执行此操作
试试:
$var = "PeekMessage,ReceiveMessage,DeleteMessage"
Get-MsmqQueue -Name "testqueue3" -QueueType Private | Set-MsmqQueueAcl -UserName "Everyone" -Allow $var
要么
Get-MsmqQueue -Name "testqueue3" -QueueType Private | Set-MsmqQueueAcl -UserName "Everyone" -Allow FullControl
好吧,IAW MS文档,你的命令是正确的,有一个例外,定义接收权限的目标的方式。也许尝试使用'域用户'
Set-MsmqQueueACL cmdlet修改队列的访问权限。此cmdlet返回更新的MsmqQueueAcl对象。 cmdlet修改私有,公共,日志,系统日志,系统死信和系统事务死信队列。
示例1:修改名称PowerShell指定的队列的ACL
Get-MsmqQueue -Name "Order*" -QueueType Private | Set-MsmqQueueAcl -UserName "CONTOSO\DavidChew" -Allow Delete,Peek,Receive,Send -Deny TakeOwnership
此命令通过使用Get-MsmqQueue cmdlet获取名称以字符串Order开头的所有专用队列。该命令使用管道运算符将结果传递给当前cmdlet。当前cmdlet修改队列的ACL。
它也可能是cmdlet根据MS Docs示例需要真实的用户名。那么,你最终需要一个ForEach来获取它们。我没有MSMQ,所以无法进行物理验证。