首页 > 解决方案 > Delphi下的MQ(IBM MA7Q SupportPac)

问题描述

我一直在做一些研究,因为我需要在 Delphi 下实现 MQ 协议,但我发现唯一有趣的是很久以前它是 IBM 的“SupportPac MA7Q”。

我设法在 MA7Q 下拥有这些文件(MQI.pas 和 MQIC.pas),但是执行 MQCONNX 总是检索到对 QM 的无效登录(我猜是因为这些 PAS 文件太旧了,所以有些地方是错误的或丢失了)。

所以,最后,我来这里是为了问你如何处理这件事,因为实现目标是一件令人头疼的事情:通过 Delphi 与 MQ 通信。

任何想法、小费或任何东西都会不胜感激。


如今,我正面临通过 MQIC.pas 的连接(从我发现的 MA7Q SupportPac 下载),并且我正在Reason Code = 2035连接到我的 QM。

我尝试连接的 QM 是通过以下链接进行的: https ://developer.ibm.com/tutorials/mq-connect-app-queue-manager-windows/

连接的实际代码如下:

QMgrName := '';
for i := 1 to Length(edtQmgrName.Text) do
  QMgrName[i-1] := AnsiChar(edtQmgrName.Text[i]);

SetMQCD_CLIENT_CONN_DEFAULT(pom);

pom.ConnectionName := '';
for i := 1 to Length(edtConnName.Text) do
  pom.ConnectionName[i-1] := AnsiChar(edtConnName.Text[i]);

pom.QMgrName := '';
for i := 1 to Length(edtQmgrName.Text) do
  pom.QMgrName[i-1] := AnsiChar(edtQmgrName.Text[i]);

pom.ChannelName := '';
for i := 1 to Length(edtChnlName.Text) do
  pom.ChannelName[i-1] := AnsiChar(edtChnlName.Text[i]);

pom.UserIdentifier := AnsiString('app');
pom.Password := AnsiString('passw0rd');

ConnectOpts := MQCNO_DEFAULT;
ConnectOpts.ClientConnPtr := @pom;
ConnectOpts.ClientConnOffset := 0;

ConnectOpts.Version := MQCNO_VERSION_2;

MQCONNX ( @QMgrName, @ConnectOpts, @HConn, @Compcode, @Reason);
if CompCode <> MQCC_OK then
    ShowMessage( 'Connection Failed' );

我不知道出了什么问题,所以我一直在 2035 年度过。

经过简单阅读,我发现 2035 可能是异常或未经授权的登录失败(https://www.ibm.com/support/knowledgecenter/SSFKSJ_9.1.0/com.ibm.mq.sec.doc/q132560_。 .htm)。

常见的连接错误 CHLAUTH 规则用于确定是否可以启动通道,并且它们允许通过 MCAUSER 映射到另一个用户 ID。如果通道无法启动,通常会出现以下错误:

  1. RC 2035 MQRC_NOT_AUTHORIZED
  2. RC 2059 MQRC_Q_MGR_NOT_AVAILABLE
  3. AMQ4036 不允许访问
  4. AMQ9776:通道被用户 ID 阻止
  5. AMQ9777:通道被阻塞
  6. MQJE001:发生 MQException:完成代码 2,原因 2035
  7. MQJE036:队列管理器拒绝连接尝试

我不明白的是如何确定它是“未授权”还是“例外”。

然而,问题是:为什么我有这个 2035?连接中是否缺少某些内容?要配置的 QM 中缺少什么?

谢谢!


编辑更多信息 (03/11/2020 10:00)

日志现在说用户未正确验证。

我的代码中的用户是 ' app ' 但显示的是 '"ö'

我正在使用 MQCSP 结构,但不知何故没有正确传递。

sUser := 'app'#0;
sPW := 'passw0rd'#0;
sec.StrucId := MQCSP_STRUC_ID;
sec.Version := MQCSP_CURRENT_VERSION;
sec.AuthenticationType := MQCSP_AUTH_USER_ID_AND_PWD;
sec.CSPUserIdPtr := @sUser;
sec.CSPUserIdLength := MQLONG(Length(sUser));
sec.CSPUserIdOffset := 0;
sec.CSPPasswordPtr := @sPW;
sec.CSPPasswordOffset := 0;
sec.CSPPasswordLength := MQLONG(Length(sPW));
ConnectOpts.SecurityParmsPtr := @sec;

标签: delphiibm-mq

解决方案


这是我在您的另一个(重复)问题中发布的内容:德尔福下的 MQ (MA7Q SupportPac)

问题:

  • MQCONNX API 调用中是否存在“无效登录”的原因代码?即 2035 - MQRC_NOT_AUTHORIZED

  • 您是否为运行队列管理器的服务器使用了正确的用户 ID 和密码?如果再次使用 LDAP 身份验证,您是否为 LDAP 服务器使用了正确的用户 ID 和密码?

  • 您或 MQAdmin 是否授予您的 UserId 访问队列管理器的权限?请参阅 MQ KnowLedge Center 中的setmqaut 命令

    setmqaut -m {QM_NAME} -t qmgr -g {GROUP} +connect +inq +dsp

    setmqaut -m {QM_NAME} -n MYQ.ABC.** -t queue -g {GROUP} +allmqi +dsp

  • 你用的是什么频道?您使用的是 SYSTEM.DEF.SVRCONN 频道吗?你不应该使用它。您或 MQAdmin 是否创建了 CHLAUTH 规则以允许您进行连接?

最后,您应该打开队列管理器“Authority Events”,然后运行您的程序。使用SupportPac MS0PMO71甚至MQ Visual Edit之类的工具来查看“SYSTEM.ADMIN.QMGR.EVENT”队列中的事件消息。事件消息将准确地告诉您权限问题是什么。


推荐阅读