在设置新权限之前,我想删除MSMQ队列上的所有权限,这将通过Octopus进行部署。这样我们就可以确保不存在任何遗留权限,并确保这些权限是相同的。
$QueueName = "MyQueue"
$QueuePermissions = Get-MsmqQueue -Name $QueueName | Get-MsmqQueueACL
$QueueUsers = $QueuePermissions.AccountName | Get-Unique
foreach ($User in $QueueUsers)
if ($User -like 'MyDomain*'){
#Something like
$QueueName | Set-MsmqQueueACL -UserName $User -Remove
}
不幸的是,我需要创建一个CSV权限列表,以便删除Set MsmqQueueACL。我怎么能拿到这个?
我是PowerShell的新手,所以任何帮助都将不胜感激。
谢谢!
首先,删除队列并重新创建是更可靠的方法。
我想你有一个理由要求你不要删除它们。这是一种我认为最适合你的方法。
使用System.Messing.MessageQueue 中的MessageQueue.ResetPermissions方法
powershell的代码示例:
$QueueName = ".private$MyQueue"
Add-Type -AssemblyName System.Messaging
$Q = [System.Messaging.MessageQueue]($QueueName)
$Q.ResetPermissions()
注意:此方法将队列权限恢复为默认权限,只有创建者才能完全访问队列。我的powershell使用了一个创建这些队列的自动化帐户,因此从这一点上来说,它会带走很多好处。但是,根据我过去的经验,如果所有队列权限都被打乱了,并且你没有一个完全控制队列的帐户,你可能最终不得不从存储中删除物理队列文件,然后重新启动MSMQ服务来清理它。因此,我敦促您保持权限的一致性,这样您以后对队列的操作就可以毫无问题地执行。
我已经创建了一个似乎有效的解决方案,如上所述,我不是PowerShell专家,但它可能会在未来帮助其他人:
$Queue= "MyQueueName"
#remove old permissions
$QueuePermissions = Get-MsmqQueue -Name $Queue | Get-MsmqQueueACL
$QueueUsers = $QueuePermissions.AccountName | Get-Unique
foreach ($User in $QueueUsers)
{
Write-Output "Permissions found for user: $User"
$tst = $QueuePermissions | where {$_.AccountName -eq $User}
$tst = $tst | Select -ExpandProperty Right
foreach ($Permission in $tst)
{
Write-Output "Removing permissions: $Permission"
$thisQueue | Set-MsmqQueueAcl -UserName $User -Remove $Permission | Out-Null
}
}