2016-04-18 118 views
1

我想在删除MSMQ队列中的所有权限之前设置新的权限,这将通过Octopus进行部署。 这样做可以确保不存在旧版权限并确保权限相同。删除MSMQ队列权限

$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 
    } 

不幸的是我需要为要删除的Set-MsmqQueueACL创建一个CSV列表权限。 我怎样才能得到这个?

我对PowerShell相当陌生,所以anyhelp将不胜感激。

谢谢!

+0

您可以通过多个用户在'-UserName'参数。所以你需要的是用用户名创建一个csv。你会发现很多例子来做到这一点。 –

+0

CSV应该是输入还是输出? IOW是否需要创建一个CSV列表,列出必须删除的内容,还是需要创建已删除(或将要删除)的权限报告? –

+0

我的最终目标是删除当前存在的所有权限。我不知道我可以传递多个用户名。 我可以只传递Get-MsmqQueueACL的结果来删除权限吗? –

回答

1

首先,删除队列并重新创建是更可靠的方法。

我假设你有一个理由,要求你不要删除它们。这是我认为最适合你的一种方法。

使用MessageQueue.ResetPermissions方法从System.Messing.MessageQueue

代码示例的PowerShell:

$QueueName = ".\private$\MyQueue" 
Add-Type -AssemblyName System.Messaging 
$Q = [System.Messaging.MessageQueue]($QueueName) 
$Q.ResetPermissions() 

注意:此方法把队列的权限恢复为默认只有创作者已经完全进入到队列中。我的powershell使用一个创建这些队列的自动化帐户,因此它从这一点上可以很好地解决。但是,根据我过去的经验,如果所有队列权限都是混乱的,并且没有完全控制队列的帐户,则最终必须从存储中删除物理队列文件并重新启动MSMQ服务以清除它向上。因此,我会敦促你保持权限的一致性,以便你稍后在队列中的操作可以毫无问题地执行。

+0

我无法导入System.Messaging命名空间,因为.Net中存在限制队列名称长度的缺陷。 我们使用Octopus Deploy来设置每个部署的权限,我们不想删除队列并在生产中重新创建它们,这可能意味着邮件将会丢失。 –

+0

很抱歉,您的解决方案应该可以正常工作,只需谨慎保留部署帐户的最低权限,以便将其他权限恢复。此外,[队列名称长于64个字符性能稍有下降(https://msdn.microsoft.com/en-us/library/ms706083(V = vs.85)的.aspx) –

+0

我不知道的是,性能速度较慢,有趣! –

0

我已经创建了一个似乎工作,如上面提到我不是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 
    } 
} 
+0

的$ thisQueue变量需要进行设置: $ thisQueue = GET-MsmqQueue -Name $ QUEUENAME 我建议不删除所有的权限,如果所有的权限被删除它可以使队列unuseable的MSMQ。 –