Installation en tant qu’application de service
En plus de s’exécuter en tant qu’exécutable de serveur local (EXE), un objet COM peut également s’empaqueter lui-même pour s’exécuter en tant qu’application de service lorsqu’il est activé par un client local ou distant. Les services prennent en charge de nombreuses fonctionnalités d’administration utiles et d’interface utilisateur intégrées, notamment le démarrage local et distant, l’arrêt, la suspension et le redémarrage, ainsi que la possibilité d’établir que le serveur s’exécute sous un compte d’utilisateur et une station de fenêtre spécifiques.
Un objet écrit en tant que service est installé pour une utilisation par COM en établissant une valeur LocalService sous sa clé AppID et en effectuant une installation de service standard.
Les classes peuvent également être configurées pour s’exécuter sous un compte d’utilisateur spécifique lorsqu’elles sont activées par un client distant sans être écrites en tant qu’application de service. Pour ce faire, la classe installe un nom d’utilisateur et un mot de passe à utiliser lorsque le SCM lance son processus de serveur local.
Lorsqu’une classe est configurée de cette façon, les appels à CoRegisterClassObject avec ce CLSID échouent, sauf si le processus a été lancé par COM pour le compte d’une demande d’activation réelle. En d’autres termes, les classes configurées pour s’exécuter en tant qu’utilisateur particulier ne peuvent pas être inscrites sous une autre identité.
Le nom d’utilisateur est tiré de la valeur nommée RunAs sous la clé APPID de la classe. Si le nom d’utilisateur est « Utilisateur interactif », le code de classe est exécuté dans le contexte de sécurité de l’utilisateur actuellement connecté et est connecté à la station de fenêtre interactive.
Sinon, le mot de passe est récupéré à partir d’une partie masquée du Registre disponible uniquement pour les administrateurs de l’ordinateur et pour le système. Le nom d’utilisateur et le mot de passe sont ensuite utilisés pour créer une session d’ouverture de session dans laquelle le code de classe est exécuté. Lorsqu’il est lancé de cette façon, le code de classe s’exécute avec son propre bureau et sa propre station de fenêtre et ne partage pas de handles de fenêtre, le Presse-papiers ou d’autres éléments d’interface utilisateur avec l’utilisateur interactif ou d’autres classes exécutées dans d’autres comptes d’utilisateur.
Un serveur inscrit auprès de LocalService ou d’RunAs peut inscrire un objet dans la table d’objets en cours d’exécution pour permettre à n’importe quel client de s’y connecter. Pour ce faire, l’appel du serveur à IRunningObjectTable::Register doit définir l’indicateur ROTFLAGS_ALLOWANYCLIENT. Un serveur définissant ce bit doit avoir son nom exécutable dans la section AppID du Registre qui fait référence à l’AppID pour l’exécutable. Un serveur « activer en tant qu’activateur » (non inscrit comme LocalService ou RunAs) ne peut pas inscrire un objet avec cet indicateur.
Rubriques connexes