Solved

Code to allow MS Access database to determine whether it's being run from a network

Posted on 2013-12-18
10
460 Views
Last Modified: 2013-12-18
Is there a catch-all way for an Access database frontend to detect whether it's being opened from a network location (mapped to a drive or not) versus the user's hard drive?

I want to keep the frontends off the network so that multiple users don't use the same copy, and to reduce traffic.

I know about Currentdb.name, and I know what drive letters we use for network locations, but I want something that will work anywhere.
0
Comment
Question by:Jolio81
10 Comments
 
LVL 120

Expert Comment

by:Rey Obrero (Capricorn1)
ID: 39726917
you can try something like this

if left(currentdb.name,3)<> "C:\"  then
0
 
LVL 57
ID: 39726925
A great question!

I would think there is a windows API call that would need to be made.  Only the OS will know if it's a local or mapped/unc connection.

Let me see what I can find out...

Jim.
0
 
LVL 57
ID: 39726939
Looks like you can use the GetDriveType() function, or GetDrivePath().

Let me see what I can work up.

Jim.
0
U.S. Department of Agriculture and Acronis Access

With the new era of mobile computing, smartphones and tablets, wireless communications and cloud services, the USDA sought to take advantage of a mobilized workforce and the blurring lines between personal and corporate computing resources.

 
LVL 47

Expert Comment

by:Dale Fye (Access MVP)
ID: 39726946
I put all of my current version front ends in a specific folder on my server, something like:

C:\DatabaseApplications\

Then I have some code in the Timer event (TimerInterval = 1000) of my Splash form of my applications which checks to see whether the CurrentProject.Path matches that path.  If so, it displays a message indicating that the application cannot be run from the server and shuts down.

Private Sub Form_Timer()

     If CurrentProject.Path = "C:\Users\dale.fye\Documents\Work\Access" Then
         MsgBox "cannot run from Server, copy application to desktop before running"
         Application.Quit
     End If

End Sub
0
 
LVL 57

Accepted Solution

by:
Jim Dettman (Microsoft MVP/ EE MVE) earned 500 total points
ID: 39726980
Use the code below and pass a drive letter.

Jim.

Option Compare Database
Option Explicit

Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal strDrive As String) As Long


Public Function IsNetworkDrive(strDrive As String) As Boolean

    Select Case GetDriveType(strDrive)
   
    Case 4
        IsNetworkDrive = True
    Case Else
        IsNetworkDrive = False
    End Select
   
End Function
0
 
LVL 47

Expert Comment

by:Dale Fye (Access MVP)
ID: 39726993
My Timer event should have read:

Private Sub Form_Timer()

     If CurrentProject.Path = "C:\DatabaseApplications\" Then
         MsgBox "cannot run from Server, copy application to desktop before running"
         Application.Quit
     End If

End Sub

But I like the GetDriveType function call and may try that.  Wonder if that requires modification for 64 bit systems or Office (x64)?
0
 
LVL 57
ID: 39727007
Note that you need to pass a root spec, ie.  IsNetworkDrive("C:\")

and not just a letter.

Jim.
0
 
LVL 47

Expert Comment

by:Dale Fye (Access MVP)
ID: 39727039
Using Jim's IsNetworkDrive function, you could change my example code to:

Private Sub Form_Timer()

     If IsNetworkDrive(CurrentProject.Path) Then
         MsgBox "cannot run from Server, copy application to desktop before running"
         Application.Quit
     End If

End Sub
0
 

Expert Comment

by:Mwvarner
ID: 39727337
A better or at least easier approach may be to force the application to launch from the desktop and not a server location.  I have a batch file that copies my frontend each time the app is launched to the local machine.  This keeps people from running the frontend from the server and when I need to do an update to the front end I only have to change it in one place.

cls
echo ********************************************
echo Update Local Copy
echo This will update your machine with my App
echo from the file server. If this is NOT what
echo you want to do, press CTRL and C now.
echo ********************************************
pause
echo Copying file... Please wait
REM if not exist c:\myapp md c:\my app
copy j:\apps\myapp0\myapp.mdb c:\myapp
0
 

Author Closing Comment

by:Jolio81
ID: 39727643
Great! Thanks Jim!

To add a bit of robustness, I modified your function a bit:

Public Function IsNetworkDrive(strPath As String) As Boolean

    strPath = Left(strPath, 2)
   
    IsNetworkDrive = (GetDriveType(strPath) = 4) Or (strPath = "\\")

End Function
0

Featured Post

Ransomware: The New Cyber Threat & How to Stop It

This infographic explains ransomware, type of malware that blocks access to your files or your systems and holds them hostage until a ransom is paid. It also examines the different types of ransomware and explains what you can do to thwart this sinister online threat.  

Question has a verified solution.

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

If you need to start windows update installation remotely or as a scheduled task you will find this very helpful.
It’s the first day of March, the weather is starting to warm up and the excitement of the upcoming St. Patrick’s Day holiday can be felt throughout the world.
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…
With Secure Portal Encryption, the recipient is sent a link to their email address directing them to the email laundry delivery page. From there, the recipient will be required to enter a user name and password to enter the page. Once the recipient …

685 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