Как получить список открытых файлов в NetWare другими пользователями |
Бывает необходимо определить, кто блокировал или открыл файлы на сервере. В больших организациях с большим количеством пользователей приходится долго выяснять, кто же захватил файл, если вы сам администратор вашей сети то проблем нет. В других случаях можно попросить администратора сети посмотреть с помощью утилиты RCONSOLE.EXE. Но это уже не так оперативно.
Допустим, необходимо произвести индексацию ваших таблиц или создать резервную копию базы, следовательно, необходим временный эксклюзивный доступ к данным. Обычным решением проблемы, служит небольшая таблица, допустим со следующей структурой.
USERID n(4), USERNAME c(20), LOCK n(1)
При открытии таблиц на сервере, с каждой станции, заноситься флаг LOCK
при закрытии таблиц флаг снимается. Этот способ вполне прост и заслуживает применения. Но полной гарантии этот способ не дает. Представим себе, ваше приложение открыло таблицы, занесло необходимый флаг в поле LOCK, и любимый кому и нелюбимый WINDOWS вдруг завис. Пользователь нажимает CTRL+ALT+DEL
или просто RESET, и больше не входит в приложение а идет в буфет. Ко всем проблемам представим, что он вообще находится на другом этаже или в другом здании.
Наш хваленый и простой способ начинает сбоить. Приложение кричит, данный пользователь блокировал базы, а он уже давно не у дел и базы давно не блокированы, поскольку даже компьютер он отключил.
Используя библиотеку GPLIB, можно гарантировано определить, кто открыл файлы и какие. Разумеется, данный метод немного сложнее метода с таблицей и полем LOCK.
Вот простой пример получения открытых файлов на сервере
Остается только написать маленькую функцию, которая будет находить файлы именно от вашего приложения.
&&&& GPLIB для FPD VFP5/6 && Юрий Зайцев && Получение списка пользователей && и захаваченных ими файлов на файл сервере NetWare && Set library to gplib Private i Create table fileopen (username c(50),; ServerName c(20), PathFile c(254),AccessMod c(100),taskn n(4,2)) mServerName = N_DefServr() && Получим имя сервера по умолчанию ! * && Поднимем количество соединений на текущий момент * nNumConnectNetWare = N_MaxConns(.t.) * данная функция может обломить * если пользователи отключались от сервера * то номер соединения последнего будет допустим 100 * а поднимем мы допустим 3 и тогда мы ничего не узнаем * о пользователе с номером 100 && Поднимем возможное количество соединений на данном сервере nNumConnectNetWare = N_MaxConns(.f.) For i = 1 to nNumConnectNetWare * По номеру соединения получить информацию =GetFileNameN(i, mServerName) Endfor Browse use Return Function GetFileNameN Parameter nConnNum, mServerName Private mFiles, n, nCount * Получить открытые пользователем файлы nCount=N_ConnOpen('mFiles', nConnNum, mServerName) * Получить имя пользователя по номеру соединения m.username = N_UserID(nConnNum) m.ServerName = mServerName If nCount <> 0 For n=1 to nCount m.PathFile = mFiles[n,1] m.taskn = mFiles[n,2] m.AccessMod = iif(BitOn(mFiles[n,3],0),"READ ","")+; iif(BitOn(mFiles[n,3],1),"WRITE ","")+; iif(BitOn(mFiles[n,3],2),"DENY READ ","")+; iif(BitOn(mFiles[n,3],3),"DENY WRITE ","")+; iif(BitOn(mFiles[n,3],4),"DETACHED ","")+; iif(BitOn(mFiles[n,3],5),"TTS HOLDING DETACH ","")+; iif(BitOn(mFiles[n,3],6),"TTS HOLDING OPEN","") Insert into fileopen from memvar Endfor Endif Return
Используемая библиотека GPLIB MHSOFTWARE http://www.mhsoftware.com/gplib.htm
Библиотеку можно получить http://www.mhsoftware.com/bin/gp30.exe
Она имеет статус TRIAL.
Зайцев Юрий Владимирович.