2014-11-11 4 views
5

Моя очередь MSMQ создается с помощью PowerShell DSC engine. Я вижу, как создаются очереди. Поскольку механизм DSC запускается из учетной записи SYSTEM, владелец очереди также получает значение SYSTEM. Когда я пытаюсь установить MSMQ ACL из консоли PowerShell я постоянно получать следующее сообщение об ошибке:Не удается настроить MSMQ ACL с помощью командлета PowerShell

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 

Я также не могу установить MSMQ ACL, используя пользовательский ресурс DSC, который в основном делает то же самое, только с системной учетной записью. Вопрос в том, есть ли способ установить разрешения MSMQ из ядра DSC PowerShell с помощью командлета Set-MSMQQueueACL. Или, по крайней мере, если я смогу решить упомянутую выше ошибку, то, возможно, я смогу решить и проблему DSC. Я запускаю Windows 2012 и WMF 4.0.

Заранее спасибо.

ответ

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 
    } 

Конечно, необходимо использовать тот же подход, когда очередь MSMQ будет создаваться с помощью ДСК.Таким образом, создание очереди MSMQ должно выполняться той же самой учетной записью, изначально собирающейся настроить ACL.

2

Я сделал что-то подобное недавно и попал в ту же проблему. Сначала вы должны взять на себя управление очередью (необходимы права администратора) и , затем вы можете изменить разрешения.

Сначала попробуйте выполнить эти шаги вручную в оснастке «Управление компьютером», чтобы проверить, устраняет ли ваша ошибка, а затем выясняет, как воспроизвести ее с помощью PowerShell.

  • Start -> Run -> compmgmt.msc
  • Expand "Управление компьютером (локальным) -> Службы и приложения -> Message Queuing -> Частные Очереди"
  • правой кнопкой мыши -> Свойства -> Безопасность -> Дополнительно -> Владелец -> Другие пользователи или группы ...
  • Введите имя пользователя (ДОМЕН \ администратор)
  • Нажмите кнопку ОК, затем снова ОК
  • Теперь вы должны иметь возможность редактировать безопасности с помощью сценария

В итоге я написал код PInvoke, чтобы взять на себя ответственность за очередь, используя C#, который я скомпилировал с помощью Add-Type в PowerShell. Я не могу разделить это, к сожалению, как это проприетарная, но этот вопрос может дать вам несколько указателей:

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)

0

Для этого в DSC, вы можете запустить команду, используя различные учетные данные с вашим пользовательским DSC ресурсом принимает параметр [PSCredential].

Для этого необходимо внести существенные изменения в инфраструктуру DSC. Смотрите мой ответ на этот вопрос: https://serverfault.com/questions/632390/protecting-credentials-in-desired-state-configuration-using-certificates/#632836

Если вы просто хотите проверить, прежде чем сделать эти изменения, вы можете сказать, DSC, чтобы хранить учетные данные в незашифрованном виде с использованием PSDscAllowPlainTextPassword = $true в данной конфигурации (see here for details).

+0

Так что прямо сейчас я передаю параметр [PSCredential] в свой пользовательский ресурс. Я пытаюсь сделать олицетворение, а затем выполнить необходимые команды, но, к сожалению, многие ресурсы по-прежнему используют SYSTEM при выполнении пользовательских команд, несмотря на то, что я пытаюсь изменить контекст процесса на учетную запись администратора домена. Вероятно, это причина, по которой MSMQ создает очереди с SYSTEM в качестве владельца очереди. –

+0

Редактировать свой вопрос, чтобы показать код; должен помочь нам ответить. – briantist

+0

Странная вещь, когда я пытаюсь установить ACL для очереди MSMQ (уже созданной DSC с помощью SYSTEM как владельца и полного доступа к управлению) изнутри контекста SYSTEM. Я получаю ошибку (которая запрещена), несмотря на то, что SYSTEM имеет FullControl доступ к очереди. –

0

Я также создал собственный ресурс DSC для настройки/изменения очередей MSMQ в моей веб-ферме. Поскольку DSC работает как SYSTEM, вы должны убедиться, что учетная запись SYSTEM имеет доступ для создания/изменения MSMQ на узле.

Существует способ запуска DSC в качестве учетной записи. Если это так, вы должны убедиться, что вы проходите в этой учетной записи при попытке создать/изменить свой MsmqQueue.

Я понимаю, что я отвечаю на старую нить. Но кто-то еще в ближайшем будущем может столкнуться с той же проблемой и столкнуться с этой нитью.

Наслаждайтесь & Удачи!

Смежные вопросы