Protection d'un fichier

Résolu
mammnon Messages postés 12 Date d'inscription dimanche 7 mars 2004 Statut Membre Dernière intervention 11 septembre 2008 - 9 nov. 2005 à 10:14
mammnon Messages postés 12 Date d'inscription dimanche 7 mars 2004 Statut Membre 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@

8 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 nov. 2005 à 13:01
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++
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 nov. 2005 à 10:38
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++
0
mammnon Messages postés 12 Date d'inscription dimanche 7 mars 2004 Statut Membre Dernière intervention 11 septembre 2008
9 nov. 2005 à 11:04
LOL, j'ai pas pensé à verifier que mon handle est bon...je verifie et je tiens au courant

thomas
0
mammnon Messages postés 12 Date d'inscription dimanche 7 mars 2004 Statut Membre Dernière intervention 11 septembre 2008
9 nov. 2005 à 11:10
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@
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 nov. 2005 à 11:38
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++
0
mammnon Messages postés 12 Date d'inscription dimanche 7 mars 2004 Statut Membre Dernière intervention 11 septembre 2008
9 nov. 2005 à 11:51
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@
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 nov. 2005 à 12:06
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++
0
mammnon Messages postés 12 Date d'inscription dimanche 7 mars 2004 Statut Membre Dernière intervention 11 septembre 2008
14 nov. 2005 à 14:40
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
0
Rejoignez-nous