【问题标题】:Connecting to IBM WebSphere MQ using .Net throws error MQRC_NOT_AUTHORIZED使用 .Net 连接到 IBM WebSphere MQ 会引发错误 MQRC_NOT_AUTHORIZED
【发布时间】:2017-04-21 10:01:59
【问题描述】:

我对 MQ 非常陌生,并试图在我的机器上配置它。要求是设置 MQ,以便我可以使用我的 C#.NET 代码在 MQ 中将 XML 文件作为消息发送/接收。我已经在我的机器上安装了 IBM WebSphere MQ 9.0 版本。据我所知,我至少需要设置队列管理器、队列和通道来实现这一点。所以我试图在我的 MQ 中设置这些。但是,当我尝试运行我的代码时,我收到错误“MQRC_NOT_AUTHORIZED”。

谁能指导我设置这些东西,以便通过 .NET 共享文件的场景可以工作?我猜在这种情况下客户端和服务器都将在我的机器上本地?在创建队列、通道等时有许多参数可供选择,这让我感到困惑,我想我在设置中选择了不正确的定义。

这是我的 .Net 代码:

using IBM.WMQ;
using System;
using System.Collections;

namespace MQTest
{

class MQTest
{
    public MQQueueManager ConnectMQ()
    {
        MQQueueManager queueManager;

        // Setup connection information                  
        Hashtable queueProperties = new Hashtable();
        queueProperties[MQC.HOST_NAME_PROPERTY] = "localhost";
        queueProperties[MQC.PORT_PROPERTY] = 1414;
        queueProperties[MQC.CHANNEL_PROPERTY] = "QM._TEST.SVRCONN";

        try
        {
            // Attempt the connection
            queueManager = new MQQueueManager("QM_TEST", queueProperties);
            Console.WriteLine("Connected Successfully");
        }
        catch (MQException mexc)
        {
            // TODO: Setup other exception handling
            throw new Exception(mexc.Message
                       + " ReasonCode: " + mexc.ReasonCode
                       + mexc.StackTrace, mexc);
        }

        // For now, return the queueManager to use in reading/writing messages next
        return queueManager;
    }
 }
}

这是我的 MQ 设置的快照:

队列管理器

队列

频道

听众

【问题讨论】:

  • 出现错误时 AMQERR01.LOG 中有什么内容。

标签: .net ibm-mq


【解决方案1】:

阿拉丁MQ.LOCAL.ONE

首先,使用混合大小写 MQ 对象是个坏主意。你只是自找麻烦。如果您不使用引号,MQ 喜欢将 MQ 对象大写。因此,最好只使用大写的 MQ 对象名称。

如果您的 UserId 不在 mqm 组中,那么您需要授予您的 UserId 权限以 (1) 访问队列管理器和 (2) 访问队列。

最好通过“组”而不是“用户 ID”来执行 MQ 权限。假设该组需要访问以“AladdinMQ.”开头的队列。以下是设置 OAM 权限的 setmqaut 命令:

setmqaut -m QM_TEST -t qmgr -g {GROUP} +connect +inq +dsp
setmqaut -m QM_TEST -n AladdinMQ.** -t queue -g {GROUP} +allmqi +dsp

其中 {GROUP} 是 UserId 所属的组的名称。

【讨论】:

  • 为了补充 Roger 的回答,几乎可以对 MQ 中的所有元素(尤其是通道)设置安全权限。可以设置拒绝,这将胜过授权权限。例如,如果您有权访问队列但被拒绝访问通道,则您无法访问任何内容。另请注意,如果您要发送通道有大小限制的大文件。
  • 当我使用我的 C# 代码连接时,哪个用户用于连接到 MQ?是我的机器登录用户吗?
  • 我通过查看事件日志找出了正在使用的用户,然后将该用户添加到 mqm 组。然后它开始工作了!
  • @AnilSoman 将用户添加到 mqm 不是解决问题的好方法。正如 Roger 所指出的,您应该为所需的队列提供用户权限,因为您将队列管理器添加到 mqm 组,所以到目前为止,您的用户可以完全管理队列管理器。
  • 谢谢@JoshMc.. 我会尝试从 mqm 组中删除我的用户,然后尝试提供特定的访问权限。此外,当我尝试在其他用户登录的情况下远程访问队列时,我收到错误 {2538}。这是因为防火墙设置现在允许访问吗?
猜你喜欢
  • 1970-01-01
  • 2020-04-23
  • 2013-04-06
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 2015-08-17
  • 2011-07-03
  • 2012-12-07
相关资源
最近更新 更多