![]() |
![]() |
Как получить список открытых файлов в 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.
Зайцев Юрий Владимирович.
