begin process at 2010 02 10 06:17:01
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Fichier / Disque

 > 

Protection d'un fichier


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Protection d'un fichier

mercredi 9 novembre 2005 à 10:14:01 | Protection d'un fichier

mammnon

Bonjour à tous.

Petite question qui va probablement en faire rire plus d'un: Comment bloquer completement l'acces à un fichier?, voir à un dossier?

Pour l'instant j'ai un programme (en fait un service mais bon...) qui ouvre un handle vers le fichier a proteger et le referme pas.
    HANDLE fichier= CreateFile ( "c:\\mon_fichier.txt", MAXIMUM_ALLOWED | GENERIC_READ | GENERIC_WRITE, 0, 0,OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN | FILE_ATTRIBUTE_SYSTEM, NULL );

De cette manière il s'avere impossible de le supprimer (tant que mon prg tourne)! Oui mais j'ai l'esprit tordu et j'ai fais quelques test et là oh! surprise! il est possible de RENOMMER le fichier! Du coup au prochain demarrage mon service ne pourra pas ouvrir le handle vers le fichier et je l'ai dans **********!

J'ai déjà fait ca:
SetFileAttributes("
c:\\mon_fichier.txt",FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_READONLY );
donc maintenant ca complique encore plus la chose mais il est toujours possible de supprimer mon satané fichier!

Si quelqu'un a une idée de génie, ca serrais cool de la partager....même une idée tout court serrait la bienvenue...



Tom@
mercredi 9 novembre 2005 à 10:38:23 | Re : Protection d'un fichier

BruNews

Administrateur CodeS-SourceS
Ton HANDLE fichier est surement invalide.

J'ai testé:
int WINAPI WinMain(HINSTANCE h, HINSTANCE x, LPSTR ystr, int z)
{
  HANDLE hfl = CreateFile("d:\\aaa.txt", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0);
  if(hfl == INVALID_HANDLE_VALUE) return 0;
  MessageBox(0, "OK", "R", 0);
  CloseHandle(hfl);
  return 0;
}

Tant que MessageBox est affichée il est tout à fait impossible de renommer, éditer ou supprimer le fichier.

ciao...
[ Lien ]
BruNews, MVP VC++
mercredi 9 novembre 2005 à 11:04:33 | Re : Protection d'un fichier

mammnon

LOL, j'ai pas pensé à verifier que mon handle est bon...je verifie et je tiens au courant

thomas
mercredi 9 novembre 2005 à 11:10:06 | Re : Protection d'un fichier

mammnon

Bon mauvaise nouvelle....
Mon Handle est bon et je peux toujours renommer le fichier MAIS BruNews tu n'avais pas tort:
effectivement ouvrir le handle empeche de le renommer quand c'est un prg standard. Le problème vient donc du fait que le handle est ouvert a partir d'un service et non d'un executable classique...

Tom@
mercredi 9 novembre 2005 à 11:38:14 | Re : Protection d'un fichier

BruNews

Administrateur CodeS-SourceS
C'est certain, à partir d'un service il est ouvert dans un autre 'contexte' et la session en cours n'a pas eu la restriction d'accès.
Vérifie si ton service est 'system' ou 'local'.

ciao...
[ Lien ]
BruNews, MVP VC++
mercredi 9 novembre 2005 à 11:51:23 | On avance, on avance....on a plus assez d'essence...

mammnon

Je me moque pas mais à la question de savoir si mon service est "system" ou "local" je reponds qu'il est noté comme  "Système local" dans le gestionnaire de service...dsl

Voilà comment je l'ai créé:

SC_HANDLE schService = CreateService(schSCManager,NOM1,NOM2,
        SERVICE_ALL_ACCESS,   
                          // Type d'acces
        SERVICE_WIN32_OWN_PROCESS,
        // Type de service
        SERVICE_AUTO_START,    
                     // Pour le demarrage automatique
        SERVICE_ERROR_NORMAL,                  
// error control type
        lpszBinaryPathName,    
                              // service's binary
        NULL,                     
                                      // no load ordering group
        NULL,                     
                                       // no tag identifier
        NULL,                     
                                     // no dependencies
        NULL,                    
                                       // Si null demarrer en tant que compte system
        NULL);            
                                             // Mot de passe : null si demarrer en tant que system

Voilà, autant vous dire que j'ai pas ré-inventer la roue donc si quelqu'un trouve que ca ressemble a son code c plus que possible...

Bon alors j'ai posé une colle?
La question de protection d'un fichier est devenue:
Comment un service peux-t-il ouvrir un handle en mode exclusif avec tous les utilisateurs?


Tom@
mercredi 9 novembre 2005 à 12:06:44 | Re : Protection d'un fichier

BruNews

Administrateur CodeS-SourceS
désolé c'était 'local system' ou 'local service'.

Je m'occupe de ton problème dès que possible.

ciao...
[ Lien ]
BruNews, MVP VC++
jeudi 10 novembre 2005 à 13:01:27 | Re : Protection d'un fichier

BruNews

Administrateur CodeS-SourceS
Réponse acceptée !
As-tu essayé de mettre un DACL pour restreindre l'accès ?
Regarde ici si ça peut t'aider:
[ Lien ]

ciao...
[ Lien ]
BruNews, MVP VC++
lundi 14 novembre 2005 à 14:40:42 | Re : Protection d'un fichier

mammnon

Merci BruNews de m'avoir mis sur la voie...
Bon alors comme ca ca fonctionne mais il y a encore des choses bizarres.
Par exemple si le prg creer le fichier les droits sont correctement placés. Sinon, sur un fichier dejà existant, ca ne fait que empecher reelement son ouverture, sa destruction, et son renommage...

Bon bah pour ceux que ca interesse voici un bout de code, condensé de tout ce que j'ai trouvé sur le sujet, qui permet de vraiment interdire un fichier:
(dsl pour les commentaires)


    SECURITY_ATTRIBUTES  sa;
    SECURITY_DESCRIPTOR SD;
    PACL pACL = NULL;
    EXPLICIT_ACCESS ea[2];
       SID_IDENTIFIER_AUTHORITY SIDAuthWorld = SECURITY_WORLD_SID_AUTHORITY;
    SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY;
    PSID pEveryoneSID = NULL, pAdminSID = NULL;

    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle = FALSE;


    BOOL bInitOk = InitializeSecurityDescriptor( &SD,SECURITY_DESCRIPTOR_REVISION );
    if ( bInitOk ){
   // give the security descriptor a Null Dacl
   // done using the  "TRUE, (PACL)NULL" here

           if(AllocateAndInitializeSid(&SIDAuthWorld, 1,SECURITY_WORLD_RID,0, 0, 0, 0, 0, 0, 0,&pEveryoneSID)){

            // 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 = KEY_READ;
            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;

            if(AllocateAndInitializeSid(&SIDAuthNT, 2,SECURITY_BUILTIN_DOMAIN_RID,DOMAIN_ALIAS_RID_ADMINS,0, 0, 0, 0, 0, 0,&pAdminSID)){

                // Initialize an EXPLICIT_ACCESS structure for an ACE.
                // The ACE will allow the Administrators group full access to the key.
                ea[1].grfAccessPermissions = KEY_ALL_ACCESS;
                ea[1].grfAccessMode = SET_ACCESS;
                ea[1].grfInheritance= NO_INHERITANCE;
                ea[1].Trustee.TrusteeForm = TRUSTEE_IS_SID;
                ea[1].Trustee.TrusteeType = TRUSTEE_IS_GROUP;
                ea[1].Trustee.ptstrName  = (LPTSTR) pAdminSID;
                   if(ERROR_SUCCESS == SetEntriesInAcl(2, ea, NULL, &pACL)){

                    BOOL bSetOk = SetSecurityDescriptorDacl( &SD,TRUE,pACL,FALSE );
                       if ( bSetOk ){
                              // Make the security attributes point
                          // to the security descriptor
                           sa.lpSecurityDescriptor = &SD;
                        protection = CreateFile ( "c:\\lcc\\projects\\executable.exe",MAXIMUM_ALLOWED | GENERIC_READ, 0, &sa,OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN | FILE_ATTRIBUTE_SYSTEM, NULL );
                        // Free the memory allocated for the SECURITY_DESCRIPTOR.
                        LocalFree(sa.lpSecurityDescriptor);

                    }
                }
            }
        }
    }



Mammnon


Cette discussion est classée dans : fichier, file, handle, protection, attribute


Répondre à ce message

Sujets en rapport avec ce message

ouverture de fichier avec les MFC [ par steph76 ] Bonjourvoila je programme une application qui ha beusoin d'ouvrir 1 fichier via httpJ'ai donc fait le code suivantCStdioFile *file;CInternetSession IS Problème avec traitement de fichier (cplusplus !) [ par Sianrin ] Voila, j'explique mon problème. Pour voir un peu comment les accès au fichiers se géraient en cplusplus, je me suis mis en tête de faire un programme Enregistrer en HEXA un texte avec gcc !! [ par UncleShu ] /* * Ce programme affiche le fichier en HEXADECIMAL et se copie lui-même avec * une autre exetenstion (.txt). Moi je voudrais qui affiche le fichier * Petit probleme de code en C sur Linux !! [ par UncleShu ] Je voudrais créer un fichier dans le réperoire personnel d'un utilisateur mais mon code ne marche pas !!#include #include #include #define DIR $HOM Mettre un fichier .exe dans un buffer [ par guiguikun ] Je n'arrive pas a mettre un fichier executable en memoire.sur les 100Ko du fichier, mon buffer ne compte que les 3 premiers octets (caracteres)voici m [C] Transfert de fichier par sockets [ par bonobo78 ] salut ! j'ai un petit pb pour transmettre un fichier via des sockets.En fait, je decoupe le fichier en petit bout de 1024 octets et je transmets chaqu prob avec nom de fichier. [ par kach23 ] bonjour, je debute etje réalise une acquisition de mesure avec builder.je souhaite que le nom du fichier ouvert a chaque acquisition soit different.vo GROS problème avec ' tellg() ' [ par Sanke ] Bonjour à tous, je poste ce message parce que je ne comprends pas ce qui se passe avec tellg() :je m'explique, je lis un fichier ligne à ligne dont vo Pb de gestion de fichier avec fstream [ par Bub325 ] Salut,J'ai deux problème distinct avec fstream, Le premier est que lorsque j'arrive à la fin d'un fichier, je ne peut plus revenir plus haut dans ce d lire un fichier [ par Toobad ] J'utilise GetFileSize pour me renvoyer la taille du fichier précédemment ouvert et ensuite j'appelle ReadFile en lui passant la valeur DWORD comme nbr


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,499 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales