6
votes

Comment ouvrir un répertoire avec Createefile en C # pour examiner les entrées supprimées?

Comment ouvrir un répertoire avec Createefile en C # pour examiner les entrées de fichiers supprimés? Ou est-ce maintenant impossible? Je me souviens du retour lorsque vous pouvez ouvrir un répertoire sur une partition NTFS à l'aide de Createefile ou éventuellement CreatefileEx, mais qui utilisait C ++ sous un système d'exploitation plus ancien.

jusqu'à présent, j'ai les appels d'API Windows (à Kernel32.dll) assez de travail pour lire un fichier existant, mais il n'ouvrira pas un répertoire: xxx

modifier 1: modifié il pour utiliser open_existing, file_flag_backup_semantics et générique_read. < P> Ceci ouvrira et affichera le début du fichier texte spécifié, de même que l'original lorsqu'il est exécuté en tant qu'utilisateur administratif Vista, mais il ne parvient toujours pas à ouvrir le répertoire. Je suppose que j'ai besoin des privilèges Se_backup_name et Se_Restore_Name, mais je ne sais pas comment spécifier les autres que d'écrire cela en tant que service qui fonctionne en tant que machine locale (quelque chose que je n'ai que l'idée de brouillaison de comment faire). < / p>


2 commentaires

Notez que ce ne sont pas des appels de noyau en soi, ce sont des appels de mode utilisateur normal (vous ne pouvez pas appeler au noyau à partir du mode utilisateur).


Ce sont des appels à l'aide de Kernel32.dll de Microsoft à l'aide de la fonctionnalité API Windows RAW.


3 Réponses :


2
votes

Je ne suis pas sûr de ce que vous entendez en examinant les répertoires supprimés, mais vous devriez pouvoir obtenir une poignée à un répertoire en passant le drapeau file_flag_backup_semantics dans Createefile < em> et en veillant à spécifier open_existing pour la disposition de création. De Article MSDN sur Createefile :

ouvrir un répertoire à l'aide de Creeefile, Spécifiez le FILE_FLAG_BACKUP_SEMANTICS Drapeau dans le cadre de Dwflagsandattributes. Vérifications de sécurité appropriées encore Appliquer quand ce drapeau est utilisé sans Se_backup_name et SE_RESTORE_NAME Privilèges.

On dirait que vous avez déjà essayé de cela, mais l'a commentée? Si cela ne fonctionne pas pour vous, vous voudrez peut-être vous assurer qu'elles utilisent l'utilisateur que vous utilisez, comme cela a la permission d'accéder au répertoire en question.


1 commentaires

J'ai fait environ 7 ou 8 tests différents et avons commenté des pièces lorsque je ne les utilisais pas, je n'aurais donc pas besoin de recommencer si j'ai appris que j'étais partiellement correct plus tôt.



7
votes

afaik, c'est un processus assez impliqué. Vous ne pouvez pas simplement utiliser Createfile et énumérer les «fichiers supprimés». Vous devez charger la table des fichiers principaux du lecteur et énumérer que les fichiers marqués supprimés, puis essayez de charger les données de la position de disque répertoriée dans le MFT. Cela nécessiterait beaucoup de codes invoqués de la plate-forme et probablement quelques redéfinitions de structures de données natives en C #.

La réponse courte à votre question est la suivante: xxx

Vous utilisez Créer un fichier pour ouvrir le disque lui-même.

Voici un très bon article sur l'ensemble du processus sur le projet de code . mais, tout est en C ++. Le code est là, et il semble que vous sachiez p \ invoquer, alors le portant ne devrait pas être un problème.

EDIT:

Le fait que le lecteur est externe ne devrait pas le rendre plus difficile, vous pouvez toujours ouvrir le disque de la même manière que j'ai montré (peut-être utiliser un WMI Tool Pour rechercher le chemin une fois que le lecteur est connecté). Ensuite, vous pouvez utiliser les informations sur le page wikipedia pour FAT32 pour définir les structures de données que vous pouvez Lisez le MFT et d'autres pièces du système de fichiers. Une fois que vous y êtes arrivé, vous venez d'itérer les définitions de fichier 32 octets de la table de répertoires en regardant le premier octet pour: xxx


3 commentaires

Je suis en fait plus familier avec C ++ que c # donc je vais probablement utiliser Visual C ++. Je travaille avec C # pour apprendre la langue.


La partie difficile est que les fichiers perdus sont sur un disque dur externe FAT32.


Sauf si c'est un projet éducatif, si vous essayez simplement de "non sélectionner" certains fichiers d'un système de fichiers gras, vous êtes probablement mieux à la recherche d'un outil existant capable de vous en occuper ...



1
votes

Juste pour lancer une autre approche à vous, au cas où il est pertinent, vous pouvez toujours regarder le répertoire avec un FileSystemwatcher et attrapez l'événement supprimé . Bien sûr, vous devrez le regarder au moment de la suppression, mais il peut s'agir d'une solution beaucoup plus facile, puis d'essayer de le récupérer (si c'est une option).


1 commentaires

L'ancienne sauvegarde a été effectivement supprimée il y a plusieurs années. Merci pour l'idée cependant.