The SECURITY_ATTRIBUTES struct und CreateNamedPipe ()

ein Szenario ist das folgende: Der Prozess, der das Named Pipe-Objekt mit @ erstellCreateNamedPipe() hat Administratorrechte, aber der Client-Prozess "verbindet" sich mitCreateFile() nicht. Ein @ übergebNULL als letztes Argument fürCreateNamedPipe() scheint standardmäßig nur Administratorzugriffsrechte zu haben.

Als Hack habe ich versucht, eine Server-Seite zu tunImpersonateLoggedOnUser()/RevertToSelf() -Methode für die Dauer des Pipe-Codes, schlägt jedoch fehl. Mir scheint, das Beste, was Sie hier tun können, ist, ein richtiges @ zu setzeSECURITY_ATTRIBUTES struct bis zum letzten Parameter vonCreateNamedPipe(), aber ich habe Probleme herauszufinden, wie das geht.

DasMSDN Beispiel hat ein Beispiel für die Manipulation von Registrierungsschlüsseln, aber mir fehlt das Fachwissen, um dies an meine Zwecke anzupassen.

Das ist, was ich versucht habe:

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;

Outcome ist, dass Client-Seite den Fehler bekommt0x5 (Zugriff verweigert) amCreateFile(). Was ist hier falsch

Antworten auf die Frage(6)

Ihre Antwort auf die Frage