?
Solved

How To: Tell which users are running an EXE file

Posted on 2003-03-25
31
Medium Priority
?
503 Views
Last Modified: 2012-06-21
Have you ever tried to replace an .EXE file but couldn't because
another user was currently running the program?

The network is NT4, but the EXE files are located on a Netware Server.

From a VB function, how can I tell who is using another program?  
0
Comment
Question by:CareyJ
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 8
  • 7
  • 7
  • +4
31 Comments
 
LVL 17

Accepted Solution

by:
inthedark earned 640 total points
ID: 8208529
On a Netware server you can see which users have a specific file open using the Netware system monitor.

Having spent many hours running up and down stairs trying to get all users out of an application.  Just when you thought everybody was out somebody comes back from lunch and you are right back where you started, running up and down stairs. So I know where you are comming from, been there got the T-shirt!

But there is a realy simple way to solve this problem.

Step 1

You create a very simple exe, which no forms, just a simgle module with a Sub Main() which just opens a file and reads the name to the current exe to use.

Sub Main()
Dim lfn as Long
dim sCurrentEXE() as string
dim sFileData as string
lfn=FreeFile
Open App.Path+"\Current.txt" for input shared as #lfn
sFileData=Input(#lfn,Lof(lfn))
close lfn
' remove any crlf
sCurrentEXE = Split(sFileData, vbCrLf)
lfn = Shell(App.Path+"\" + sCurrentEXE(0)
End Sub

So you make all of the user's shorcuts point to your startup exe.  Example:

MyApp.EXE

Each time you compile your main application you give it a new name like MyAppV01.EXE, then next time MyAppV02.EXE.  After you have tested the new version you just change the file Current.txt to read:

MyAppV02.EXE


Step 2

You don't need to do this step but it also gives you total power over your app running on a Netware/NT/Win2K server.
Place a timer control in your app which firs every 30 seconds. The timer checks that the time past since the last check exceeds say 2 minutes.  The timer then sees if a file exists:

If Len(Dir(App.Path + "\Message.txt"))> ) then
   If ReportsRunning <1 Then
      InitaiteCloseDown
   End If
End if

If there are no reports running you open the message file, whcih says things like: "System shutting in 3 minutes for a system backup"  or "Software update being loaded."

After the InitaiteCloseDown has displayed the message the system starts counting down for 3 minutes and then hits an End statement. As the countdown processds you can change the main form caption to show a countdown say from 180 each second that passes like Me.Caption = "System Closing in "+cstr(x)+" seconds"

Warning when you display the closedown message don't use a message box, which will stop your countdown, you need to load a form with the message in a label caption.

Hope this helps, best of luck:~)





0
 
LVL 17

Expert Comment

by:inthedark
ID: 8208551
PS The startup exe should also check that the message.txt file does not exists and only startup the current exe if there is no message to display.  If it finds a message file you simply display the message

MsgBox message,vbExclamation "System Close"
End

0
 
LVL 17

Expert Comment

by:inthedark
ID: 8208555
This solution also works well if you are remotly supporting you clients, as I do either using radmin via the internet or by PcAnywhere.  You can just blat your new version onto the system with no more pain.

Been there! Done that! Ain't goin back!
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 17

Expert Comment

by:inthedark
ID: 8208586
Another tip is to create a timer which autocloses the application say at 10:00pm after all users have gone home, before a backup starts. In case sombody left there pc switch on but still running you app.

Also another tip:

When your app starts up it trys to open a signal file for exclusive non shared access.  If it gains access you are the only user of the system you then clear a files from a current users folder.  And reopen the sginal file for shared access.  You then save the current logged in user login name to a file in the current users folder example  "s:\Users\Nick.txt", "s:\Users\Jim.txt" when the main form unloads you delete (Kill) the user's file ans also close the signal file.

In this way you can see who is on the system ans also operations like a month end update can know if they are the only user, and create a message file to stop any new users running the application.
0
 
LVL 3

Expert Comment

by:Jonyv
ID: 8208732
The "NetFileEnum" API function can be used to get this information, BUT this requires that you are a member of the Administrators or Account Operators local group. If you are just a regular user you are out of luck.

One way to solve this problem (if you get along well with your network administrator...) is to implement a Windows NT service that runs on the administrators account and then have the service communicate with a VB client via a pipe or something similar. I experimented with such a solution a while ago, but the need for it disappeared before it was finished...  :-)
0
 
LVL 1

Expert Comment

by:wheelibin
ID: 8209192
What I do is create a little program that the users run which copies the exe from the server into a local directory on the clients PC.  That way you can happily replace the exe on the server and just tell the users to restart the app.

I have this program running ALL our in house apps, I just pass the name of the exe as a command line parameter and then it copies it to the local drive and runs it.

I know this doesn't specifically answer what you asked but i hope it helps.
0
 
LVL 9

Expert Comment

by:rawinnlnx9
ID: 8212942
You have a couple of problems to deal with here.

1. You need to get existing users out of the application, hopefully gracefully.

2. You need to prevent new users from launching the application.

RESOLUTION:
   You need two files to make this arrangement work. The first file is your executable. The second is a file I name permissions.cfg.  

========================================================
' IMPLEMENTATION:
   At runtime both files need to be on the server it is not required they be in the same directory. To allow program execution leave permissions.cfg wherever it is. To halt program execution and to prevent further access delete permissions.cfg.
========================================================

   In your executable you have either Sub Main() or a Form_Load() that signals the beginning of your application.  In whichever routine you use call a function named AllowExecute. In your call give the location of the permissions.cfg file as the argument. (Function Below)

I.E. AllowExecute("\\ntserver\public\exe\MyApp\Permissions\permissions.cfg")

If AllowExecute is False display a message box to the user that says:

 MsgBox("This application is being modified by the Administrator and is currently not available.")

Then close gracefully.

This will deal with problem 2.

To deal with problem 1 you need to timers on a form. I will call them tmrPermissions and tmrCloseGracefully.
tmrPermissions needs to have an interval of 30000 or 30 seconds. tmrPermissions calls AllowExecute. If AllowExecute returns true then tmrPermissions does nothing and keeps running. If AllowExecute returns false then tmrPermissions has a message box that states:

MsgBox("This program will be closed in 10 minutes for server administration please save your work and exit.")

tmrPermissions then set tmrCloseGracefully to 10 minutes and enables it then shuts itself off. tmrCloseGracefully does nothing for 10 minutes. If at the end of 10 minutes it is still up it calls a routine that saves all work and closes down.

Now you may replace the executable.

Here is the code I would use:

'------------------------------------------------------>

Private Sub Form_Load()

    If AllowExecute = False Then
        MsgBox("("This application is being modified by the Administrator and is currently not available.")
        CloseGracefully
    End If

    tmrPermissions.Interval = 30000
    tmrPermissions.Enabled = True

End Sub

'------------------------------------------------------>

Private Function AllowExecute(ByVal CFG_PATH As String) As Boolean

   If Dir(CFG_PATH) <> "" Then
       AllowExecute = True
   Else
       AllowExecute = False
   End if

End Function

'------------------------------------------------------>

Public Sub CloseGracefully()

'Comments: This routine should save all work and application settings prior to ending session.

    '*-- You must define what needs to be done here.

End Sub

'------------------------------------------------------>

Private Sub tmrPermissions()
   
     If AllowExecute = False Then
         tmrPermissions.Enabled = False
         MsgBox("This program will be closed in 10 minutes for server administration please save your work and exit.")
         tmrCloseGracefully.Interval = 100000
         tmrCloseGracefully.Enabled = True
     End If

End Sub

'------------------------------------------------------>

Private Sub tmrCloseGracefully()

    'SafetyCheck
    If AllowExecute = False Then
        tmrCloseGracefully.Enabled = False
        CloseGracefully
    Else
        tmrCloseGracefully.Enabled = False
        tmrPermissions.Interval = 30000
        tmrPermissions.Enabled = True
    End If

Exit Sub
0
 
LVL 17

Expert Comment

by:inthedark
ID: 8216731
Hi rawinnlnx9, don't forget that you can't use message box as it will disable the timer.  So it you try to close the app after the user went to the dentist it will just keep running until somebody presses enter.
0
 
LVL 4

Author Comment

by:CareyJ
ID: 8219001
I believe all of you have encountered this "net app developer" problem because you are describing the problem better than I did in the Question.

All of my apps have user "User Logging".  The user log for this app is appended as each user runs the program.
Looking at the user log only shows me who has ran it today...not who is still in the program.  The app is started about 50 times an hour....some short visits, some long visits.

I also use a timer to check for the existence of a lock file.  I place a lock file in the App directory whenever I need users to exit the program.  Normally, after a minute passes, all users have exitted the program.  The lock file also stops other users at startup by showing the "Busy...try again later" form for 5 seconds then unloading the app.  This is innefective when a user is in the program, sitting at a dialog box or on some other form in the program.  

Jonyv suggested an API call.  That's the sort of answer I'm looking for.  I want to see who is in the program "right now".  Do any of you have examples of usage of "NetFileEnum"?
0
 
LVL 4

Author Comment

by:CareyJ
ID: 8219035
Oh, btw, InTheDark...I don't have access to the Netware server to run "System Monitor".  The server is at another site.  I have to send a request to network support at that site and wait for their answer.  By then, the current users list will have changed completely.

I am the Netware "file owner" and "folder owner".
0
 
LVL 3

Expert Comment

by:Jonyv
ID: 8220755
I made a quick "VB version" of NetFileEnum, BUT I'm not in a network environment at the moment so I haven't been able to test if it actually works  :-)

Anyway, if it works as it's supposed to the call to NetFileEnum will return an array of FILE_INFO_3 structures, the "pathname" and "username" members can be used to see what files are open by what users. The enumeration can be limited with the "BasePath" and "UserName" parameters to NetFileEnum.

And as mentioned before: This code must be run with administrators privileges to even have a remote chance of working...

Put the following code in a BAS module and just call NetFileEnum with the servername (like "\\servername"). Specify "VbNullString" for "BasePath" and "UserName" if you're not going to use them.

*begin code*

Private Declare Function NetApiBufferFree Lib "Netapi32.dll" (ByVal lpBuffer As Long) As Long

Private Declare Function Internal_NetFileEnum Lib "Netapi32.dll" Alias "NetFileEnum" (ByVal ServerName As String, _
                                                                                      ByVal BasePath As String, _
                                                                                      ByVal UserName As String, _
                                                                                      ByVal level As Long, _
                                                                                      ByRef BufPtr As Long, _
                                                                                      ByVal prefmaxlen As Long, _
                                                                                      ByRef entriesread As Long, _
                                                                                      ByRef TotalEntries As Long, _
                                                                                      ByRef resume_handle As Long _
                                                                                      ) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, _
                                                                    pSource As Any, _
                                                                    ByVal dwLength As Long)


' Converts a Unicode string to an ANSI string
Private Declare Function WideCharToMultiByte Lib "kernel32" _
                            (ByVal Codepage As Long, _
                            ByVal dwFlags As Long, _
                            lpWideCharStr As Any, _
                            ByVal cchWideChar As Long, _
                            lpMultiByteStr As Any, _
                            ByVal cchMultiByte As Long, _
                            ByVal lpDefaultChar As String, _
                            ByVal lpUsedDefaultChar As Long) As Long


Private Const ERROR_ACCESS_DENIED = 5&
Private Const ERROR_INVALID_LEVEL = 124&
Private Const ERROR_MORE_DATA = 234
Private Const ERROR_NOT_ENOUGH_MEMORY = 8
Private Const NERR_Success As Long = 0&
Private Const MAX_PREFERRED_LENGTH = &HFFFFFFFF
Private Const NERR_BufTooSmall = &H84B
Private Const CP_ACP = 0        ' ANSI code page

Private Type Internal_FILE_INFO_3   ' As declared in Lmshare.h
    fi3_id As Long
    fi3_permissions As Long
    fi3_num_locks As Long
    fi3_pathname As Long
    fi3_username As Long
End Type

Public Type FILE_INFO_3     ' VB version of the above structure
    fi3_id As Long
    fi3_permissions As Long
    fi3_num_locks As Long
    fi3_pathname As String
    fi3_username As String
End Type


' NetFileEnum "VB Style"
Public Function NetFileEnum(ServerName As String, BasePath As String, UserName As String) As FILE_INFO_3()

Dim Buffer() As Internal_FILE_INFO_3
Dim BufPtr As Long
Dim RetBuffer() As FILE_INFO_3
Dim NrOfEntries As Long
Dim TotalEntries As Long
Dim Status As Long
Dim i As Integer

' request level 3 information
Status = Internal_NetFileEnum(ServerName, BasePath, UserName, 3, BufPtr, MAX_PREFERRED_LENGTH, NrOfEntries, TotalEntries, ByVal CLng(0))

If Status <> NERR_Success Or NrOfEntries <= 0 Then Exit Function

ReDim Buffer(0 To NrOfEntries - 1)  ' Allocate temporary buffer
ReDim RetBuffer(0 To NrOfEntries - 1)   ' Allocate return value array

CopyMemory Buffer(0), ByVal BufPtr, NrOfEntries * Len(Buffer(0))  ' Copy enumerated data into temporary buffer

For i = 0 To UBound(Buffer)     ' Copy and convert temporary buffer into array of FILE_INFO_3
    With RetBuffer(i)
        .fi3_id = Buffer(i).fi3_id
        .fi3_num_locks = Buffer(i).fi3_num_locks
        .fi3_permissions = Buffer(i).fi3_permissions
        .fi3_pathname = GetStrFromPtrW(Buffer(i).fi3_pathname)
        .fi3_username = GetStrFromPtrW(Buffer(i).fi3_username)
    End With
Next i

NetApiBufferFree BufPtr     'Free buffer returned from NetFileEnum

NetFileEnum = RetBuffer

End Function

' Returns an ANSI string from a pointer to a Unicode string.

Private Function GetStrFromPtrW(lpszW As Long) As String
  Dim sRtn As String

  sRtn = String$(lstrlenW(ByVal lpszW) * 2, 0)   ' 2 bytes/char

' WideCharToMultiByte also returns Unicode string length
'  sRtn = String$(WideCharToMultiByte(CP_ACP, 0, ByVal lpszW, -1, 0, 0, 0, 0), 0)

  Call WideCharToMultiByte(CP_ACP, 0, ByVal lpszW, -1, ByVal sRtn, Len(sRtn), 0, 0)
  GetStrFromPtrW = GetStrFromBufferA(sRtn)

End Function

' Returns the string before first null char encountered (if any) from an ANSII string.

Private Function GetStrFromBufferA(sz As String) As String
  If InStr(sz, vbNullChar) Then
    GetStrFromBufferA = Left$(sz, InStr(sz, vbNullChar) - 1)
  Else
    ' If sz had no null char, the Left$ function
    ' above would return a zero length string ("").
    GetStrFromBufferA = sz
  End If
End Function


0
 
LVL 3

Expert Comment

by:Jonyv
ID: 8220791
Oops, just noticed that I missed a declaration in the code above...

Add this at the beginnig of the module:
Private Declare Function lstrlenW Lib "kernel32" (lpString As Any) As Long
0
 
LVL 4

Author Comment

by:CareyJ
ID: 8221349
Not in a development environment?  Me neither.  I'm on vacation until 3/31.  I can try it then.  Can you try it before then?
0
 
LVL 17

Expert Comment

by:inthedark
ID: 8223808
You can load rconsole on the server to be able to see it remotely.

Just a thought, If your company is into Netware then you should download the VB netware controls from their site.  These are free.  There are hoards of things you can do with them.  You just add the control you need to your form and away you go.

But the simple way is to load a starter exe, if compiled to pcode its only about 10k and so the user does not see any time delay.
0
 
LVL 3

Expert Comment

by:Jonyv
ID: 8223895
I managed to test it in a very small scale on my local computer. You need to make a small change to the code above, in NetFileEnum, change:

' request level 3 information
Status = Internal_NetFileEnum(ServerName, BasePath, UserName, 3, BufPtr, MAX_PREFERRED_LENGTH, NrOfEntries, TotalEntries, ByVal CLng(0))

If Status <> NERR_Success Or NrOfEntries <= 0 Then Exit Function

To:

BufPtr = 0
' request level 3 information
Status = Internal_NetFileEnum(StrConv(ServerName, vbUnicode), StrConv(BasePath, vbUnicode), StrConv(UserName, vbUnicode), 3, BufPtr, MAX_PREFERRED_LENGTH, NrOfEntries, TotalEntries, ByVal CLng(0))

If Status <> NERR_Success Or NrOfEntries <= 0 Then
    If BufPtr <> 0 Then NetApiBufferFree BufPtr
    Exit Function
End If

Now it should work fine  :-)
0
 
LVL 9

Expert Comment

by:rawinnlnx9
ID: 8231242
InTheDark,

    Yes you are right. I forgot that problem and I forgot to mention I use a form based message box. I also forgot to include the CFG_PATH in my call to AllowExecute.

'= New Comment

I have noticed that many people are going for highly technical API based solutions. I have tried all of them and unless you have Admin rights on the server they are very difficult if not impossible to pull off. My advice we be to implement a very simple but effective solution and then get on with your actual system programming. Problems like the one you describe can consume enormous resources when the fix (any fix, simpler the better) is actually a trivial solution. Try not to go for the coolest fanciest fix out there. Just get something that works and move on. You can always revisit the problem later. I am sure your boss would agree with me on this too.

Just pick an easy solution that has a simple ZERO dependency implementation. Do not rely on API's not rely on Admin rights do not rely on anything but what you can do in the IDE with no declares, references or hooks. I would just get something up and working. You can slay dragons later. :)

Just my two cents. But I have burned days on stuff like this only to learn that I could not see the forest there were too many trees.

Good Luck and See Ya,

Rex
0
 
LVL 4

Author Comment

by:CareyJ
ID: 8269957
JonYV:
I think I'm having trouble with the functions paramters.
Please show me how I would call the function to find all users currently running a program as described below:

Server Name  : "MyServer"
App Path/Name: "P:\NetApps\MyProgram\MyProgram.exe"
User Name    : "CareyJ"


Rex:  
I agree with everything that you say.  My apps have simple
fixes...user logging, triggering to cause user exit, and some have inactivity time-out exit routines.

It's just that "sometimes" when I try to update an app, I run into this problem.  Usually the app is sitting at a dialog so the fixes can't work and I can't easily determine who is holding the program open.

I'm not dedicating a lot of time to developing this (that's why I asked this question here - so if someone else had already done it, I wouldn't have to do it also)
Unfortunately, I can't even afford to put a lot of time into testing JonYV's suggestion.  I really need a solution that works straight off of the screen.  It sounds like you work like I do.  I don't have time to slay dragons either. :)

Thanks for adding your comment because other visitors here who view this PAQ later need to learn early to approach these situations without dependency where possible.  



0
 
LVL 3

Expert Comment

by:Jonyv
ID: 8270370
I would do something like this:

Dim OpenResources() As FILE_INFO_3

OpenResources = NetFileEnum("\\MyServer", vbNullString, vbNullString)

On Error GoTo Skip
For i = 0 To UBound(OpenResources)
    If InStr(1, OpenResources(i).fi3_pathname, "MyProgram.exe") <> 0 Then Debug.Print "MyProgram.exe is openend by " & OpenResources(i).fi3_username
Next i
Skip:


Quick explanation of the parameters again:
ServerName - Like it says...

BasePath - BasePath to limit the search. BUT this may not be very useful in this case since this has to be the local path as seen on the SERVER. So if you have the server mapped as P: but the application is on drive C: on the server it's the C:\whatever\path you have to specify here. This is why I just pass vbNullString to get everything and filter the results afterwards.

UserName - If you specify this, the function will only return resources opened by this user, This is probably not what you want, so just use vbNullString here too.

The On Error Goto thing is just because VB doesn't have an easy way to tell if the returned array is empty...

If it still doesn't work, step through the code and check the return value from the internal NetFileEnum API call, it should be zero if it worked.
0
 
LVL 9

Assisted Solution

by:rawinnlnx9
rawinnlnx9 earned 640 total points
ID: 8270372
I don't know what error you are getting back but this post may help as I am sure Unicode is your problem.

http://www.experts-exchange.com/Programming/Programming_Languages/Visual_Basic/Q_10125028.html
0
 
LVL 3

Expert Comment

by:Jonyv
ID: 8270527
I assume that you are refering to the parameters being passed as regular VB strings in the call to NetFileEnum in my original post?
In that case you will find that I already posted a correction for this, so I don't think Unicode is a problem here (unless you have spotted some other problem that I missed?)

I have successfully executed the code above (with the fix) and got valid results back, so I think it works  :-)
0
 
LVL 4

Author Comment

by:CareyJ
ID: 8272208
I get valid results back when I run it against the SQL server but I get nothing back when I run it against the Netware server.

In NetFileEnum, Status = 53 instead of 0 is returned when I run against the Netware server.
0
 
LVL 4

Author Comment

by:CareyJ
ID: 8272252
I get valid results back when I run it against the SQL server but I get nothing back when I run it against the Netware server.

In NetFileEnum, Status = 53 instead of 0 is returned when I run against the Netware server.
0
 
LVL 3

Assisted Solution

by:Jonyv
Jonyv earned 640 total points
ID: 8272389
A quick look in WinError.h tells me:
53 = ERROR_BAD_NETPATH  "The network path was not found"

Since you were able to use it aginst another server this makes me fear that this API simply doesn't work with Netware servers, in which case I'm afraid that I have wasted your time  :-(

I'm out of ideas at this point, sorry.
0
 
LVL 17

Expert Comment

by:inthedark
ID: 8274335
Hi CareyJ.  You are going the up hill way. By using 2 EXE files the job would be finished in 2 minutes and also it would mean that you just dont need to care who is on the network, you could be playing golf instead of waiting for users to quit the application.
0
 

Expert Comment

by:CleanupPing
ID: 8531594
Hi CareyJ,
This old question (QID 20563253) needs to be finalized -- accept an answer, split points, or get a refund.  Please see http://www.cityofangels.com/Experts/Closing.htm for information and options.
0
 
LVL 4

Author Comment

by:CareyJ
ID: 8537741
Well...I haven't forgotten about this question

The need for an answer still exists.

Jonyv was closest to the answer when he offered an NT Server solution but I still need the Netware solution.

I don't want to delete the question because it has some good information pertaining to this problem.

I don't want to close the question because I hope someone sees it soon and offers the Netware solution.

What do you recommend CleanupPing?  Do you really need it closed?
0
 

Expert Comment

by:CleanupPing
ID: 8899886
CareyJ:
This old question needs to be finalized -- accept an answer, split points, or get a refund.  For information on your options, please click here-> http:/help/closing.jsp#1 
Experts: Post your closing recommendations!  Who deserves points here?
0
 
LVL 4

Author Comment

by:CareyJ
ID: 9000609
Well...I haven't forgotten about this question

The need for an answer still exists.

Jonyv was closest to the answer when he offered an NT Server solution but I STILL need the Netware solution.

I don't want to delete the question because it has some good information pertaining to this problem.

I don't want to close the question because I hope someone sees it soon and offers the Netware solution.

What do you recommend CleanupPing?  Do you really need it closed?
0
 
LVL 6

Expert Comment

by:GPrentice00
ID: 9441028
No comment has been added lately, so it's time to clean up this TA.
I will leave a recommendation in the Cleanup topic area that this question is:

 -->PAQ - with points refunded

Please leave any comments here within the next seven days.

PLEASE DO NOT ACCEPT THIS COMMENT AS AN ANSWER

GPrentice00
Cleanup Volunteer
0
 
LVL 6

Assisted Solution

by:GPrentice00
GPrentice00 earned 80 total points
ID: 9441031
CareyJ

For future reference, experience shows two critical things
1) Very few experts tend to look over questions that are more than ~7 pages back.
2) In a topic area as active as Visual Basic, a new question becomes #200 (10 pages) after approximately 6-8 days.
Essentially, after 7-10 days, only the asker and participating experts will be aware of the question until a Cleanup Volunteer comes along. If the problem appears stalled (10 days since posting and 4-5 days since an expert has followed up), you may wish to post a 20 point "Link-To: my question topic " question (containing the URL of the stalled question in the body, a very brief summary).
This will bring it to the attention of the experts without the need for you to delete and repost - and is the best solution if you have had to reject some 'standard' suggestions or clarify information, preventing the new experts from making the same comments. The link-to question can be deleted, and points refunded, once your question can be closed, or once the link itself is too old.
You may also post a zero point request (linking to your question) in Community Service for the question to be deleted and  your points refunded, so that you may reask the question differently, or invite a Moderator to recommend an action for you to take.  You can never go wrong asking a Moderator for an opinion on the action to take.

GPrentice00
Cleanup Volunteer
0
 
LVL 9

Expert Comment

by:rawinnlnx9
ID: 9441065
If you go look at my original solution I posted and change the message box call to a custom form you design to look like a message box it will work just fine. Then it will not matter who is logged in. They have 10 minutes and then they get iced. You can only do so much to help people. Or make it 30 minutes either way... Put in a custom form and things will work no matter what server you are trying to hit. You are not going to find a "silver bullet" on this one.

- Rex
0

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

I’ve seen a number of people looking for examples of how to access web services from VB6.  I’ve been using a test harness I built in VB6 (using many resources I found online) that I use for small projects to work out how to communicate with web serv…
When designing a form there are several BorderStyles to choose from, all of which can be classified as either 'Fixed' or 'Sizable' and I'd guess that 'Fixed Single' or one of the other fixed types is the most popular choice. I assume it's the most p…
Get people started with the process of using Access VBA to control Outlook using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Microsoft Outlook. Using automation, an Access applic…
Show developers how to use a criteria form to limit the data that appears on an Access report. It is a common requirement that users can specify the criteria for a report at runtime. The easiest way to accomplish this is using a criteria form that a…
Suggested Courses

770 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question