C#MQ Connect获取错误2035,但Java MQ Connect运行良好

时间:2016-10-09 12:41:50

标签: java c# ibm-mq

我在C#中编写了一个MQ 7.5 Connection例程,但是得到了“2035”错误

public boolean allSame(Object... os) {
     Object first = os[0];

     for (Object o : os) 
         if (!first.equals(os)) return false;

     return true;
}

并且在同一时间/同一台机器上我写下了JAVA MQ Connection,效果很好!

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

我该怎么办?

1 个答案:

答案 0 :(得分:0)

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

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

如果未被其他配置(例如SVRCONN频道的MCAUSERCHLAUTH规则将其映射到另一个配置),MQ将使用断言用户确定您拥有的授权。标识。

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

使用您的C#应用​​程序,您可以发送正在运行该进程的用户ID,并且此用户ID可能具有连接到队列管理器的正确的permisisons。

这表示您的MQ SVRCONN频道空白MCAUSER并且没有CHLAUTH规则来覆盖此值。

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

如果您将其留空,那么任何人都可以轻松断言任何用户ID。如果未禁用CHLAUTH并且未更改新MQ 7.1或更高版本队列管理器上的任何缺省CHLAUTH规则,则默认情况下将阻止具有MQ管理员权限的用户ID进行连接。如果您确实禁用了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会话下方的底部) )。