6

我的 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

4 回答 4

2

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

首先在计算机管理管理单元中尝试这些手动步骤以检查它是否解决了您的错误,然后确定如何通过 PowerShell 重现它。

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

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

如何设置消息队列的所有者?

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

于 2014-11-11T14:54:56.983 回答
1

I've managed to overcome this issue by using following code in my custom DSC resource:

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

Of course it's necessary to use the same approach when MSMQ queue gets created by DSC. So MSMQ queue creation should be made by the same account, whose initially going to adjust ACLs.

于 2014-11-13T08:18:11.513 回答
0

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

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

如果您只想在进行这些更改之前进行测试,您可以告诉 DSC 允许PSDscAllowPlainTextPassword = $true在配置数据中使用明文存储您的凭据(有关详细信息,请参见此处)。

于 2014-11-11T15:02:33.983 回答
0

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

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

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

享受并祝你好运!

于 2017-05-19T21:48:33.563 回答