![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
RUVATA |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 24.8.2010 Репутация: нет Всего: нет |
Всем доброго времени суток...
Проблема казалось бы банальная... Программе необходимо поработать с некоторым файлом, а он не всегда может быть доступен, т.е. он может быть занят, открыт другим приложением, или даже приложением другого пользователя (если файл доступен по сети)... С этим в принципе можно разобраться, с помощью обработки исключений при инициализации экземпляра класса FileStream, пытаясь получить исключительную привилегию
Как-то так... Но вот как узнать каким... я уже и не говорю про "разблокировать"... хотя бы узнать каким... Я уже 2 дня рыскаю в поисках ответа, и все в конце концов сводится к использованию API из "ntdll.dll", там "танцы с бубнами" чуть-ли не на accемблере надо выкручивать... опросчик открытых в системе файлов на 1000 строк кода... Sad Неужели все так плохо ? И в NetFramework нет ничего подходящего для получения подобного результата, Ну не там, так через WMI как-нь-ть ?... Need help! Суть: Узнать/получить Handle известного открытого файла, определить какие процессы его юзают. |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
RUVATA, вам надо гуглить про NtQuerySystemInformation функцию из ntdll.dll а также про NtQueryInformationThread, NtQueryInformationProcess, NtQueryDirectoryObject ....
вот тут инфа имеется: http://undocumented.ntinternals.net/ http://wj32.wordpress.com/2009/04/25/ntque...ses-by-hooking/ а вот нашел кой че готовое: http://www.codeproject.com/KB/shell/OpenedFileFinder.aspx http://forum.sysinternals.com/topic18892.html но вероятно придется допиливать. -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
RUVATA |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 24.8.2010 Репутация: нет Всего: нет |
Да, спасибо, но я же и говорю что все приводит у "танцам с бубнами" вокруг ntdll.dll
Конечно хочется понять суть... но проблема похоже совсем не тривиальная хотя и банальна на первый взгляд, Потому я пошел другим путем, есть такая утилита от Windows SysInternals - Handle С ее помощью как раз получается то что надь... но только на платформах WinNT Windows Vista и Windows 7 ей уже не поддаются, потому вопрос по прежнему открыт, так как мое детище и на 7-ке работать должно. |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
unlocker теперь поддерживает коммандную строку. Пробуйте его ковырять, или ковыряйте ntdll.dll ....
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
RUVATA |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 68 Регистрация: 24.8.2010 Репутация: нет Всего: нет |
А ларчик-то очень просто открывался...
Вопрос поднимался на нескольких форумах посвященных программированию и администрированию, и никто ни где так и не дал правильного ответа на вопрос "Как определить Используется ли вот этот файл, и если да, то кем?" а вот вам и ответ... и не надо блукать вокруг Windows API, копировать Handles, и иными способами извращаться... так как Microsoft предусмотрительно начиная с версии NT, в составе системных утилит предоставляет нам openfiles.exe которая банально уже из самого названия понятно, предназначена для предоставления информации об OPENFILES ![]() Данная утилита определяет привилегии запустившего ее пользователя, достаточные или нет для получения такой информации. и по запросу с аргументом \Query (по умолчанию, можно аргумент опустить) выдает нам все что мы так жаждали увидеть. В изначальном состоянии данная утилита находится в режиме отображения информации исключительно об открытых по сети файлов... но изменив значения флага \Local отвечающего за "построение списка объектов" ... ![]() ... и изменить его используя аргумент /Local on параметры вступят в силу после перезагрузки системы... вуаля! ... обращаемся к openfiles.exe.. и с ее StandartOutput снимаем таблицу следующего содержания ![]() Это сообщение отредактировал(а) RUVATA - 21.1.2011, 12:11 |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | .NET для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |