【问题标题】:C# MQ Connect get Error 2035 but Java MQ Connect works wellC# MQ Connect 出现错误 2035,但 Java MQ Connect 运行良好
【发布时间】:2017-02-09 06:26:03
【问题描述】:

我用 C# 编写了一个 MQ 7.5 连接例程,如下所示,但得到“2035”错误

using IBM.WMQ;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                MQEnvironment.Hostname = "192.168.163.63";
                MQEnvironment.Port = 1418;
                MQEnvironment.UserId = "mq";
                MQEnvironment.Password = "mq";
                MQEnvironment.Channel = "ServerChannel";

                MQQueueManager queueManager = new MQQueueManager("QueueManager1418");
            } catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
        }
            Console.ReadKey();
        }
    }
}

同时/同一台机器我写了下面的 JAVA MQ 连接,效果很好!!!

import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQQueueManager;

public class Program {
    public static void main(String[] args) {
        MQEnvironment.hostname = "192.168.163.63";
        MQEnvironment.port = 1418;
        MQEnvironment.userID = "mq";
        MQEnvironment.password = "mq";
        MQEnvironment.channel = "ServerChannel";
        try{
            MQQueueManager queueManager = new MQQueueManager("QueueManager1418");
            System.out.println("Connected");
        }catch (Exception ex){
            System.out.println(ex.getMessage());
        }
    }
}

我能做什么?

【问题讨论】:

  • 请添加 2035 错误描述
  • IBM 2035 MQRC_NOT_AUTHORIZED 在 WMQ 中
  • 我不是这个意思:)。通常有一些描述,例如:实体'user@computer'没有足够的权限访问对象'TEST.QUEUE'。指定的实体无权访问所需的对象。以下请求的权限未经授权: put/passid 确保已针对所需对象为此实体设置了正确的权限级别,或确保该实体是特权组的成员。
  • 您可以在 AMQERR 日志文件中找到错误。

标签: java c# ibm-mq


【解决方案1】:

在 Java 中,当您将 MQEnvironment.userID 设置为一个值时,该值实际上作为断言的用户 ID 传递给 MQ 队列管理器。

在 C# 中,当将 MQEnvironment.UserId 设置为一个值时,该值传递给 MQ 队列管理器,而是将运行 C# 进程的 id 作为断言的用户 id 传递。

断言的用户是 MQ 将使用的用户,如果它未被其他配置(例如将其映射到另一个 id 的 SVRCONN 通道的 MCAUSERCHLAUTH 规则覆盖)来确定您拥有的授权。

使用您的 Java 应用程序,您发送 mq 作为断言的用户 ID,这可能具有连接到队列管理器的适当权限,例如 +connect +dsp

使用您的 C# 应用程序,您可以发送运行进程的任何用户 ID,并且此用户 ID 可能没有具有连接到队列管理器的适当权限。

这表明您的 MQ SVRCONN 通道有一个空白 MCAUSER 并且没有 CHLAUTH 规则来覆盖此值。

解决此问题的一种方法是将SVRCONN 频道的MCAUSER 设置为mq。这可以通过ALTER CHL(ServerChannel) CHLTYPE(SVRCONN) MCAUSER('mq') 之类的命令来完成。然后,这将覆盖断言的用户 ID,并且 MQ 将始终使用用户 ID mq 来确定您拥有哪些授权,除非您有将其映射到其他用户 ID 的 CHLAUTH 规则。

如果您将其留空,那么任何人都可以轻松地声明任何用户 ID。如果您没有禁用 CHLAUTH 并且没有更改新 MQ 7.1 或更高版本队列管理器上的任何默认 CHLAUTH 规则,则默认情况下将阻止具有 MQ 管理员权限的用户标识进行连接。如果您确实禁用了CHLAUTH 或删除了阻止具有 MQ 管理员权限的用户 ID 的规则,那么任何人都可以断言具有 MQ 管理员权限的用户 ID。

我建议您阅读有关 MQ 安全性的更多信息,以决定如何进一步保护您的 MQ 队列管理器。如果您还有其他问题,请使用标签 在 Stackoverflow 上将它们作为新问题发布,该标签由许多具有 MQ 知识的人(甚至来自 IBM)进行监控。

您可以在T.Rob's website 上查看许多与 MQ 安全相关的优秀演示。

Capitalware 每年都会赞助 MQ 技术会议,前几年的会议(其中许多与 MQ 安全相关)存档在 MQTC v2.0.1.7's Sessions Page 下(查看底部的以前的 MQTC 会议)。

【讨论】:

    猜你喜欢
    • 2011-07-03
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 2019-01-01
    • 2023-02-06
    • 1970-01-01
    • 2012-08-21
    相关资源
    最近更新 更多