我在运行Windows Server 2003的虚拟机上拥有IBM WebSphere MQ版本6的服务器端,坐在Vista桌面上。桌面安装了客户端。
我有一个小测试程序(来自他们的代码示例),它将消息放入队列并再次取消。当使用服务器绑定直接在服务器上运行时,此程序有效。但是,我无法通过客户端绑定从客户端开始工作。
我得到的错误是CompCode 2,原因2035,这是授权失败。
我怀疑这与默认情况下程序在我的用户下运行这一事实有关,该程序位于虚拟机不知道(并且无法访问)的域上。
我已经在vm上设置了一个我想要连接的本地用户(用户:websphere,密码:websphere),但我不清楚如何让这一切都能正常工作。我有下面的代码,我在通道和端点上尝试了各种安全性退出设置组合,但我无法摆脱2035年。
任何人都有这方面的经验吗?非常感谢帮助!
代码:
using System;
using System.Collections;
using IBM.WMQ;
class MQSample
{
// The type of connection to use, this can be:-
// MQC.TRANSPORT_MQSERIES_BINDINGS for a server connection.
// MQC.TRANSPORT_MQSERIES_CLIENT for a non-XA client connection
// MQC.TRANSPORT_MQSERIES_XACLIENT for an XA client connection
// MQC.TRANSPORT_MQSERIES_MANAGED for a managed client connection
const String connectionType = MQC.TRANSPORT_MQSERIES_CLIENT;
// Define the name of the queue manager to use (applies to all connections)
const String qManager = "QM_vm_win2003";
// Define the name of your host connection (applies to client connections only)
const String hostName = "vm-win2003";
// Define the name of the channel to use (applies to client connections only)
const String channel = "S_vm_win2003";
/// <summary>
/// Initialise the connection properties for the connection type requested
/// </summary>
/// <param name="connectionType">One of the MQC.TRANSPORT_MQSERIES_ values</param>
static Hashtable init(String connectionType)
{
Hashtable connectionProperties = new Hashtable();
// Add the connection type
connectionProperties.Add(MQC.TRANSPORT_PROPERTY, connectionType);
// Set up the rest of the connection properties, based on the
// connection type requested
switch (connectionType)
{
case MQC.TRANSPORT_MQSERIES_BINDINGS:
break;
case MQC.TRANSPORT_MQSERIES_CLIENT:
connectionProperties.Add(MQC.HOST_NAME_PROPERTY, hostName);
connectionProperties.Add(MQC.CHANNEL_PROPERTY, channel);
connectionProperties.Add(MQC.USER_ID_PROPERTY, "websphere");
connectionProperties.Add(MQC.PASSWORD_PROPERTY, "websphere");
break;
}
return connectionProperties;
}
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static int Main(string[] args)
{
try
{
Hashtable connectionProperties = init(connectionType);
// Create a connection to the queue manager using the connection
// properties just defined
MQQueueManager qMgr = new MQQueueManager(qManager, connectionProperties);
// Set up the options on the queue we wish to open
int openOptions = MQC.MQOO_INPUT_AS_Q_DEF | MQC.MQOO_OUTPUT;
// Now specify the queue that we wish to open,and the open options
MQQueue system_default_local_queue =
qMgr.AccessQueue("clq_default_vm_sql2000", openOptions);
// Define a WebSphere MQ message, writing some text in UTF format
MQMessage hello_world = new MQMessage();
hello_world.WriteUTF("Hello World!");
// Specify the message options
MQPutMessageOptions pmo = new MQPutMessageOptions();
// accept the defaults,
// same as MQPMO_DEFAULT
// Put the message on the queue
system_default_local_queue.Put(hello_world, pmo);
// Get the message back again
// First define a WebSphere MQ message buffer to receive the message
MQMessage retrievedMessage = new MQMessage();
retrievedMessage.MessageId = hello_world.MessageId;
// Set the get message options
MQGetMessageOptions gmo = new MQGetMessageOptions(); //accept the defaults
//same as MQGMO_DEFAULT
// Get the message off the queue
system_default_local_queue.Get(retrievedMessage, gmo);
// Prove we have the message by displaying the UTF message text
String msgText = retrievedMessage.ReadUTF();
Console.WriteLine("The message is: {0}", msgText);
// Close the queue
system_default_local_queue.Close();
// Disconnect from the queue manager
qMgr.Disconnect();
}
//If an error has occurred in the above,try to identify what went wrong.
//Was it a WebSphere MQ error?
catch (MQException ex)
{
Console.WriteLine("A WebSphere MQ error occurred: {0}", ex.ToString());
}
catch (System.Exception ex)
{
Console.WriteLine("A System error occurred: {0}", ex.ToString());
}
Console.ReadLine();
return 0;
}//end of start
}//end of sample
答案 0 :(得分:2)
使用Windows到Windows的连接,WMQ将传递SID以及“短ID”,在这种情况下,它将是“websphere”。这比使用仅使用短ID的非Windows WMQ获得的授权要好一些。问题是,非Windows服务器上的某个人可以使用短ID“websphere”进行连接,因为没有SID WMQ会接受该连接,因为它 是Windows帐户。
解决这个问题的两种方法。在QMgr主机上,您可以运行setmqaut命令来授权您实际用于连接的SID。 VM 必须能够查询Windows帐户所在的域,并且setmqaut命令必须使用-p user @ domain syntax。
或者,您可以在频道的MCAUSER中使用本地定义的ID,如
ALTER CHL(频道名称)CHLTYPE(SVRCONN)MCAUSER('webaphere @ vm')
...其中'vm'是虚拟机的名称,您已使用setmqaut命令或通过将其放入mqm或管理员组来授权该帐户。
请注意,这只是 进行测试!具有空白或管理MCAUSER的任何通道不仅可以管理WMQ,还可以在底层主机服务器上执行任意命令。在现实世界中,您将创建可访问队列和QMgr但无法访问管理的帐户,并将这些帐户放入所有MCAUSER值,然后为所有SYSTEM.DEF和SYSTEM.AUTO通道设置MCAUSER('nobody')
在我的网站t-rob.net的MQ和链接页面上有更多内容。另外,请查看:
评论专栏:T.Rob Wyatt:What you didn't know you didn’t know about WebSphere MQ security
评论专栏:T.Rob Wyatt:WebSphere MQ security heats up
答案 1 :(得分:-1)
我曾经遇到过同样的问题。解决方案,我们需要将用户窗口帐户分配给MQA组或管理员组。然后,将窗口帐户的用户名添加到频道中的MCA用户。
希望这有帮助