2016-09-30 5 views
-2

Comment exécuter un service COM en tant que système et autoriser un client de n'importe quel contexte de sécurité à s'y connecter?Exécution d'un service COM en tant que système

J'ai un .exe qui héberge mon objet de classe en appelant CoRegisterClassObject. Lorsque je lance le fichier .exe en tant qu'administrateur, le même compte Administrateur peut très bien interagir avec ce dernier. Lorsque j'exécute le fichier .exe en tant que système, le compte administrateur échoue lors de l'appel CoCreateInstance avec l'erreur 0x80040154.

MISE À JOUR:

J'ai fait quelques progrès. Dans le service COM, j'inscris ma fabrique de classe dans la table des objets en cours d'exécution avec le drapeau ROTFLAGS_ALLOWANYCLIENT. Dans le client, j'utilise la méthode GetObject de la table des objets en cours d'exécution pour obtenir un pointeur vers la fabrique de classes. Cela me permet d'accéder au service lorsqu'il s'exécute en tant qu'administrateur à partir d'un compte non administrateur. Toutefois, lorsqu'il s'exécute en tant que système, l'appel CoCreateInstance d'un client non-système échoue avec 0x80070005. Je soupçonne que ce problème est lié à celui décrit here.

Répondre

1

j'ai pu le faire travailler en procédant comme suit dans le service COM:

  1. Appel CoInitializeSecurity de manière à permettre à chacun de se connecter:

    hresult = CoInitializeSecurity(
    NULL, 
    -1, 
    NULL, 
    NULL, 
    RPC_C_AUTHN_LEVEL_NONE, 
    RPC_C_IMP_LEVEL_IDENTIFY, 
    NULL, 
    0, 
    NULL); 
    
  2. Enregistrement du classe factory dans la table des objets en cours d'exécution, en spécifiant ROTFLAGS_ALLOWANYCLIENT:

    hresult = pIRunningObjectTable->Register(
        ROTFLAGS_ALLOWANYCLIENT |ROTFLAGS_REGISTRATIONKEEPSALIVE, 
        pClassFactory, 
        pIMoniker, 
        &dwROTRegister); 
    

Et faire ce qui suit dans le client COM:

  1. Accès à l'usine de classe à partir de la table d'objet en cours d'exécution:

    hresult = pIRunningObjectTable->GetObjectW(pIMoniker, &pIUnknown); 
    hresult = pIUnknown->QueryInterface(IID_IClassFactory, (PVOID *)&pIClassFactory); 
    

je dû configurer certains paramètres de Registre pour obtenir fonctionne correctement. Réglage HKCR\AppID\<guid>\LocalServiceempêché il de travailler, donc je ne pas l'ont défini. J'ai mis HKCR\AppID\<guid>\RunAs à NT Authority\System.