2017-06-14 1 views
1

Je joue avec l'API WinHTTP Server 2.0 et je suis en train étapes (https://msdn.microsoft.com/en-us/library/windows/desktop/aa364672(v=vs.85).aspx):Définissez l'ACL spécifiant les processus de travail qui sont autorisés à recevoir des E/S sur la file d'attente de demande

  • Créer la demande la file d'attente et spécifie le nom.
  • Configurez la file d'attente de requêtes à l'aide de la fonction HttpSetRequestQueueProperty.
  • Interrogez les paramètres de configuration de la file d'attente de requêtes à l'aide de la fonction HttpQueryRequestQueueProperty.
  • Créez des groupes d'URL et associez-les à une file d'attente de requêtes.
  • Définissez l'ACL en spécifiant les processus de travail autorisés à recevoir des E/S dans la file d'attente de demandes.
  • Appelez HttpWaitForDemandStart pour retarder l'instanciation des processus de travail jusqu'à ce que la première requête arrive dans la file d'attente des demandes.

pourrait-il aider à l'étape:

Définissez l'ACL spécifiant les processus de travail qui sont autorisés à recevoir des E/S sur la file d'attente de demande

Je ne suis pas sûr de ce que fait cela signifie vraiment (je n'ai jamais utilisé ACL API), mais je suppose que je dois appeler ::GetNamedSecurityInfo() à un moment donné pour le modifier puis:

if (NO_ERROR == ::HttpCreateRequestQueue(HTTPAPI_VERSION_2, 
              requestQueueName, 
              0, 
              HTTP_CREATE_REQUEST_QUEUE_FLAG_CONTROLLER, 
              &m_requestQueue)) 
     // setup queue 
     if (NO_ERROR == ::HttpCreateUrlGroup(m_sessionId, &m_groupId, 0)) 
     { 
     HTTP_BINDING_INFO bindingInfo{ 1, m_requestQueue }; 
     if (NO_ERROR == ::HttpSetUrlGroupProperty(m_groupId, 
                HttpServerBindingProperty, 
                &bindingInfo, 
                sizeof(bindingInfo))) 
     { 
      m_localUrl = (NO_ERROR == (::HttpAddUrlToUrlGroup(m_groupId, localUrl.c_str(), 0, 0))); 
      m_globalUrl = (NO_ERROR == (::HttpAddUrlToUrlGroup(m_groupId, globalUrl.c_str(), 0, 0))); 

      PACL pacl = NULL; 
      PSECURITY_DESCRIPTOR securityDescriptor = NULL; 
      DWORD result = ::GetNamedSecurityInfo(requestQueueName, 
               SE_KERNEL_OBJECT, 
               SACL_SECURITY_INFORMATION, 
               NULL, 
               NULL, 
               NULL, 
               &pacl, 
               &securityDescriptor); 
      // it (result != 0) fails when passing various SE_OBJECT_TYPEs 
     } 
    } 

+0

n'est pas un * ACL * mais un descripteur de sécurité dans 'SECURITY_ATTRIBUTES'. C'est comme quand vous créez un objet du noyau, rien de spécial. vous pouvez et passez 0. pour autoriser l'accès à tout - peut définir 0 DACL est SD. et vous n'avez pas besoin de modifier puis après créer. vous avez juste besoin de définir ce que vous voulez comme SD – RbMm

Répondre

1

Définissez l'ACL spécifiant les processus de travail qui sont autorisés à recevoir des E/S sur la file d'attente de demande

chercher autre une note:

La file d'attente de demande appelée est créé avec la fonction HttpCreateRequestQueue . Lorsque la file d'attente de demandes est créée, l'application spécifie l'ACL dans le paramètre pSecurityAttribute. La liste de contrôle d'accès, qui ne peut être définie que lorsque la file d'attente de demandes est créée, permet aux processus de travail d'ouvrir la file d'attente de demandes, de recevoir des demandes et d'envoyer des réponses. Par par défaut, les processus ne sont pas autorisés à ouvrir une file d'attente de demandes à moins qu'ils aient reçu l'autorisation dans la liste de contrôle d'accès. Les applications ne requièrent pas les privilèges administratifs pour créer la file d'attente des demandes.

si vraiment vous pouvez (mais ne doit pas, cela est facultatif) créer et initialiser un certain descripteur de sécurité et de passer à HttpCreateRequestQueue fonction via In_opt_ PSECURITY_ATTRIBUTES pSecurityAttributes - le SECURITY_ATTRIBUTES utilisé rien ici absolu spécial, dans tout objet du noyau créer api. disons CreateEvent par exemple (ici premier paramètre).

comment initialiser, pour qui d'accès - ce qui est déjà question ouverte - le cas de la frontière - permettre cela pour tous:

ULONG cb = MAX_SID_SIZE; 
    PSID UntrustedLabelSid = (PSID)alloca(MAX_SID_SIZE); 
    if (CreateWellKnownSid(WinUntrustedLabelSid, 0, UntrustedLabelSid, &cb)) 
    { 
     PACL Sacl = (PACL)alloca(cb += sizeof(ACL) + sizeof(ACE_HEADER) + sizeof(ACCESS_MASK)); 
     InitializeAcl(Sacl, cb, ACL_REVISION); 
     if (AddMandatoryAce(Sacl, ACL_REVISION, 0, 0, UntrustedLabelSid)) 
     { 
      SECURITY_DESCRIPTOR sd; 
      InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION); 
      SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE); 
      SetSecurityDescriptorSacl(&sd, TRUE, Sacl, FALSE); 

      SECURITY_ATTRIBUTES sa = { sizeof(sa), &sd, FALSE }; 

      if (NO_ERROR == HttpCreateRequestQueue(HTTPAPI_VERSION_2, 
       requestQueueName, 
       &sa, 
       HTTP_CREATE_REQUEST_QUEUE_FLAG_CONTROLLER, 
       &m_requestQueue)) 
      { 

      } 
     } 
    } 

comme solution de rechange, nous pouvons utiliser et string-format security descriptor puis le convertir avec ConvertStringSecurityDescriptorToSecurityDescriptor par exemple:

SECURITY_ATTRIBUTES sa = { sizeof(sa), 0, FALSE }; 
    ULONG dwError; 
    if (ConvertStringSecurityDescriptorToSecurityDescriptorW(
     L"D:NO_ACCESS_CONTROLS:(ML;;;;;LW)", 
     SDDL_REVISION_1, &sa.lpSecurityDescriptor, 0)) 
    {   
     dwError = HttpCreateRequestQueue(HTTPAPI_VERSION_2, 
      requestQueueName, 
      &sa, 
      HTTP_CREATE_REQUEST_QUEUE_FLAG_CONTROLLER, 
      &m_requestQueue); 

     LocalFree(sa.lpSecurityDescriptor); 
    } 
    else 
    { 
     dwError = GetLastError(); 
    } 

ici "D:NO_ACCESS_CONTROLS:(ML;;;;;LW)" permettre à tous l'accès à tous - NO_ACCESS_CONTROLS et LW - LowLabel. (Non non sécurisé comme dans le premier exemple)

une autre variante (uniquement par exemple) utliser chaîne suivante:

"D:(A;;GA;;;SY)(A;;GA;;;BA)(A;;GRGX;;;BU)(A;;GRGX;;;AC)S:(ML;;;;;LW)"

ici nous permettent GENERIC_ALL (GA) à système (SY) et Administrateurs (BA) et GENERIC_READ|GENERIC_EXECUTE pour Utilisateurs (BU) et TOUS LES PAQUETS D'APPLICATION (AC)

+0

Merci beaucoup - cela fonctionne! Oui, j'ai lu cette note pendant que je creusais, mais la liste des étapes m'avait totalement troublé à la fin. Je ne crée pas et n'initialise pas les descripteurs de sécurité tous les jours - c'est quelque chose que j'ai toujours refusé de pratiquer ... il me semble que je dois le faire enfin. – kEst86

+0

@ kEst86 - j'ajouter un exemple aussi comment utiliser Security Descriptor String Format - peut être ce sera plus facile – RbMm