4848
Как получить список открытых файлов в 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.

Зайцев Юрий Владимирович.

 
 
Hosted by uCoz