我在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();
}
}
}
我该怎么办?
答案 0 :(得分:0)
在Java中将MQEnvironment.userID
设置为值时,该值实际上作为断言的用户ID传递给MQ队列管理器。
在C#中将MQEnvironment.UserId
设置为值时,该值不传递给MQ队列管理器,而是运行C#进程的id作为断言的用户ID传递
如果未被其他配置(例如SVRCONN
频道的MCAUSER
或CHLAUTH
规则将其映射到另一个配置),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队列管理器。如果您还有其他问题,请使用标签ibm-mq将它们作为新问题发布在Stackoverflow上,该标签由许多具有MQ知识的人员监控(有些甚至来自IBM)。
您可以在T.Rob's website查看许多与MQ安全相关的优秀演示文稿。
Capitalware每年赞助MQ技术会议,前几年的会议(其中许多与MQ安全相关)在MQTC v2.0.1.7's Sessions Page下归档(请查看以前的MQTC会话下方的底部) )。