PDA

View Full Version : Users Help



StudsSW
06-24-2011, 08:06 AM
Hello everyone, first of all forgive me for any mistake or term that don't make sence. I'm from Brazil, so my english may not be so good.

I have a file (that don't belong to any office program, let's say it's a TXT or anything). This file is on a network address, on a server, let's also say that the scenario is this:

\\ COMPUTER_01 \ FOLDER_21 \ TARGET_FILE.TXT

So, i want to do 2 things, the first one is get a list of users acessing the file, like my user is SSMiranda, at "COMPUTER_02", and i've opened this file on my excel via VBA (Open filename for Binary As #1). So when the list of users appear, the user "SSMiranda" must be one of then (that i can do since the GetUserNetworkA API tell's me what user is logged on my machine, but i wanna know ALL users that opened the file (and are still acessing it).

The second thing is to find a way to order this user to close it!!

Please help.

PS: Off course it's not a TXT.

Kenneth Hobs
06-24-2011, 08:34 AM
Welcome to the forum! For the first, see the code below.

For the second, depends on your authority and methods of communication. A phone call is one of the best tools. If you have a network instant chat program, that might be one method. Of course an email could be used but some people ignore emails and they are not always reliable.

In a Module:
'===========================================
'http://www.xcelfiles.com/IsFileOpenAPI.htm
'===========================================

'// Note we use an Alias here as using the Actual
'// function name will not be accepted! ie underscore= "_lopen"


Public myDir As String
Public StartLine As Long
Public HowManyLines As Long
Public MyFile
Public i
Public adate
Public ws
Public ActWork
Public NewWrkBk


Private Declare Function lOpen _
Lib "kernel32" _
Alias "_lopen" ( _
ByVal lpPathName As String, _
ByVal iReadWrite As Long) _
As Long


Private Declare Function lClose _
Lib "kernel32" _
Alias "_lclose" ( _
ByVal hFile As Long) _
As Long


'// Don't use these...here for Info only
Private Const OF_SHARE_COMPAT = &H0
Private Const OF_SHARE_DENY_NONE = &H40
Private Const OF_SHARE_DENY_READ = &H30
Private Const OF_SHARE_DENY_WRITE = &H20
'// Use the Constant below
'// OF_SHARE_EXCLUSIVE = &H10
'// OPENS the FILE in EXCLUSIVE mode,
'// denying other processes AND the current process both read and write
'// access to the file. If the file has been opened in any other mode for read or
'// write access _lopen fails. This is important as if you open the file in the
'// current process = Excel BUT loose its handle
'// then you CANNOT open it again in the SAME session!
Private Const OF_SHARE_EXCLUSIVE = &H10


'If the Function succeeds, the return value is a File handle.
'If the Function fails, the return value is HFILE_ERROR = -1
Function IsFileAlreadyOpen(strFullPath_FileName As String) As Boolean
'// Ivan F Moala
'// http://www.xcelfiles.com
Dim hdlFile As Long
Dim lastErr As Long

hdlFile = -1

'// Open file for Read/Write and Exclusive Sharing.
hdlFile = lOpen(strFullPath_FileName, OF_SHARE_EXCLUSIVE)
'// If we can't open the file, get the last error.
If hdlFile = -1 Then
lastErr = Err.LastDllError
Else
'// Make sure we close the file on success!
lClose (hdlFile)
End If

'// Check for sharing violation error.
IsFileAlreadyOpen = (hdlFile = -1) And (lastErr = 32)

End Function


Function LastUser(strPath As String) As String
'// Code by Helen from http://www.visualbasicforum.com/index.php?s=
'// This routine gets the Username of the File In Use
'// Credit goes to Helen for code & Mark for the idea
'// Insomniac for xl97 inStrRev
'// Amendment 25th June 2004 by IFM
'// : Name changes will show old setting
'// : you need to get the Len of the Name stored just before
'// : the double Padded Nullstrings
Dim strXl As String
Dim strFlag1 As String, strflag2 As String
Dim i As Integer, j As Integer
Dim hdlFile As Long
Dim lNameLen As Byte


strFlag1 = Chr(0) & Chr(0)
strflag2 = Chr(32) & Chr(32)

hdlFile = FreeFile
Open strPath For Binary As #hdlFile
strXl = Space(LOF(hdlFile))
Get 1, , strXl
Close #hdlFile

j = InStr(1, strXl, strflag2)

#If Not VBA6 Then
'// Xl97
For i = j - 1 To 1 Step -1
If Mid(strXl, i, 1) = Chr(0) Then Exit For
Next
i = i + 1
#Else
'// Xl2000+
i = InStrRev(strXl, strFlag1, j) + Len(strFlag1)
#End If

'// IFM
lNameLen = Asc(Mid(strXl, i - 3, 1))
LastUser = Mid(strXl, i, lNameLen)
End Function

StudsSW
06-24-2011, 08:57 AM
OK Kenneth, thank you for the reply, but this functions i already know, and there's a problem on it. Maybe you can tell me how to fix.

The "LastUser" function work's only if the file that i target is a Excel (Office) file, but it's not.
The file that i target is a binary file (like bin or dat).

Kenneth Hobs
06-24-2011, 09:07 AM
If you have the authority, try a program like WhoLockMe.

StudsSW
06-27-2011, 09:52 AM
Thanks again for the hint, and i'll try to find this "WhoLockMe" program. The point is to try to interact it with Excel (is that possible?) - maybe via ShellExecuteA or SendKey ... i don't know.

I'll try it, and keep searching on the net about this issue, because if there is a program capable to do it... it is possible to write one...