DACL

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2022. május 6-án felülvizsgált verziótól ; az ellenőrzéshez 1 szerkesztés szükséges .

DACL - angol  Diszkrecionális hozzáférés-szabályozási lista  - a szelektív hozzáférés -szabályozás listája, amelyet az objektum tulajdonosa irányít, és szabályozza a felhasználók és csoportok jogait az objektum kezeléséhez (olvasás, írás, törlés stb.). [1] ACE-k halmazából áll ( A hozzáférés-vezérlési bejegyzés  egy listaelem) . 

Példa elemek hozzáadására egy fájl vagy könyvtár DACL-jéhez [2] :

#ifndef UNICODE #define UNICODE #endif #include <windows.h> #include <stdio.h> #include <lm.h> int main () { wchar_t wchDirName [ 248 ]; // könyvtár neve wchar_t wchUserName [ UNLEN ]; // felhasználónév ACL * lpOldDacl ; // mutató a régi DACL ACL -re * lpNewDacl ; // mutató az új DACL -re LPVOID lpAce ; // mutató az elemre ACE DWORD dwDaclLength = 0 ; // DACL duplaszó hossza dwSdLength = 0 ; // SD duplaszó hossza dwSidLength = 0 ; // hossza SID duplaszó dwLengthOfDomainName = 0 ; // PSID tartománynév hossza lpSid = NULL ; // mutató az engedélyező SID -re LPTSTR lpDomainName = NULL ; // mutató a domain névre SID_NAME_USE typeOfSid ; // fiók típusa SECURITY_DESCRIPTOR * lpSd = NULL ; // biztonsági leíró címe SECURITY_DESCRIPTOR sdAbsoluteSd ; // abszolút formátum SD BOOL bDaclPresent ; // a DACL lista jelenlétének jelzése BOOL bDaclDefaulted ; // az alapértelmezett DACL lista attribútuma DWORD dwRetCode ; // visszatérési kód // fájl vagy könyvtárnév olvasása printf ( "Fájl vagy könyvtárnév megadása: " ); _getws ( wchDirName ); // lekérjük a biztonsági leíró hosszát if ( ! GetFileSecurity ( wchDirName , // fájlnév DACL_SECURITY_INFORMATION , // DACL lpSd lekérése , // biztonsági leíró címe 0 , // pufferhossz és dwSdLength meghatározása )) // kívánt hosszúságú cím { dwRetCode = GetLastError (); if ( dwRetCode == ERROR_INSUFFICIENT_BUFFER ) // puffermemória lefoglalása lpSd = ( SECURITY_DESCRIPTOR * ) new char [ dwSdLength ]; más { // kilépés a programból printf ( "A fájlbiztonság lekérése nem sikerült. \n " ); printf ( "Hibakód: %d \n " , dwRetCode ); return dwRetCode ; } } // olvassa el a biztonsági leírót if ( ! GetFileSecurity ( wchDirName , // fájlnév DACL_SECURITY_INFORMATION , // DACL lpSd lekérése , // biztonsági leíró címe dwSdLength , // puffer hossza és dwSdLength )) // cím a szükséges hosszúsághoz { dwRetCode = GetLastError (); printf ( "A fájlbiztonság lekérése nem sikerült. \n " ); printf ( "Hibakód: %d \n " , dwRetCode ); return dwRetCode ; } // adja meg a DACL-hez hozzáadandó felhasználónevet printf ( "Adjon meg egy felhasználónevet: " ); _getws ( wchUserName ); // határozza meg a felhasználói SID hosszát if ( ! LookupAccountName ( NULL , // keresse meg a nevet a helyi számítógépen wchUserName , // felhasználónév NULL , // keresse meg a SID hosszát & dwSidLength , // a SID hosszát NULL , // keresse meg a domain nevet & dwLengthOfDomainName , // a domain név hosszát & typeOfSid )) // fióktípus { dwRetCode = GetLastError (); if ( dwRetCode == ERROR_INSUFFICIENT_BUFFER ) { // memória lefoglalása a SID számára lpSid = ( SID * ) new char [ dwSidLength ]; lpDomainName = ( LPTSTR ) new wchar_t [ dwLengthOfDomainName ]; } más { // kilépés a programból printf ( "A fióknév keresése nem sikerült. \n " ); printf ( "Hibakód: %d \n " , dwRetCode ); return dwRetCode ; } } // határozza meg az SID -t if ( ! LookupAccountName ( NULL , // nevet keres a helyi számítógépen wchUserName , // felhasználónév lpSid , // mutató a SID -re & dwSidLength , // a SID hossza lpDomainName , // mutató a domain névre & dwLengthOfDomainName , // a domain név hossza & typeOfSid )) / / fióktípus { dwRetCode = GetLastError (); printf ( "A fióknév keresése sikertelen. \n " ); printf ( "Hibakód: %d \n " , dwRetCode ); return dwRetCode ; } // lekérni a DACL-t a biztonsági leíróból if ( ! GetSecurityDescriptorDacl ( lpSd , // biztonsági leíró cím & bDaclPresent , // DACL jelenlét jelző & lpOldDacl , // DACL mutató címe & bDaclDefaulted )) // alapértelmezett DACL jelző { dwRetCode = GetLastError (); printf ( "A DACL biztonsági leíró letöltése sikertelen. \n " ); printf ( "Hibakód: %d \n " , dwRetCode ); return dwRetCode ; } // az új DACL hosszának meghatározása dwDaclLength = lpOldDacl -> AclSize + sizeof ( ACCESS_ALLOWED_ACE ) - sizeof ( DWORD ) + dwSidLength ; // memória lefoglalása az új DACL számára lpNewDacl = ( ACL * ) new char [ dwDaclLength ]; // új DACL inicializálása if ( ! InitializeAcl ( lpNewDacl , // DACL cím dwDaclLength , // DACL hossza ACL_REVISION )) // DACL verzió { dwRetCode = GetLastError (); printf ( "A fióknév keresése sikertelen. \n " ); printf ( "Hibakód: %d \n " , dwRetCode ); return dwRetCode ; } // új elem hozzáadása az új DACL- hez if ( ! AddAccessDeniedAce ( lpNewDacl , // DACL cím ACL_REVISION , // DACL verzió FILE_WRITE_ATTRIBUTES , // attribútumok írásának letiltása lpSid )) // SID cím { dwRetCode = GetLastError (); perror ( "Az engedélyezett ász hozzáadása sikertelen. \n " ); printf ( "Az utolsó hibakód: %u \n " , dwRetCode ); return dwRetCode ; } // lekérjük az első ACE címét a régi DACL-ben if ( ! GetAce ( lpOldDacl , // a régi DACL 0 címe , // az első elem keresése & lpAce )) // az első elem címe { dwRetCode = GetLastError (); printf ( "Az ász beszerzése nem sikerült. \n " ); printf ( "Hibakód: %d \n " , dwRetCode ); return dwRetCode ; } // elemek felülírása a régi DACL-ből az új DACL-be if ( bDaclPresent ) { if ( ! AddAce ( lpNewDacl , // az új DACL ACL_REVISION címe , // a DACL MAXDWORD verziója , // hozzáadása a lista végéhez lpAce , // a régi DACL címe lpOldDacl -> AclSize - sizeof ( ACL ))) // a régi DACL hossza { dwRetCode = GetLastError (); perror ( "Az engedélyezett ász hozzáadása sikertelen. \n " ); printf ( "Az utolsó hibakód: %u \n " , dwRetCode ); return dwRetCode ; } } // ellenőrizze, hogy a DACL érvényes- e, ha ( ! IsValidAcl ( lpNewDacl )) { dwRetCode = GetLastError (); perror ( "Az új ACL érvénytelen. \n " ); printf ( "Az utolsó hibakód: %u \n " , dwRetCode ); return dwRetCode ; } // új abszolút biztonsági leíró létrehozása if ( ! InitializeSecurityDescriptor ( & sdAbsoluteSd , // az SD szerkezet címe SECURITY_DESCRIPTOR_REVISION )) { dwRetCode = GetLastError (); perror ( "A biztonsági leíró inicializálása nem sikerült. \n " ); printf ( "Az utolsó hibakód: %u \n " , dwRetCode ); return dwRetCode ; } // a DACL beállítása új biztonsági leíróra if ( ! SetSecurityDescriptorDacl ( & sdAbsoluteSd , // biztonsági leíró címe TRUE , // A DACL jelen van lpNewDacl , // mutató a DACL -re FALSE )) // A DACL alapértelmezés szerint nincs beállítva { dwRetCode = GetLastError (); perror ( "A DACL biztonsági leíró beállítása nem sikerült. \n " ); printf ( "Az utolsó hibakód: %u \n " , dwRetCode ); return dwRetCode ; } // ellenőrizze a biztonsági leíró szerkezetét, ha ( ! IsValidSecurityDescriptor ( & sdAbsoluteSd )) { dwRetCode = GetLastError (); perror ( "A biztonsági leíró érvénytelen. \n " ); printf ( "Az utolsó hibakód: %u \n " , dwRetCode ); return dwRetCode ; } // új biztonsági leíró beállítása if ( ! SetFileSecurity ( wchDirName , // fájlnév DACL_SECURITY_INFORMATION , // DACL & sdAbsoluteSd beállítása )) // biztonsági leíró cím { dwRetCode = GetLastError (); printf ( "A fájlbiztonság beállítása nem sikerült. \n " ); printf ( "Hibakód: %d \n " , dwRetCode ); return dwRetCode ; } // memória felszabadítása törlés [] lpSd ; törlés [] lpSid ; törlés [] lpDomainName ; törlés [] lpNewDacl ; return 0 ; }

Irodalom

Pobegailo A.P. Rendszerprogramozás Windows alatt. - Szentpétervár: BHV-Petersburg, 2006. - 1056 s: ill.

Jegyzetek

  1. D (Windows) . Letöltve: 2009. november 18. Az eredetiből archiválva : 2009. december 11..
  2. Pobegailo A.P. Rendszerprogramozás Windows alatt. - Szentpétervár: BHV-Petersburg, 2006. - 1056 s: ill.