Protection d'un fichier [Résolu]

mammnon
Messages postés
12
Date d'inscription
dimanche 7 mars 2004
Dernière intervention
11 septembre 2008
- 9 nov. 2005 à 10:14 - Dernière réponse : mammnon
Messages postés
12
Date d'inscription
dimanche 7 mars 2004
Dernière intervention
11 septembre 2008
- 14 nov. 2005 à 14:40
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@
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
- 10 nov. 2005 à 13:01
3
Merci
As-tu essayé de mettre un DACL pour restreindre l'accès ?
Regarde ici si ça peut t'aider:
http://www.msdn.microsoft.com/library/en-us/secbp/security/creating_a_dacl.asp

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++

Merci BruNews 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Commenter la réponse de BruNews
BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
- 9 nov. 2005 à 10:38
0
Merci
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...
http://dev.winsysdev.com
BruNews, MVP VC++
Commenter la réponse de BruNews
mammnon
Messages postés
12
Date d'inscription
dimanche 7 mars 2004
Dernière intervention
11 septembre 2008
- 9 nov. 2005 à 11:04
0
Merci
LOL, j'ai pas pensé à verifier que mon handle est bon...je verifie et je tiens au courant

thomas
Commenter la réponse de mammnon
mammnon
Messages postés
12
Date d'inscription
dimanche 7 mars 2004
Dernière intervention
11 septembre 2008
- 9 nov. 2005 à 11:10
0
Merci
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@
Commenter la réponse de mammnon
BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
- 9 nov. 2005 à 11:38
0
Merci
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...
http://dev.winsysdev.com
BruNews, MVP VC++
Commenter la réponse de BruNews
mammnon
Messages postés
12
Date d'inscription
dimanche 7 mars 2004
Dernière intervention
11 septembre 2008
- 9 nov. 2005 à 11:51
0
Merci
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@
Commenter la réponse de mammnon
BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
- 9 nov. 2005 à 12:06
0
Merci
désolé c'était 'local system' ou 'local service'.

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

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Commenter la réponse de BruNews
mammnon
Messages postés
12
Date d'inscription
dimanche 7 mars 2004
Dernière intervention
11 septembre 2008
- 14 nov. 2005 à 14:40
0
Merci
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
Commenter la réponse de mammnon

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.