我用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
通道的MCAUSER
或CHLAUTH
规则)覆盖,则确定您具有哪些授权。
在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会话)。