1

我有一个使用以下 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 版本:2012 年 5 月 2 日] 连接...失败。对象“QM_TEST”上的 MQCONNX 返回 2035 未授权。

我正在运行 WebSphere MQ v7.1。q SupportPac 安装在服务器上,我正在服务器上执行 q 命令。我想不出一种方法来传递通道名称 TEST_CHANNEL 和端口号 1414,是这个问题吗?

4

1 回答 1

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 没有管理权限。请注意,授予用户+set+setall在 QMgr 上允许他们使用 WMQ Explorer 或使用 PCF 命令的任何其他方式管理授权记录。考虑将 QMgr 的权限限制为+dsp +inq +connect.

通常,应用程序无法访问 DLQ,而是访问特定于应用程序的回退队列。如果应用程序被授予对 DLQ 的访问权限,则通常只是将消息放在那里,而不是将它们取回。这是因为 DLQ 是系统范围的资源,如果共享 QMgr,来自多个应用程序的消息可能会落在 DLQ 中。作为安全预防措施,将对该队列的删除访问权限限制为管理员。这样,在他们的应用程序之后进行清理的人就不会意外(或以其他方式)删除属于另一个应用程序的消息。

更新:
查看您的帖子,我注意到另一个差异。我曾假设您收到 2035 授权错误,因为您在绑定模式下连接的 ID 不是mqmor tcs-mq-user。再次查看后,我意识到您从未授权该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 变量。例如:

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
于 2012-07-27T21:31:38.170 回答