我的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。
提前致谢。
答案 0 :(得分:2)
我最近做了类似的事情并遇到了同样的问题。您必须首先获得队列的所有权(需要管理员权限),然后然后您可以更改权限。
首先尝试使用“计算机管理”管理单元中的这些手动步骤来检查它是否解决了您的错误,然后找出如何通过PowerShell重现它。
我最终编写了一些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时,您必须确保传入该帐户。
我知道我正在回应旧线程。但是在不久的将来,其他人可能会面临同样的问题并遇到这个问题。
享受&祝你好运!