Contenido • Introducción • Consolas Administrativas en BTS2006 y MMC • Extensiones para BTSMMC.msc • Extensiones para ENTSSO.msc • Recursos • Conclusión Introducción Al utilizar la consola administrativa en BizTalk Server 2004 (BTS2004) es común encontrar esta pregunta ¿no tiene más funcionalidad, no puedo agregar más funciones?, la respuesta es NO. La Consola Administrativa en BTS2004 expone pocas opciones de administración a los procesos de BizTalk Server (BTS), además de no permite extender su funcionalidad. Por su parte, BizTalk Server 2006 (BTS2006) provee nuevas consolas administrativas que ofrecen más opciones de administración que sus antecesoras en BTS2004, las cuales pueden ser extendidas para agregar nueva funcionalidad. Este artículo explicará los requisitos para extender estas consolas. Consolas Administrativas en BTS2006 y MMC En BTS2006 las consolas de administración para BTS y el manejo de identidades en Enterprise Single Sign-On (ENTSSO) ofrecen una mejor alternativa de configuración y manejo. La consola para BTS permite monitorizar, configurar y manipular los estados de los elementos del negocio y la consola para ENTSSO permite configurar y manipular las opciones de SSO relacionadas con el servidor. Otro aspecto importante para las nuevas consolas es el soporte a MMC. MMC es una interfaz de usuario del tipo Multiple Document Interface (MDI) (ver Figura1) que permite la integración de varias herramientas de administración en un solo ambiente, dichas herramientas son llamadas Snap-in. Los Snap-in ejecutan un conjunto de tareas especificas y se cargan siempre en una interfaz MMC, de igual forma, un conjunto de Snap-in puede ser guardado como un archivo .MSC el cual se considera una Consola Administrativa, estos se representan como nodos ubicados al lado izquierdo de la Consola Administrativa. En BTS2006 la Consola Administrativa de BTS se llama “BTSMMS.msc” y la Consola Administrativa de ENTSSO “ENTSSO.msc”. ![]() Otra característica importante de los Snap-in, es que permiten extender la funcionalidad inicial de la Consola Administrativa (por medio del SDK) adicionando nuevos Snap-in a la misma. Estos nuevos Snap-in se denominan “Extensions Snap-in”, los cuales son componentes que extienden la funcionalidad de otro Snap-in “Primary Snap-in”. Un “Extension Snap-in” debe cumplir los siguientes requisitos:
Este artículo explica cómo cumplir los requisitos de un “Extension Snap-in” para agregar funcionalidad a las consolas administrativas de BTS2006, sin embargo, no pretende explicar el desarrollo de un “Snap-in” o un “Extension Snap-in” en términos generales. Más información puede encontrarse en MMC Programmer’s Guide con el SDK para MMC 2.0 y How-To Develop Snap-ins Using MMC con el SDK para MMC 3.0. Extensiones para BTSMMC.msc El primer requisito para crear un “Extension Snap-in” para la Consola Administrativa BTSMMC.msc es utilizar el SDK de MMC 2.0 (BTSMMC.msc no soporta el SDK de MMC 3.0), el cual define una serie de interfaces COM que deben implementar todos los objetos que pretendan estar expuestos y reconocidos en MMC. Los ejemplos de esta sección están en C++. A continuación trataremos las tres restricciones al desarrollar un “Extension Snap-in” con MMC 2.0. Primera restricción: Interfaces MMC Todo Snap-in para comunicarse con la consola MMC debe implementar todos los métodos de la interfaz IComponentData, la cual define los siguientes métodos: Initialize, CreateComponent, Notify, Destroy, QueryDataObject, GetDisplayInfo y CompareObjects.
#include <mmc.h>
class CCustomSnapin : public IComponentData
{
public:
///////////////////////////////
// Interface IComponentData
///////////////////////////////
virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Initialize(
/* [in] */ LPUNKNOWN pUnknown);
virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE CreateComponent(
/* [out] */ LPCOMPONENT __RPC_FAR *ppComponent);
virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Notify(
/* [in] */ LPDATAOBJECT lpDataObject,
/* [in] */ MMC_NOTIFY_TYPE event,
/* [in] */ LPARAM arg,
/* [in] */ LPARAM param);
virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE Destroy( void);
virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE QueryDataObject(
/* [in] */ MMC_COOKIE cookie,
/* [in] */ DATA_OBJECT_TYPES type,
/* [out] */ LPDATAOBJECT __RPC_FAR *ppDataObject);
virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE GetDisplayInfo(
/* [out][in] */ SCOPEDATAITEM __RPC_FAR *pScopeDataItem);
virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE CompareObjects(
/* [in] */ LPDATAOBJECT lpDataObjectA,
/* [in] */ LPDATAOBJECT lpDataObjectB);
...
}
A continuación se explican cada uno de estos metodos:
Existen otras interfaces en el SDK como IExtendContextMenu, IExtendControlbar, IExtendTaskPad y ISnapinAbout que pueden ser utilizadas de acuerdo a las necesidades de funcionalidad del nuevo “Extension Snap-in” frente al “Primary Snap-in”. Estas necesidades se dividen en 6 grupos llamados “Extension Types”: NameSpace, ContextMenu, ToolBar, PropertySheet, Task y View. Para más información visitar MMC-Related COM Interfaces. Segunda restricción: registro en el Windows Registry El primer registro del Snap-in debe ser en la llave HKEY_CLASSES_ROOT\CLSID\{CLSID}, donde {CLSID} es el identificador del componente y debe estar marcada como una librería in-process server; así mismo, la librería deberá registrar el modelo de hilos a utilizar. Ver código a continuación:
HRESULT RegisterServer(HMODULE hModule, // DLL module handle
const CLSID& clsid, // Class ID
const _TCHAR* szFriendlyName) // IDs
{
// Get server location.
_TCHAR szModule[512] ;
DWORD dwResult =
::GetModuleFileName(hModule, szModule, sizeof(szModule)/sizeof(_TCHAR)) ;
assert(dwResult != 0) ;
// Get CLSID
LPOLESTR wszCLSID = NULL ;
HRESULT hr = StringFromCLSID(clsid, &wszCLSID) ;
assert(SUCCEEDED(hr)) ;
MAKE_TSTRPTR_FROMWIDE(pszCLSID, wszCLSID);
// Build the key CLSID\\{...}
_TCHAR szKey[64] ;
_tcscpy_s(szKey, _T("CLSID\\")) ;
_tcscat_s(szKey, pszCLSID) ;
// Add the CLSID to the registry.
setKeyAndValue(szKey, NULL, szFriendlyName) ;
// Add the server filename subkey under the CLSID key.
setKeyAndValue(szKey, _T("InprocServer32"), szModule) ;
// set the threading model
_tcscat_s(szKey, _T("\\InprocServer32"));
setValue(szKey, _T("ThreadingModel"), _T("Apartment"));
// Free memory.
CoTaskMemFree(wszCLSID) ;
return S_OK ;
}
Todos los nuevos Snap-in (extensiones o simples) deberán registrarse en la clave HKEY_LOCAL_MACHINE\Software\Microsoft\MMC\SnapIns\{snapinCLSID}, donde {snapinCLSID} es el identificador que representa el Snap-in. Por último se debe generar un registro en la clave que define las extensiones del “Primary Snap-in” extendido en la clave HKEY_LOCAL_MACHINE\Software\Microsoft\MMC\SnapIns\{primaryCLSID}\NodeTypes\Extensions\{ExtensionType}\{ snapinCLSID } donde {primaryCLSID} identifica al “Primary Snap-in”, {snapinCLSID} identifica al “Extension Snap-in” y {ExtensionType} es el tipo de extensión al cual pertenece el “Exntesion Snap-in”.
HRESULT RegisterSnapin(const CLSID& clsid, // Class ID
const _TCHAR* szNameString, // NameString
const CLSID& clsidAbout, // Class Id for About Class
const BOOL fSupportExtensions)
{
// Get CLSID
LPOLESTR wszCLSID = NULL ;
LPOLESTR wszAboutCLSID = NULL;
LPOLESTR wszExtendCLSID = NULL;
LPOLESTR wszNodeCLSID = NULL;
EXTENDER_NODE *pNodeExtension;
_TCHAR szKeyBuf[1024] ;
HKEY hKey;
HRESULT hr = StringFromCLSID(clsid, &wszCLSID) ;
if (IID_NULL != clsidAbout)
hr = StringFromCLSID(clsidAbout, &wszAboutCLSID);
MAKE_TSTRPTR_FROMWIDE(pszCLSID, wszCLSID);
MAKE_TSTRPTR_FROMWIDE(pszAboutCLSID, wszAboutCLSID);
// Add the CLSID to the registry.
setSnapInKeyAndValue(pszCLSID, NULL, _T("NameString"), szNameString) ;
if (IID_NULL != clsidAbout)
setSnapInKeyAndValue(pszCLSID, NULL, _T("About"), pszAboutCLSID);
if (fSupportExtensions) {
// Build the key NodeType
setSnapInKeyAndValue(pszCLSID, _T("NodeTypes"), NULL, NULL);
_TCHAR szKey[64] ;
_tcscpy_s(szKey, pszCLSID) ;
_tcscat_s(szKey, _T("\\NodeTypes")) ;
setSnapInKeyAndValue(szKey, pszCLSID, NULL, NULL);
}
// register each of the node extensions
for (pNodeExtension = &(_NodeExtensions[0]);*pNodeExtension->szDescription;pNodeExtension++)
{
hr = StringFromCLSID(pNodeExtension->guidNode, &wszExtendCLSID);
MAKE_TSTRPTR_FROMWIDE(pszExtendCLSID, wszExtendCLSID);
_tcscpy_s(szKeyBuf, _T("SOFTWARE\\Microsoft\\MMC\\NodeTypes\\"));
_tcscat_s(szKeyBuf, pszExtendCLSID);
switch (pNodeExtension->eType) {
case NameSpaceExtension:
_tcscat_s(szKeyBuf, _T("\\Extensions\\NameSpace"));
break;
case ContextMenuExtension:
_tcscat_s(szKeyBuf, _T("\\Extensions\\ContextMenu"));
break;
case ToolBarExtension:
_tcscat_s(szKeyBuf, _T("\\Extensions\\ToolBar"));
break;
case PropertySheetExtension:
_tcscat_s(szKeyBuf, _T("\\Extensions\\PropertySheet"));
break;
case TaskExtension:
_tcscat_s(szKeyBuf, _T("\\Extensions\\Task"));
break;
case ViewExtension:
_tcscat_s(szKeyBuf, _T("\\Extensions\\View"));
break;
default:
break;
}
// Create and open key and subkey.
long lResult = RegCreateKeyEx(HKEY_LOCAL_MACHINE ,
szKeyBuf,
0, NULL, REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS, NULL,
&hKey, NULL) ;
if (lResult != ERROR_SUCCESS)
{
return FALSE ;
}
hr = StringFromCLSID(pNodeExtension->guidExtension, &wszNodeCLSID);
assert(SUCCEEDED(hr));
MAKE_TSTRPTR_FROMWIDE(pszNodeCLSID, wszNodeCLSID);
// Set the Value.
if (pNodeExtension->szDescription != NULL)
{
RegSetValueEx(hKey, pszNodeCLSID, 0, REG_SZ,
(BYTE *)pNodeExtension->szDescription,
(_tcslen(pNodeExtension->szDescription)+1)*sizeof(_TCHAR)) ;
}
RegCloseKey(hKey) ;
CoTaskMemFree(wszExtendCLSID);
CoTaskMemFree(wszNodeCLSID);
}
// Free memory.
CoTaskMemFree(wszCLSID) ;
if (IID_NULL != clsidAbout)
CoTaskMemFree(wszAboutCLSID);
return S_OK ;
}
Los {primaryCLSID} disponibles para extender la Consola Administrativa de BTS son:
(Tabla de {primaryCLSID} BTS) Una vez realizados estos registros, el nuevo “Extension Snap-in” podrá ser visualizado en la consola MMC. Tercera restricción: clipboard formats La Consola Administrativa de BTS usa clipboard format especiales que deben ser declarados y manejados por nuevos “Extension Snap-in”.
Estos “clipboard formats” deben ser registrados usando la función RegisterClipboardFormat de Win32 tal como se muestra a continuación: #define _T_CCF_NODETYPE _T("CCF_NODETYPE")
#define _T_CCF_SERVER_NAME _T("{410C1FBB-6611-4692-8C1B-AEBA2FE22A40}")
UINT CCustomSnapin::s_cfNodeType = RegisterClipboardFormat(_T_CCF_NODETYPE);
UINT CCustomSnapin::s_cfServerName = RegisterClipboardFormat(_T_CCF_SERVER_NAME);
Una vez registrados, su valor puede ser extraído usando el siguiente código: HRESULT CCustomSnapin::ExtractObjectTypeGUID( IDataObject* piDataObject, GUID* pguidObjectType )
{
return ExtractData( piDataObject, s_cfNodeType, (PBYTE)pguidObjectType, sizeof(GUID) );
}
HRESULT CCustomSnapin::ExtractData( IDataObject* piDataObject, //
CLIPFORMAT cfClipFormat, // clipboard format name
BYTE* pbData, //
DWORD cbData ) //
{
HRESULT hr = S_OK;
FORMATETC formatetc = {cfClipFormat, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
STGMEDIUM stgmedium = {TYMED_HGLOBAL, NULL};
stgmedium.hGlobal = ::GlobalAlloc(GPTR, cbData);
do // false loop
{
if (NULL == stgmedium.hGlobal)
{
hr = E_OUTOFMEMORY;
break;
}
hr = piDataObject->GetDataHere( &formatetc, &stgmedium );
if ( FAILED(hr) )
{
break;
}
BYTE* pbNewData = reinterpret_cast<BYTE*>(stgmedium.hGlobal);
if (NULL == pbNewData)
{
hr = E_UNEXPECTED;
break;
}
::memcpy( pbData, pbNewData, cbData );
} while (FALSE); // false loop
if (NULL != stgmedium.hGlobal)
{
::GlobalFree(stgmedium.hGlobal);
}
return hr;
}
Extensiones para ENTSSO.msc La Consola Administrativa para ENTSSO (ENTSSO.msc) soporta nuevos “Extension Snap-in” desarrollados con el SDK de MMC 3.0. Este SDK está escrito en .Net 2.0, y simplifica la construcción de “Extension Snap-in” debido al modelo de código manejado. Primera restricción: Interfaces MMC El SDK de MMC 3.0 provee dos clases que permiten extender un “Primary Snap-in”, estas son NamespaceExtension y PropertySheetExtension. La clase NamespaceExtension es utilizada para crear nuevos nodos y compartir información con el “Primary Snap-in”, mientras que la clase PropertySheetExtension puede adicionar nuevas ventadas con propiedades o nuevos nodos de resultados relacionados con el “Primary Snap-in”. [SnapInSettings("{8cfb61db-1e85-4d96-ac13-7011a2085aad}", // snapin CLSID
DisplayName = "ENTSSOSnapInSample",
Description = "Simple ENTSSO SnapIn")]
public class ExtendedSnapIn : NamespaceExtension
{
}
Segunda restricción: registro en el Windows Registry A diferencia del MMC 2.0, registrar un “Extension Snap-in” es más fácil ya que la utilidad de línea de comando InstallUtil.exe generará las claves en el Windows Registry automáticamente. Para esto es necesario declarar una clase que derive de SnapInInstaller y soporte el atribute RunInstallerAttribute en la misma librería del “Extension Snap-in”. [RunInstaller(true)]
public class InstallUtilSupport : SnapInInstaller
{
}
La utilidad se ejecuta de forma sencilla por medio de la línea de comando. C:\Windows\Microsoft.Net\Framework\v2.0.50727>InstallUtil.exe ENTSSOSimpleSnapin.dll Para que esta utilidad funcione correctamente se deben declarar los identificadores que representan el “Extension Snap-in” y el “Primary Snap-in”. Para esto se deben implementar las clases SnapInSettingsAttribute y ExtendsNodeTypeAttribute a la clase que establece el “Extension Snap-in”, estas clases establecerán los identificadores para el “Extension Snap-in” y el “Primary Snap-in” respectivamente.
[ExtendsNodeType("{5D1D43A2-4F97-42BE-815C-85AD543D5A39}")] // primary CLSID
[SnapInSettings("{8cfb61db-1e85-4d96-ac13-7011a2085aad}", // snapin CLSID
DisplayName = "ENTSSOSnapInSample",
Description = "Simple ENTSSO SnapIn")]
public class ExtendedSnapIn : NamespaceExtension
{
}
Los identificadores de “Primary Snap-in” disponible para extender la Consola Administrativa de ENTSSO son:
(Tabla {primaryCLSID} ENTSSO) Una vez ejecutada la utilidad, el nuevo “Extension Snap-in” podrá ser visualizado en la consola MMC. Tercera restricción: clipboard formats La Consola Administrativa de ENTSSO no expone información pública que un “Extesion Snap-in” deba soportar por medio de los “clipboard formats”. Recursos BizTalk 2004 Management Tool: herramienta administrativa con más opciones que la tradicional consola administrativa de BizTalk Server 2004. BizTalk Explorer: otra herramienta administrativa con más opciones que la tradicional consola administrativa de BizTalk Server 2004. MMC 2.0 Samples: ejemplos en VC++ con implementaciones de Snap-in usando el SDK de MMC 2.0. MMC 3.0 Samples: ejemplos en VC# de programación de nuevos Snap-in usando el SDK de MMC 3.0. MMC .Net Library: esta es una librería de .Net que soporta el desarrollo de Snap-in en MMC 2.0. Extending the BizTalk Server Administration Console: ejemplo de BTS2006 que extiende la funcionalidad de la Consola Administrativa usando VC++ y el SDK de MMC 2.0. Conclusión En BizTalk Server 2006 se puede extender la funcionalidad actual de las consolas administrativas utilizando el SDK de MMC 2.0 y MMC 3.0, logrando enriquecer de esta forma la administración, monitoreo y manejo de identidades (entre otras características) por parte de los administradores y desarrolladores. |