无法使用PowerShell cmdlet设置MSMQ ACL

Jur*_*ins 5 powershell acl msmq 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
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

Jur*_*ins 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
    }
Run Code Online (Sandbox Code Playgroud)

当然,当DSC创建MSMQ队列时,有必要使用相同的方法。因此,MSMQ 队列创建应该由最初要调整 ACL 的同一帐户进行。