DACL

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 6 maj 2022; verifiering kräver 1 redigering .

DACL - engelska  Diskretionär åtkomstkontrolllista  - en lista över selektiv åtkomstkontroll som kontrolleras av objektets ägare och som reglerar användarnas och gruppers rättigheter att agera på objektet (läsa, skriva, ta bort, etc.). [1] Består av en uppsättning ACE ( Access Control Entry  är ett listelement) . 

Ett exempel på att lägga till element till DACL för en fil eller katalog [2] :

#ifndef UNICODE #definiera UNICODE #endif #include <windows.h> #include <stdio.h> #inkludera <lm.h> int main () { wchar_t wchDirName [ 248 ]; // katalognamn wchar_t wchUserName [ UNLEN ]; // användarnamn ACL * lpOldDacl ; // pekare till gamla DACL ACL * lpNewDacl ; // pekare till nya DACL LPVOID lpAce ; // pekare till element ACE DWORD dwDaclLength = 0 ; // DACL DWORD- längd dwSdLength = 0 ; // SD DWORD- längd dwSidLength = 0 ; // length SID DWORD dwLengthOfDomainName = 0 ; // PSID domännamn längd lpSid = NULL ; // pekare till det aktiverande SID LPTSTR lpDomainName = NULL ; // pekare till domännamnet SID_NAME_USE typeOfSid ; // kontotyp SECURITY_DESCRIPTOR * lpSd = NULL ; // säkerhetsbeskrivningsadress SECURITY_DESCRIPTOR sdAbsoluteSd ; // absolut format SD BOOL bDaclPresent ; // indikation på närvaron av DACL-listan BOOL bDaclDefaulted ; // attribut för standard DACL-listan DWORD dwRetCode ; // returkod // läs fil- eller katalognamn printf ( "Ange ett fil- eller katalognamn: " ); _getws ( wchDirName ); // få längden på säkerhetsbeskrivningen om ( ! GetFileSecurity ( wchDirName , // filnamn DACL_SECURITY_INFORMATION , // få DACL lpSd , // säkerhetsdeskriptoradress 0 , // bestäm buffertlängd & dwSdLength )) // adress för önskad längd { dwRetCode = GetLastError (); if ( dwRetCode == ERROR_INSUFFICIENT_BUFFER ) // allokera buffertminne lpSd = ( SECURITY_DESCRIPTOR * ) new char [ dwSdLength ]; annan { // avsluta programmet printf ( "Få filsäkerhet misslyckades. \n " ); printf ( "Felkod: %d \n " , dwRetCode ); returnera dwRetCode ; } } // läs säkerhetsbeskrivningen om ( ! GetFileSecurity ( wchDirName , // filnamn DACL_SECURITY_INFORMATION , // få DACL lpSd , // säkerhetsdeskriptoradress dwSdLength , // bufferlengd & dwSdLength )) // adress för önskad längd { dwRetCode = GetLastError (); printf ( "Få filsäkerhet misslyckades. \n " ); printf ( "Felkod: %d \n " , dwRetCode ); returnera dwRetCode ; } // ange användarnamnet som ska läggas till i DACL printf ( "Ange ett användarnamn: " ); _getws ( wchUserName ); // bestäm användarens SID-längd om ( ! LookupAccountName ( NULL , // slå upp namnet på den lokala datorn wchUserName , // användarnamn NULL , // hitta SID-längden & dwSidLength , // SID-längden NULL , // hitta domännamnet & dwLengthOfDomainName , // domännamnets längd & typeOfSid )) // kontotyp { dwRetCode = GetLastError (); if ( dwRetCode == ERROR_INSUFFICIENT_BUFFER ) { // allokera minne för SID lpSid = ( SID * ) new char [ dwSidLength ]; lpDomainName = ( LPTSTR ) new wchar_t [ dwLengthOfDomainName ]; } annan { // avsluta programmet printf ( "Sökkontonamn misslyckades. \n " ); printf ( "Felkod: %d \n " , dwRetCode ); returnera dwRetCode ; } } // bestäm SID om ( ! LookupAccountName ( NULL , // letar efter ett namn på den lokala datorn wchUserName , // användarnamn lpSid , // pekare till SID & dwSidLength , // längd på SID lpDomainName , // pekare till domännamn & dwLengthOfDomainName , // längd på domännamn & typeOfSid )) / / kontotyp { dwRetCode = GetLastError (); printf ( "Sök kontonamn misslyckades. \n " ); printf ( "Felkod: %d \n " , dwRetCode ); returnera dwRetCode ; } // hämta DACL från säkerhetsdeskriptorn om ( ! GetSecurityDescriptorDacl ( lpSd , // säkerhetsdeskriptoradress & bDaclPresent , // DACL närvaroflagga & lpOldDacl , // DACL-pekaradress & bDaclDefaulted )) // standard DACL-flagga { dwRetCode = GetLastError (); printf ( "Hämta säkerhetsdeskriptor DACL misslyckades. \n " ); printf ( "Felkod: %d \n " , dwRetCode ); returnera dwRetCode ; } // bestäm längden på den nya DACL dwDaclLength = lpOldDacl -> AclSize + sizeof ( ACCESS_ALLOWED_ACE ) - sizeof ( DWORD ) + dwSidLength ; // allokera minne för den nya DACL :n lpNewDacl = ( ACL * ) new char [ dwDaclLength ]; // initiera en ny DACL om ( ! InitializeAcl ( lpNewDacl , // DACL-adress dwDaclLength , // DACL length ACL_REVISION )) // DACL version { dwRetCode = GetLastError (); printf ( "Sök kontonamn misslyckades. \n " ); printf ( "Felkod: %d \n " , dwRetCode ); returnera dwRetCode ; } // lägg till ett nytt element i den nya DACL om ( ! AddAccessDeniedAce ( lpNewDacl , // DACL-adress ACL_REVISION , // DACL-version FILE_WRITE_ATTRIBUTES , // inaktivera skrivattribut lpSid )) // SID-adress { dwRetCode = GetLastError (); perror ( "Lägg till tillåtet ess misslyckades. \n " ); printf ( "Den senaste felkoden: %u \n " , dwRetCode ); returnera dwRetCode ; } // få adressen till den första ACE i den gamla DACL om ( ! GetAce ( lpOldDacl , // adress till gamla DACL 0 , // leta efter första element & lpAce )) // adress till första element { dwRetCode = GetLastError (); printf ( "Få ess misslyckades. \n " ); printf ( "Felkod: %d \n " , dwRetCode ); returnera dwRetCode ; } // skriv över objekt från gamla DACL till nya DACL if ( bDaclPresent ) { om ( ! AddAce ( lpNewDacl , // adress till den nya DACL ACL_REVISION , // version av DACL MAXDWORD , // lägg till i slutet av listan lpAce , // adress till den gamla DACL lpOldDacl -> AclSize - sizeof ( ACL ))) // längden på den gamla DACL { dwRetCode = GetLastError (); perror ( "Lägg till tillåtet ess misslyckades. \n " ); printf ( "Den senaste felkoden: %u \n " , dwRetCode ); returnera dwRetCode ; } } // kontrollera om DACL är giltigt om ( ! IsValidAcl ( lpNewDacl )) { dwRetCode = GetLastError (); perror ( "Den nya ACL är ogiltig. \n " ); printf ( "Den senaste felkoden: %u \n " , dwRetCode ); returnera dwRetCode ; } // skapa en ny absolut säkerhetsdeskriptor om ( ! InitializeSecurityDescriptor ( & sdAbsoluteSd , // adress till struktur SD SECURITY_DESCRIPTOR_REVISION )) { dwRetCode = GetLastError (); perror ( "Initialisering av säkerhetsbeskrivning misslyckades. \n " ); printf ( "Den senaste felkoden: %u \n " , dwRetCode ); returnera dwRetCode ; } // ställ in DACL till ny säkerhetsdeskriptor om ( ! SetSecurityDescriptorDacl ( & sdAbsoluteSd , // säkerhetsbeskrivningsadress TRUE , // DACL närvarande lpNewDacl , // pekare till DACL FALSE )) // DACL inte inställt som standard { dwRetCode = GetLastError (); perror ( "Inställning av säkerhetsdeskriptor DACL misslyckades. \n " ); printf ( "Den senaste felkoden: %u \n " , dwRetCode ); returnera dwRetCode ; } // kontrollera strukturen för säkerhetsdeskriptorn om ( ! IsValidSecurityDescriptor ( & sdAbsoluteSd )) { dwRetCode = GetLastError (); perror ( "Säkerhetsbeskrivningen är ogiltig. \n " ); printf ( "Den senaste felkoden: %u \n " , dwRetCode ); returnera dwRetCode ; } // ställ in en ny säkerhetsdeskriptor om ( ! SetFileSecurity ( wchDirName , // filnamn DACL_SECURITY_INFORMATION , // set DACL & sdAbsoluteSd )) // säkerhetsdeskriptoradress { dwRetCode = GetLastError (); printf ( "Inställning av filsäkerhet misslyckades. \n " ); printf ( "Felkod: %d \n " , dwRetCode ); returnera dwRetCode ; } // ledigt minne radera [] lpSd ; ta bort [] lpSid ; ta bort [] lpDomainName ; ta bort [] lpNewDacl ; returnera 0 ; }

Litteratur

Pobegailo A.P. Systemprogrammering i Windows. - St Petersburg: BHV-Petersburg, 2006. - 1056 s: ill.

Anteckningar

  1. D (Windows) . Hämtad 18 november 2009. Arkiverad från originalet 11 december 2009.
  2. Pobegailo A.P. Systemprogrammering i Windows. - St Petersburg: BHV-Petersburg, 2006. - 1056 s: ill.