如何以编程方式设置MSMQ队列的所有者?

时间:2009-08-12 15:26:24

标签: powershell msmq

我有一个PowerShell脚本,可以为我创建一些私人队列。但是,队列默认由运行安装脚本的人拥有。我宁愿让他们拥有一个团体(即 - 管理员或其他人)。有谁知道怎么做?

foreach($strQueue in $strQueues) {
  if (![System.Messaging.MessageQueue]::Exists($strQueue)) {
    $q = [System.Messaging.MessageQueue]::Create($strQueue)
    $q.SetPermissions($queueUser, [System.Messaging.MessageQueueAccessRights]::FullControl, [System.Messaging.AccessControlEntryType]::Set)
    $q.SetPermissions("BUILTIN\Administrators", [System.Messaging.MessageQueueAccessRights]::TakeQueueOwnership, [System.Messaging.AccessControlEntryType]::Set)
    Write-Host "... created $strQueue and set FullControl permissions for $queueUser"
  }
}

3 个答案:

答案 0 :(得分:3)

我知道这是一个古老的问题,并且已经得到了回答,但我今天在这方面已经挣扎了很长时间,并且必须发布我的解决方案,以免其他人痛苦。

如果您默认无法访问MSMQ,则需要像@Noon Silk建议的那样以模拟用户身份运行命令。

此代码允许您以不同的用户身份创建和分配队列的权限

$Username = "Eric"
$Password = "MyPassword"

$securePass = ConvertTo-SecureString $Password -AsPlainText -Force
$credential = New-Object Management.Automation.PSCredential($Username, $securePass)

foreach($strQueue in $strQueues) {
  if (![System.Messaging.MessageQueue]::Exists($strQueue)) {
    $script = 
        {
            $q = [System.Messaging.MessageQueue]::Create($strQueue)
            $q.SetPermissions($queueUser, [System.Messaging.MessageQueueAccessRights]::FullControl, [System.Messaging.AccessControlEntryType]::Set)
            $q.SetPermissions("BUILTIN\Administrators", [System.Messaging.MessageQueueAccessRights]::TakeQueueOwnership, [System.Messaging.AccessControlEntryType]::Set)
            Write-Host "... created $strQueue and set FullControl permissions for $queueUser"
        }

    Invoke-Command -Credential $credential -ScriptBlock $script
  }
}

答案 1 :(得分:2)

我认为取得所有权只能从本机代码(使用msmq的c api)完成。所以这里没有权力。但是有一个c+ sample here

答案 2 :(得分:1)

您可以在创建相关管理员帐户之前尝试模拟他们......?