Communication avec d'autres applications
Introduction
Dans un système d’information, on dispose d’un nombre impressionnant d’applications. Avec le temps, les communications entre ces différentes applications se sont améliorées et simplifiées. Ces communications sont établies à travers des interfaces de programmation applicative aussi appelées API (Application Programming Interface).
L’API d’un logiciel offre la possibilité à d’autres applications de consommer ses services et d’interagir avec elle. Une API doit définir un certain nombre de normes et de documentations pour faciliter son utilisation.
On trouve toute sorte de types d’API avec différents standards. La technologie COM (Component Object Model) mise au point par Microsoft fait partie de ces standards. ADSI (Active Directory Service Interfaces), décrite dans le chapitre Manipulation d’annuaires, est une API basée sur COM, de même que WMI (Windows Management Instrumentation).
Les technologies COM
Historiquement, COM fut introduit dans la seconde version de la technologie OLE (Object Linking and Embedding) en 1993. Le principal atout de COM est la facilité qu’il permet dans la communication de différentes applications. Cette facilité de mise en œuvre est due à la notion d’interface objet introduite par COM. L’interface expose des objets contenant des données de l’application et des méthodes pour agir sur l’application elle-même.
Malgré son âge, et l’arrivée du framework .NET en 2009, COM reste une technologie encore très utilisée.
Manipulation des objets COM
Utiliser des objets COM est assez simple sous PowerShell. Il faut simplement savoir si l’application est bien présente, et où la rechercher. Heureusement, la base de registre dispose de cette information sous le chemin Hkey_Classes_Root\CLSID. Les objets COM sont identifiés de manière unique sous cette arborescence à l’aide des CLSID, codés en hexadécimal. Au premier abord, ceux-ci sont peu exploitables facilement. Mais en réalité, les identifiants disposent pour la plupart d’une entrée nommée ProgID. Il s’agit d’une chaîne de caractères représentant l’objet COM et formatée de la manière suivante : <Programme>.<composant>.<numéro de version>.
1. Recherche d’objets
Rechercher l’application dont on a besoin directement dans l’éditeur de registre n’est bien sûr pas la méthode la plus rentable. C’est comme rechercher une aiguille dans une botte de foin. Pour s’épargner cela, on peut opter pour une simple requête PowerShell.
Exemple
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 sortie est conséquente et il peut être judicieux d’utiliser un filtre pour faire apparaître seulement les éléments qui nous intéressent.
Exemple avec Excel
PS > (gci $RegistryPath).foreach{$_.GetValue('')} |
Where-Object...