CServiceModule::Run

Après avoir été appelé, Exécutez d'abord stocke les ID de thread. du service Le service utilise cet ID pour se fermer lui-même en envoyant un message WM_QUIT à l'aide de la fonction API Win32, PostThreadMessage.

Exécutez puis appelle la fonction API Win32, CoInitializeEx. Par défaut, Exécutez passe le drapeau COINIT_MULTITHREADED à la fonction. Cet indicateur indique que le programme doit être un serveur libre de threads.

Maintenant, vous pouvez spécifier la sécurité à l'aide de CSecurityDescriptor. Cette classe simplifie considérablement la tâche de mettre en place et faire les changements à la liste de contrôle d'accès discrétionnaire (DACL) — une liste des entrées de contrôle d'accès (ACE), où chaque ACE définit l'accès à un objet Win32.

Par défaut, l'ATL COM AppWizard génère un appel à la fonction membre InitializeFromThreadToken de CSecurityDescriptor. Ceci initialise le descripteur de sécurité de l'objet d'une liste DACL nulle, ce qui signifie que n'importe quel utilisateur peut accéder à votre objet.

La façon la plus simple pour modifier l'accès utilisateur est avec les fonctions de membres de permettre de CSecurityDescriptoret Deny . Ces fonctions ajouter un ACE à la liste DACL existante. Toutefois, refuser a toujours priorité puisque Deny ajoute l'ACE pour le début de la liste DACL, tandis que Allow ajoute à la fin. Fois Allow et Deny passent le nom d'utilisateur comme premier paramètre et les droits d'accès (en règle générale, COM_RIGHTS_EXECUTE) comme la seconde.

Rappelons que la liste DACL nulle, créée par InitializeFromThreadToken accorde à tous les utilisateurs l'accès à l'objet COM. Cependant, dès que vous appelez permettre d'ajouter un ACE, seulement que spécifié utilisateur aura accès. Le code suivant illustre un appel à autoriser:

CSecurityDescriptor sd ;
SD.InitializeFromThreadToken () ;

Si (bAllowOneUser)
{
 nbsp ; SD.Le permet (« MYDOMAI&N\\myuser », COM_RIGHTS_EXECUTE) ;
}
CoInitializeSecurity (sd -1, NULL, NULL,
                     RPC_C_AUTHN_LEVEL_PKT,
                     RPC_C_IMP_LEVEL_IMPERSONATE,
                     NULL, EOAC_NONE, NULL)

Si la variable, bAllowOneUser , est vraie, alors un seul l'utilisateur a accès étant seulement de cet utilisateur ACE dans la liste DACL. Si bAllowOneUser est fausse, alors tous les utilisateurs ont accès, parce que la liste DACL est nulle.

Si vous ne souhaitez pas le service pour spécifier sa propre sécurité, supprimez l'appel à la fonction API Win32, CoInitializeSecurityet la volonté de COM alors déterminer les paramètres de sécurité du Registre. Un moyen pratique pour configurer les paramètres du Registre est avec l'utilitaire DCOMCNFG discuté plus loin dans cet article.

Une fois que la sécurité est spécifiée, l'objet est inscrit avec COM, afin que les nouveaux clients peuvent se connecter au programme. Enfin, le programme indique le MEC qu'il est en cours d'exécution et le programme entame une boucle de message. Le programme reste courant jusqu'à ce qu'il publie un message d'abandon après l'arrêt du service.

Pour plus d'informations sur la sécurité de Windows NT, consultez l'article MSDN, « Sécurité de Windows NT en théorie et en pratique ».

Index