我使用以下MQSC命令创建了一个队列管理器QM_TEST:
SET AUTHREC OBJTYPE(QMGR) GROUP('mq-user') AUTHADD(INQ,DSP,CONNECT,SET,SETALL)
SET AUTHREC PROFILE(SYSTEM.MQEXPLORER.REPLY.MODEL) OBJTYPE(QUEUE) GROUP('mq-user') AUTHADD(INQ,DSP,GET)
SET AUTHREC PROFILE(SYSTEM.ADMIN.COMMAND.QUEUE) OBJTYPE(QUEUE) GROUP('mq-user') AUTHADD(INQ,DSP,PUT)
DEFINE CHANNEL ($cname) CHLTYPE (SVRCONN) TRPTYPE (TCP) MCAUSER('tcs-mq-user') REPLACE
SET CHLAUTH($cname) TYPE(ADDRESSMAP) ADDRESS(*) MCAUSER('tcs-mq-user')
DEFINE QLOCAL ($dlqname) REPLACE
SET AUTHREC PROFILE($dlqname) OBJTYPE(QUEUE) GROUP('mq-user') AUTHADD(ALL)
ALTER QMGR DEADQ($dlqname) FORCE
DEFINE LISTENER ($lname) TRPTYPE (TCP) CONTROL (QMGR) PORT ($port)
START LISTENER ($lname)
我有两个队列TEST1和TEST2使用:
创建DEFINE QLOCAL ($qname) GET(ENABLED) PUT(ENABLED) MAXDEPTH($maxdepth) REPLACE
SET AUTHREC PROFILE($qname) OBJTYPE(QUEUE) GROUP('mq-user') AUTHADD(ALL)
我正在尝试使用q程序实用程序将消息从TEST1复制到TEST2:
q -xb -mQM_TEST -iTEST1 -mQM_TEST -oTEST2 -p20
但是我收到了这个错误:
Paul Clarke的MQSeries Q程序[V6.0.0 Build:May 2 2012] 连接......失败了。对象'QM_TEST'上的MQCONNX返回2035 Not 授权..
我正在运行WebSphere MQ v7.1。 q SupportPac安装在服务器上,我正在服务器上执行q命令。我无法想出一种方法来传递通道名称TEST_CHANNEL和端口号1414,这是问题吗?
答案 0 :(得分:1)
程序通过共享内存而不是使用SVRCONN通道以绑定模式连接到QMgr。您可以通过ALTER QMGR AUTHOREV(ENABLED)
验证这一点,然后查看QMgr事件队列中生成的授权事件。如果已安装SupportPac MS0P,则可以右键单击队列并选择“格式化事件消息”以便以人类可读的格式查看。无论哪种方式,您都应该看到用于连接的ID不是tcs-mq-user
,而是用于运行Q程序的ID。尝试:
q -lmqic -xc -iTEST1 -oTEST2 -p20
使用-xc
运行时,程序会提示您输入频道详情。
Q程序可以将队列转储到文件,但它不是为此而设计的。来自SupportPac MO03 的QLoad程序是为此设计的,它将捕获邮件的所有方面,如果您获得适当授权,也可以完整地恢复它们。这包括消息ID,时间戳等。
最后,快速了解帖子中的AUTHREC
语句。由于您已经打算创建一个低权限MCAUSER
并为其设置权限,我认为您希望该ID不具有管理权限。请注意,在QMgr上授予用户+set
或+setall
允许他们使用WMQ Explorer或使用PCF命令的任何其他内容来管理授权记录。考虑将QMgr的权限限制为+dsp +inq +connect
。
通常,应用程序无法访问DLQ,而是可以访问特定于应用程序的回退队列。如果应用程序被授予访问DLQ的权限,通常只是将消息放在那里而不是让它们退出。这是因为DLQ是系统范围的资源,如果共享QMgr,来自多个应用程序的消息可能会落在DLQ中。作为安全预防措施,请将该队列上的删除访问权限限制为管理员。这样,有人在他们的应用程序清理后不会意外(或以其他方式)删除属于另一个应用程序的邮件。
<强>更新强>
回顾你的帖子,我注意到了另一个差异。我假设您收到2035授权错误,因为您在绑定模式下使用mqm
或tcs-mq-user
以外的ID进行连接。再看一遍之后,我意识到您从未授权mq-user
组到您尝试访问的队列。您将其授权给在此方案中未使用的命令队列和回复模型。 (WMQ Explorer使用它们。)因此,添加以下规则:
SET AUTHREC PROFILE(TEST1) OBJTYPE(QUEUE) GROUP('mq-user') AUTHADD(PUT,GET,INQ,BROWSE)
SET AUTHREC PROFILE(TEST2) OBJTYPE(QUEUE) GROUP('mq-user') AUTHADD(PUT,GET,INQ,BROWSE)
如果您实际连接为tcs-mq-user
,这将解决身份验证问题。
据我所知,没有办法在命令行上将通道传递给Q,但它确实接受标准的MQSERVER variable。例如:
export MQSERVER="$cname/TCP/localhost($port)"
...其中$cname
是频道名称,$port
是端口。这是我的测试:
tcs-mq-user:~> export MQSERVER="TEST.SVRCONN/TCP/localhost(1414)"
tcs-mq-user:~> q -xb -iTEST1 -mQMTEST -lmqic
MQSeries Q Program by Paul Clarke [ V6.0.0 Build:May 2 2012 ]
Connecting ...connected to 'JMSDEMO'.
No more messages.
tcs-mq-user:~>
至于为什么它找不到客户端库,你安装了吗?
tcs-mq-user:~> rpm -qa | grep MQSeriesClient
MQSeriesClient-7.5.0-0