2012-04-05 44 views
1

我有一个运行私有MSMQ 3.0队列的群集。我试图以编程方式设置权限,但似乎无法通过队列上的System.Messaging进行连接。下面的代码在使用本地队列时工作得很好(并且使用本地队列的。\ nomenclature)。如何以编程方式设置群集队列的权限?从活动节点执行如何在MSMQ集群队列上设置权限?

Powershell的代码

function set-msmqpermission ([string] $queuepath,[string] $account, [string] $accessright) 
{ 
    if (!([System.Messaging.MessageQueue]::Exists($queuepath))){ 
    throw "$queuepath could not be found." 
} 
$q=New-Object System.Messaging.MessageQueue($queuepath) 
$q.SetPermissions($account,[System.Messaging.MessageQueueAccessRights]::$accessright,    
    [System.Messaging.AccessControlEntryType]::Set) 
} 
set-msmqpermission "clusternetworkname\private$\qa1ack" "UserAccount" "FullControl" 

异常调用 “SetPermissions” 与 “3” 的参数(一个或多个): “无效队列路径名。” 在行:30字符:19个 + $ q.SetPermissions < < < <($帐户,[System.Messaging.MessageQueueAccessRights] :: $ accessright,
+ CategoryInfo:NotSpecified:(:) [],MethodInvocationException + FullyQualifiedErrorId:DotNetMethodException

+0

$ account是域\用户名格式? – 2012-04-05 08:23:00

+0

没想到你可以改变任何远程私人队列。在主动节点上运行代码并不意味着您在集群资源的上下文中运行它。 (http://blogs.msdn.com/b/johnbreakwell/archive/2008/02/18/clustering-msmq-applications-rule-1.aspx)。公共队列远程管理更好。 – 2012-04-05 12:34:57

+0

我很乐意在本地运行它...在我的研究中,我阅读了您的博客。我正在使用一个系统,MSMQ最终将逐步淘汰,以支持消息代理,但在此之前,我会陷入私密队列。也就是说,我试图自动部署大约60多个队列和他们的权限。在这一点上,调查为何脚本不能运行的时间比我刚刚改变它的时间要多得多,但自动化是当天的口头禅。所以我的士兵... – JorgeSandoval 2012-04-05 18:54:55

回答

3

来自:http://winterdom.com/2011/10/using-powershell-with-clustered-msmq

你必须使用消息队列之前设置群集网络名称环境变量

$env:_CLUSTER_NETWORK_NAME_ = 'myclusterMSMQ' 
[System.Messaging.MessageQueue]::Create('.\Private$\MyQueue') 

将群集网络名称添加到脚本顶部应解决问题

链接到完整(简单 - 但适用于简单创建和分配烫发)脚本我作为另一个问题的答案提供的脚本。 https://stackoverflow.com/a/11268755/761599