无法使用PowerShell cmdlet设置MSMQ ACL

时间:2014-11-11 14:01:25

标签: powershell msmq acl dsc

我的MSMQ队列由PowerShell DSC引擎创建。我可以看到队列被创建了。由于DSC引擎从SYSTEM帐户运行,因此队列所有者也设置为SYSTEM。 当我尝试从PowerShell控制台设置MSMQ ACL时,我不断收到以下错误:

PS C:\Users\Administrator.DOMAIN> whoami; Get-MsmqQueue queue1 | Set-MsmqQueueACL -UserName "Everyone" -Allow FullControl
DOMAIN\administrator
Set-MsmqQueueACL : Failed to set security descriptor. Error code: 3222143013
At line:1 char:50
+ whoami; Get-MsmqQueue incredipay_atm_processor | Set-MsmqQueueACL -UserName "Eve ...
+                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidResult: (FullControl:MessageQueueAccessRights) [Set-MsmqQueueACL], Win32Exception
    + FullyQualifiedErrorId : Failed to set security descriptor. Error code: 3222143013,Microsoft.Msmq.PowerShell.Commands.SetMSMQQueueACLCommand

我也无法使用自定义DSC资源设置MSMQ ACL,这基本上只从SYSTEM帐户执行相同的操作。 所以问题是有没有办法使用Set-MSMQQueueACL cmdlet在PowerShell DSC引擎中设置MSMQ权限。或者至少如果我能够解决前面提到的错误,那么也许我也能解决DSC问题。 我正在运行Windows 2012和WMF 4.0。

提前致谢。

4 个答案:

答案 0 :(得分:2)

我最近做了类似的事情并遇到了同样的问题。您必须首先获得队列的所有权(需要管理员权限),然后然后您可以更改权限。

首先尝试使用“计算机管理”管理单元中的这些手动步骤来检查它是否解决了您的错误,然后找出如何通过PowerShell重现它。

  • 开始 - >运行 - > COMPMGMT.MSC
  • 展开"计算机管理(本地) - >服务和应用 - >消息队列 - >私人队列"
  • 右键单击 - >属性 - >安全 - >高级 - >所有者 - >其他用户或群组......
  • 输入您的用户名(DOMAIN \ administrator)
  • 单击“确定”,然后再次单击“确定”
  • 您现在应该可以通过脚本编辑安全性

我最终编写了一些PInvoke代码,使用C#获取队列的所有权,我在PowerShell中使用Add-Type动态编译。不幸的是,由于它是专有的,我无法分享它,但这个问题可能会给你一些指示:

How do I set the owner of a message queue?

P.S。错误代码3222143013是0xC00E0025,转换为MQ_ERROR_ACCESS_DENIED(参见http://msdn.microsoft.com/en-us/library/ms700106%28v=vs.85%29.aspx

答案 1 :(得分:1)

我已成功通过在自定义DSC资源中使用以下代码来解决此问题:

        $ScriptBlock={
        param(
            [String] $QueueName,
            [String]  $Username,
            [String[]] $MessageQueueAccessRight,
            [ValidateSet("Allow","Deny")]
            [String] $MessageQueueAccessType
        ) 
        $params = @{}
        $queue = Get-MSMQQueue -Name $QueueName
        $params.Add("InputObject",$queue)
        $params.Add("Username",$Username)
        switch ($MessageQueueAccessType)
        {
            "Allow" {$params.Add("Allow","$MessageQueueAccessRight"); Break;}
            "Deny" {$params.Add("Deny","$MessageQueueAccessRight"); Break;}
        }
        Set-MsmqQueueACL @params
    }
    Foreach($MessageQueueAccessRight in $MessageQueueAccessRights)
    {
        Invoke-Command -ScriptBlock $ScriptBlock -ComputerName . -Credential $DomainAdministratorCredential -ArgumentList $QueueName,$Username,$MessageQueueAccessRight,$MessageQueueAccessType
    }

当DSC创建MSMQ队列时,必须使用相同的方法。因此,MSMQ队列创建应该由同一个帐户创建,该帐户最初将调整ACL。

答案 2 :(得分:0)

要在DSC中执行此操作,您可以通过使自定义DSC资源采用[PSCredential]参数来使用不同的凭据运行命令。

要安全地执行此操作,需要对DSC基础结构进行一些重大更改。请参阅我对此问题的回答:https://serverfault.com/questions/632390/protecting-credentials-in-desired-state-configuration-using-certificates/#632836

如果您只想在进行这些更改之前进行测试,可以告诉DSC允许使用配置数据see here for details中的PSDscAllowPlainTextPassword = $true以纯文本格式存储您的凭据。

答案 3 :(得分:0)

我还创建了一个自定义DSC资源来设置/修改我的Web场中的MSMQ队列。由于DSC以SYSTEM身份运行,因此您必须确保SYSTEM帐户有权在节点上创建/修改MSMQ。

有一种方法可以将DSC作为帐户运行。如果是这种情况,那么在尝试创建/修改MsmqQueue时,您必须确保传入该帐户。

我知道我正在回应旧线程。但是在不久的将来,其他人可能会面临同样的问题并遇到这个问题。

享受&祝你好运!

相关问题