Newsgroup: it.comp.programmare.win32
Titolo: Directory access permission

Qualcuno ha idea di come verificare in maniera semplice (per quanto
qualcosa si possa definire semplice su windows ;-)), i permessi di
accesso ad una directory? Io ho scritto questo codice (scopiazzando
in giro per internet), ma sembra non funzionare, ottengo FALSE come
valore di ritorno anche se la directory e' sicuramente scrivibile.
BOOL isDirWritableByCurrUser
(
   const char* pDirNameP
)
{
   int                  retVal        = ERROR_SUCCESS;
   DWORD                secDescrSize  = 0;
   HANDLE               procHandle    = 0;
   HANDLE               accessHandle  = 0;
   PSECURITY_DESCRIPTOR secDescrP     = NULL;
   if(NULL == pDirNameP || '\0' == pDirNameP[0])
      return ERROR_INVALID_PARAMETER;
   procHandle = GetCurrentProcess();
   retVal = OpenProcessToken(procHandle, TOKEN_QUERY, &accessHandle);
   if(FALSE == retVal)
      retVal = GetLastError();
   else
      retVal = ERROR_SUCCESS;
 
// Recuperano le informazioni sui permessi
// dell'utente sulla directory
// ---------------------------------------
   if(ERROR_SUCCESS == retVal)
   {
      retVal = ERROR_INSUFFICIENT_BUFFER;
      secDescrSize = 0;
      while(ERROR_INSUFFICIENT_BUFFER == retVal)
      {
         free(secDescrP);
         secDescrP = (PSECURITY_DESCRIPTOR)malloc(secDescrSize);
         retVal = GetFileSecurity(pDirNameP, OWNER_SECURITY_INFORMATION
                                  | GROUP_SECURITY_INFORMATION |
                                  DACL_SECURITY_INFORMATION, secDescrP,
                                  secDescrSize, &secDescrSize);
         if(0 == retVal)
            retVal = GetLastError();
         else
            retVal = ERROR_SUCCESS;
      }
   }
// Si verifica se l'utente puo' leggere, scrivere e modificare
// la directory.
// -----------------------------------------------------------
   if(ERROR_SUCCESS == retVal)
   {
      BOOL            bAccessGrntd  = FALSE;
      DWORD           privSetSize   = sizeof (PRIVILEGE_SET);
      DWORD           desAccess     = FILE_WRITE_DATA;
      DWORD           grantedAccess = 0;
      PRIVILEGE_SET   privilegeSet  = {0};
      GENERIC_MAPPING genMapping    = {0xFF};
      genMapping.GenericWrite = FILE_GENERIC_WRITE;
      MapGenericMask(&desAccess, &genMapping); 
      retVal = AccessCheck(secDescrP, procHandle, desAccess,
                           &genMapping,
                           &privilegeSet, &privSetSize, &grantedAccess,
                           &bAccessGrntd);
     if(FALSE == retVal)
        retVal = GetLastError();
   }
   free(secDescrP);
   return bAccessGrntd;
}
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 valore di ritorno anche se la directory e' sicuramente scrivibile.
cosa intendi controllare di preciso? la possibilità di creare files o
scrivere attributi? o entrambe?
comunque l'errore sta nel fatto che la mappatura dei diritti da generici a
specifici/standard non la devi fabbricare tu (oltrettutto l'hai fatta pure
sbagliata :P), ma la devi ottenere non ricordo come in relazione al tipo
di oggetto (in questo caso una directory); aspetta che cerco su MSDN...
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 di oggetto (in questo caso una directory); aspetta che cerco su MSDN...
hum, sai che non trovo il modo? non so come si fa a riempire la struttura
GENERIC_MASK... può anche essere che si debba fare a mano visto che MSDN
documenta il significato dei singoli bit del tipo ACCESS_MASK, ma non
trovo nemmeno le definizioni delle costanti per gli accessi specifici
delle directory


 delle directory
strano, ho trovato una routine dell'I/O Manager che ritorna la mappatura
per i File Objects, solo che:
1) è kernel mode; o meglio, ipotizzo si possa chiamare tranquillamente
anche da user mode, ma vatti a linkare a ntoskrnl.exe in user mode :P
2) è solo per i file; non so se riguarda anche le directories, forse si ma
non sono sicuro
ora ti saluto perché non voglio perdermi Dragon Ball :PPPP


 ora ti saluto perché non voglio perdermi Dragon Ball :PPPP
e in secondo luogo ho anche fame :D


 valore di ritorno anche se la directory e' sicuramente scrivibile.
Provare a creare un file e poi eliminarlo non può essere una soluzione?
-- 
Costantino Grana 

 Provare a creare un file e poi eliminarlo non può essere una soluzione?
non gli darebbe la certezza di poter anche scrivere gli attributi della
cartella


 Provare a creare un file e poi eliminarlo non può essere una soluzione?
Sei sicuro che tutte le volte che ti e' permesso di creare un file
in una directory, ti e' anche permesso di eliminarlo? ;-)
C:\>iao Angelo
P.S. La soluzione potrebbe funzionare e avevo anche pensato di fare
in quel modo. Ma mi ripugna: se esiste la possibilita' di testare i
permessi di una directory, e' quella la soluzione.
