La estructura SECURITY_ATTRIBUTES y CreateNamedPipe ()

Mi escenario es el siguiente: el proceso que crea el objeto de tubería con nombre conCreateNamedPipe() tiene privilegios de administrador, pero el proceso del cliente "se conecta" conCreateFile() no. Pasando unNULL como el último argumento paraCreateNamedPipe() parece tener por defecto los derechos de acceso solo de administrador.

Como hack, he intentado hacer un servidorImpersonateLoggedOnUser()/RevertToSelf() método para la duración del código relacionado con la tubería, pero falla. Me parece que lo mejor que puedes hacer aquí es establecer una adecuadaSECURITY_ATTRIBUTES struct al último parámetro deCreateNamedPipe(), pero tengo problemas para descubrir cómo hacerlo.

losEjemplo de MSDN tiene un ejemplo relacionado con la manipulación de claves de registro, pero me falta la experiencia para adaptarlo a mis propósitos.

Esto es lo que he intentado:

if (!AllocateAndInitializeSid(&SIDAuthWorld, 1,
    SECURITY_WORLD_RID,
    0, 0, 0, 0, 0, 0, 0,
    &pEveryoneSID))
{
    _tprintf(_T("AllocateAndInitializeSid Error %u\n"), GetLastError());
    ret_val = 0;
    goto Cleanup;
}

// Initialize an EXPLICIT_ACCESS structure for an ACE.
// The ACE will allow Everyone read access to the key.
ZeroMemory(&ea, 2 * sizeof(EXPLICIT_ACCESS));
ea[0].grfAccessPermissions = STANDARD_RIGHTS_ALL;
ea[0].grfAccessMode = SET_ACCESS;
ea[0].grfInheritance = NO_INHERITANCE;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
ea[0].Trustee.ptstrName = (LPTSTR)pEveryoneSID;

// there's another ACE for administrators in between, but is of no relevance here

dwRes = SetEntriesInAcl(2, ea, NULL, &pACL);

// Initialize a security descriptor.  
pSD = (PSECURITY_DESCRIPTOR)LocalAlloc(LPTR,
    SECURITY_DESCRIPTOR_MIN_LENGTH);
if (NULL == pSD)
{
    _tprintf(_T("LocalAlloc Error %u\n"), GetLastError());
    ret_val = 0;
    goto Cleanup;
}

if (!InitializeSecurityDescriptor(pSD,
    SECURITY_DESCRIPTOR_REVISION))
{
    _tprintf(_T("InitializeSecurityDescriptor Error %u\n"),
        GetLastError());
    ret_val = 0;
    goto Cleanup;
}

// Add the ACL to the security descriptor. 
if (!SetSecurityDescriptorDacl(pSD,
    TRUE,     // bDaclPresent flag   
    pACL,
    FALSE))   // not a default DACL 
{
    _tprintf(_T("SetSecurityDescriptorDacl Error %u\n"),
        GetLastError());
    ret_val = 0;
    goto Cleanup;
}

    // Initialize a security attributes structure.
*sa = new SECURITY_ATTRIBUTES;

(*sa)->nLength = sizeof(SECURITY_ATTRIBUTES);
(*sa)->lpSecurityDescriptor = pSD;
(*sa)->bInheritHandle = FALSE;

El resultado es que el lado del cliente obtiene el error0x5 (acceso denegado) enCreateFile(). ¿Que esta mal aquí?

Respuestas a la pregunta(3)

Su respuesta a la pregunta