【问题标题】:Remove MSMQ Queue Permissions删除 MSMQ 队列权限
【发布时间】:2016-08-10 01:20:52
【问题描述】:

我想在我们设置新权限之前删除 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
  }

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

我对 PowerShell 还很陌生,因此我们将不胜感激。

谢谢!

【问题讨论】:

  • 您可以将多个用户传递给-UserName 参数。因此,您只需要使用用户名创建一个 csv。你会发现很多这样的例子。
  • CSV 应该是输入还是输出? IOW 您需要创建一个 CSV 列表来列出必须删除的内容,还是需要创建已删除(或将要删除)权限的报告?
  • 我的最终目标是删除当前存在的所有权限。我不知道我可以传递多个用户名。我可以只传递 Get-MsmqQueueACL 的结果来删除权限吗?

标签: powershell msmq


【解决方案1】:

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

我认为您有理由要求您不要删除它们。这是我认为最适合您的方法。

使用来自System.Messing.MessageQueueMessageQueue.ResetPermissions方法

powershell的代码示例:

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

注意:此方法将队列权限恢复为默认值,只有创建者才能完全访问队列。我的 powershell 正在使用创建这些队列的自动化帐户,因此从这一点开始它会很好。但是,根据我过去的经验,如果所有队列权限都混乱了,并且您没有完全控制队列的帐户,您最终可能不得不从存储中删除物理队列文件并重新启动 MSMQ 服务以清理它向上。因此,我敦促您保持权限的一致性,以便您以后对队列的操作可以毫无问题地执行。

【讨论】:

  • 我无法导入 System.Messaging 命名空间,因为 .Net 中存在限制队列名称长度的缺陷。我们正在使用 Octopus Deploy 在每次部署时设置权限,我们不想像在生产中那样删除队列并重新创建它们,这可能意味着消息会丢失。
  • 很抱歉听到这个消息,您的解决方案应该可以工作,只是要小心保留您的部署帐户的最低权限,以便它可以恢复其他权限。此外,queue name longer than 64 chars slightly reduce performance
  • 性能降低似乎只适用于公共队列,我的都是私有队列(谢天谢地)。
【解决方案2】:

如上所述,我创建了一个似乎可行的解决方案,我不是 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
    }
}

【讨论】:

  • 需要设置 $thisQueue 变量: $thisQueue = Get-MsmqQueue -Name $QueueName 我建议不要删除所有权限,因为如果删除所有权限,它会使队列无法用于 MSMQ。
猜你喜欢
  • 2017-08-15
  • 2010-12-06
  • 2010-11-28
  • 2010-10-20
  • 2012-04-18
  • 2018-09-02
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
相关资源
最近更新 更多