c# MQ Connect得到错误2035,但Java MQ Connect工作得很好



我用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());
        }
    }
}

我能做什么?

在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 Administrator权限的用户id将被阻止连接。如果您确实禁用了CHLAUTH或删除了阻止具有MQ管理员权限的用户id的规则,那么任何人都可以断言具有MQ管理员权限的用户id。

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

您可以在t.r rob的网站上查看许多与MQ安全相关的优秀演讲。

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

最新更新