2009-11-19 5 views
2

J'ai le côté serveur de WebSphere MQ version 6 d'IBM sur une machine virtuelle exécutant Windows Server 2003, installée sur un bureau Vista. Le bureau a le client installé.Autorisation avec Websphere MQ 6

J'ai un petit programme de test (à partir de leurs exemples de code) qui met un message dans une file d'attente et l'enlève à nouveau. Ce programme fonctionnait lorsqu'il était exécuté directement sur le serveur avec la liaison au serveur. Cependant, je ne peux pas le faire fonctionner du côté client avec la liaison client. L'erreur que j'obtiens est CompCode 2, Reason 2035, qui est un échec d'autorisation.

Je suppose que cela est dû au fait que le programme fonctionne par défaut sous mon utilisateur, qui se trouve sur un domaine que la machine virtuelle ne connaît pas (et ne peut pas accéder).

J'ai configuré un utilisateur local sur la vm que je souhaite connecter (utilisateur: websphere, mot de passe: websphere), mais je ne sais pas comment faire fonctionner tout cela. J'ai le code que j'utilise ci-dessous, et j'ai essayé diverses combinaisons de paramètres de sortie de sécurité sur le canal et les points de terminaison, mais je ne peux pas échapper à 2035.

Quelqu'un at-il une expérience avec cela? L'aide serait très appréciée!

code:

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 

Répondre

2

Avec des connexions Windows à Windows, WMQ passera le SID, ainsi que le "court ID" qui dans ce cas serait "websphere". C'est une autorisation un peu meilleure que celle obtenue avec un WMQ non-Windows qui n'utilise que l'ID court. Le problème est que quelqu'un sur un serveur non-Windows peut se connecter en utilisant l'ID court "websphere" et puisqu'il n'y a pas de SID WMQ acceptera la connexion comme pensé étaient le compte Windows.

Deux façons de résoudre ce problème. Sur l'hôte QMgr, vous pouvez exécuter des commandes setmqaut pour autoriser le SID que vous utilisez réellement pour vous connecter. La machine virtuelle doit pouvoir se renseigner sur le domaine dans lequel le compte Windows réside et la commande setmqaut doit utiliser la syntaxe -p user @ domain.

Alternativement, vous pouvez simplement utiliser l'ID défini localement dans la MCAUSER du canal comme

CHL ALTER (nom du canal) CHLTYPE (SVRCONN) MCAUSER ('webaphere @ vm')

... où 'vm' est le nom de la machine virtuelle et vous avez autorisé le compte avec les commandes setmqaut ou en le mettant dans le groupe mqm ou les administrateurs. N'oubliez pas que c'est seulement pour tester! Tout canal avec un MCAUSER vierge ou administratif peut non seulement administrer WMQ mais également exécuter des commandes arbitraires sur le serveur hôte sous-jacent. Dans le monde réel, vous créez des comptes avec l'accès aux files d'attente et le QMgr mais pas l'accès à administrer et vous les placez dans toutes les valeurs MCAUSER, puis définissez MCAUSER ('nobody') pour tous les canaux SYSTEM.DEF et SYSTEM.AUTO .

Beaucoup plus sur ce disponible sur mon site Web t-rob.net dans les pages MQ et liens. De plus, consultez:

lignes de commentaires: T.Rob Wyatt: What you didn't know you didn’t know about WebSphere MQ security

lignes de commentaires: T.Rob Wyatt: WebSphere MQ security heats up

-1

J'avais l'habitude d'avoir le même problème. la solution, nous devons affecter un compte de fenêtre utilisateur au groupe MQA ou au groupe administrateur. Ensuite, ajoutez le nom d'utilisateur du compte de fenêtre à l'utilisateur MCA dans le canal.

Hope this helps

+1

Cela va de personne étant autorisé à tout le monde d'avoir accès admin et la possibilité d'exécuter du code à distance sur le serveur MQ. –

Questions connexes