Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > .NET для новичков > Как определить открыт ли файл, если да то чем... |
Автор: RUVATA 14.1.2011, 19:24 | ||
Всем доброго времени суток... Проблема казалось бы банальная... Программе необходимо поработать с некоторым файлом, а он не всегда может быть доступен, т.е. он может быть занят, открыт другим приложением, или даже приложением другого пользователя (если файл доступен по сети)... С этим в принципе можно разобраться, с помощью обработки исключений при инициализации экземпляра класса FileStream, пытаясь получить исключительную привилегию
Как-то так... Но вот как узнать каким... я уже и не говорю про "разблокировать"... хотя бы узнать каким... Я уже 2 дня рыскаю в поисках ответа, и все в конце концов сводится к использованию API из "ntdll.dll", там "танцы с бубнами" чуть-ли не на accемблере надо выкручивать... опросчик открытых в системе файлов на 1000 строк кода... Sad Неужели все так плохо ? И в NetFramework нет ничего подходящего для получения подобного результата, Ну не там, так через WMI как-нь-ть ?... Need help! Суть: Узнать/получить Handle известного открытого файла, определить какие процессы его юзают. |
Автор: jonie 14.1.2011, 19:43 |
RUVATA, вам надо гуглить про NtQuerySystemInformation функцию из ntdll.dll а также про NtQueryInformationThread, NtQueryInformationProcess, NtQueryDirectoryObject .... вот тут инфа имеется: http://undocumented.ntinternals.net/ http://wj32.wordpress.com/2009/04/25/ntquerysysteminformation-a-simple-way-to-bypass-rootkits-which-hide-processes-by-hooking/ а вот нашел кой че готовое: http://www.codeproject.com/KB/shell/OpenedFileFinder.aspx http://forum.sysinternals.com/topic18892.html но вероятно придется допиливать. |
Автор: RUVATA 15.1.2011, 16:04 |
Да, спасибо, но я же и говорю что все приводит у "танцам с бубнами" вокруг ntdll.dll Конечно хочется понять суть... но проблема похоже совсем не тривиальная хотя и банальна на первый взгляд, Потому я пошел другим путем, есть такая утилита от Windows SysInternals - Handle С ее помощью как раз получается то что надь... но только на платформах WinNT Windows Vista и Windows 7 ей уже не поддаются, потому вопрос по прежнему открыт, так как мое детище и на 7-ке работать должно. |
Автор: jonie 16.1.2011, 14:48 |
unlocker теперь поддерживает коммандную строку. Пробуйте его ковырять, или ковыряйте ntdll.dll .... |
Автор: RUVATA 20.1.2011, 10:55 |
А ларчик-то очень просто открывался... Вопрос поднимался на нескольких форумах посвященных программированию и администрированию, и никто ни где так и не дал правильного ответа на вопрос "Как определить Используется ли вот этот файл, и если да, то кем?" а вот вам и ответ... и не надо блукать вокруг Windows API, копировать Handles, и иными способами извращаться... так как Microsoft предусмотрительно начиная с версии NT, в составе системных утилит предоставляет нам openfiles.exe которая банально уже из самого названия понятно, предназначена для предоставления информации об OPENFILES http://s2.ipicture.ru/ Данная утилита определяет привилегии запустившего ее пользователя, достаточные или нет для получения такой информации. и по запросу с аргументом \Query (по умолчанию, можно аргумент опустить) выдает нам все что мы так жаждали увидеть. В изначальном состоянии данная утилита находится в режиме отображения информации исключительно об открытых по сети файлов... но изменив значения флага \Local отвечающего за "построение списка объектов" ... http://s2.ipicture.ru/ ... и изменить его используя аргумент /Local on параметры вступят в силу после перезагрузки системы... вуаля! ... обращаемся к openfiles.exe.. и с ее StandartOutput снимаем таблицу следующего содержания http://s2.ipicture.ru/ |