Comunicación con otras aplicaciones

Introducción

En un sistema de información disponemos de una gran cantidad de aplicaciones. Con el tiempo, las comunicaciones entre estas distintas aplicaciones se han ido mejorando y simplificando. Estas comunicaciones se establecen a través de interfaces de programación de aplicaciones, también conocidas como API (Application Programming Interface). 

La API de un programa permite a otras aplicaciones utilizar sus servicios e interactuar con ella. Una API debe definir una serie de normas y documentación para facilitar su uso.

Existen todo tipo de API con diferentes estándares. La tecnología COM (Component Object Model) desarrollada por Microsoft es uno de estos estándares. ADSI (Active Directory Service Interfaces), descrita en el capítulo Manipulación de directorios, es una API basada en COM, al igual que WMI (Windows Management Instrumentation).

Las tecnologías COM

Históricamente, COM se introdujo en la segunda versión de la tecnología OLE (Object Linking and Embedding) en 1993. La principal ventaja de COM es la facilidad con que pueden comunicarse distintas aplicaciones. Esta facilidad de implementación se debe a la noción de interfaz de objetos introducida por COM. La interfaz expone objetos que contienen datos de la aplicación y métodos para actuar sobre la propia aplicación.

A pesar de su antigüedad, y de la llegada del framework .NET en 2009, COM sigue siendo una tecnología muy utilizada.

Manipulación de objetos COM

El uso de objetos COM es bastante sencillo en PowerShell. Es necesario simplemente saber si la aplicación está presente y dónde buscarla. Afortunadamente, esta información está disponible en el registro bajo la ruta Hkey_Classes_Root\CLSID. Los objetos COM se identifican unívocamente en este árbol mediante CLSIDs, codificados en hexadecimal. A primera vista, no son fáciles de usar. Pero en realidad, la mayoría de los identificadores tienen una entrada llamada ProgID. Se trata de una cadena de texto que representa al objeto COM y que tiene el siguiente formato: <Programa>.<componente>.<número de versión>.

1. Búsqueda de objetos

Buscar la aplicación que necesitas directamente en el editor del registro no es, por supuesto, el método más rentable. Es como buscar una aguja en un pajar. Para evitarlo, puedes optar por una simple petición PowerShell.

Ejemplo

PS > $RegistryPath =   
'REGISTRY::HKEY_Classes_Root\Wow6432Node\clsid\*\progid'   
PS > (gci $RegistryPath).foreach{$_.GetValue('')}   
DAO.DBEngine.36   
DAO.PrivateDBEngine.36   
DAO.TableDef.36   
DAO.Field.36   
DAO.Index.36   
DAO.Group.36   
DAO.User.36   
DAO.QueryDef.36   
DAO.Relation.36   
file   
StaticMetafile   
StaticDib   
clsid   
objref   
ADODB.Command.6.0   
ADODB.Parameter.6.0   
ADODB.Connection.6.0   
ADODB.Recordset.6.0   
ADODB.Error.6.0   
ADODB.ErrorLookup.6.0   
ADODB.Record.6.0   
ADODB.Stream.6.0   
ADOX.Catalog.6.0   
ADOX.Table.6.0   
ADOX.Group.6.0   
ADOX.User.6.0   
ADOX.Column.6.0   
ADOX.Index.6.0   
ADOX.Key.6.0   
MSGraph.Chart.8   
Excel.Sheet.5   
Excel.Chart.5   
Excel.Sheet.8   
Excel.Chart.8   
... 

La salida es considerable y puede ser una buena idea utilizar un filtro para mostrar solo los elementos que nos interesan.

Ejemplo con Excel

PS > (gci $RegistryPath).foreach{$_.GetValue('')} |   
               Where-Object...