RSS
StartseiteKnowledge LibraryTop 10Impressum

Einmal UNC Pfad und zurück

Den UNC Pfad eines Netzlaufwerks ermitteln und ein Netzlaufwerk zu einem UNC Pfad finden

Netzwerkfreigaben können unter Windows mit virtuellen Laufwerken assoziiert werden. Den UNC Pfad eines solchen Netzlaufwerks ermitteln Sie über einen einzigen API Aufruf und können auch gleich ein passendes Netzlaufwerk zu einem UNC Pfad finden.

Netzwerkfreigaben können unter Windows mit virtuellen Laufwerken assoziiert werden, so dass der Zugriff wie bei einem normale Laufwerk erfolgen kann, ohne dass man den Servernamen und Freigabenamen kennen muss. Mit der API Funktion WNetGetConnection kann diese Netzwerkverbindung "enttarnt" werden und der UNC Pfad (Universial Naming Convention) eines Netzlaufwerks ermittelt werden.

Der Funktion LocalPathToUNCPath braucht nur noch der Laufwerksbuchstabe oder, wenn es sein muss, sogar ein kompletter Pfad übergeben werden und sie liefert den entsprechenden UNC Pfad zurück:

Private Declare Function WNetGetConnection Lib "mpr.dll" Alias _
        "WNetGetConnectionA" (ByVal lpszLocalName As String, _
        ByVal lpszRemoteName As String, cbRemoteName As Long) As Long

Private Const NO_ERROR = 0
Private Const ERROR_MORE_DATA = 234

Public Function LocalPathToUNCPath(ByVal MappedDrive As String) As String
  Dim lngRet  As Long
  Dim strUNC  As String
  Dim lngSize As Long
      
  MappedDrive = Left$(MappedDrive, 1) & ":"
  
  lngRet = WNetGetConnection(MappedDrive, strUNC, lngSize)
  
  If lngRet = ERROR_MORE_DATA Then
    strUNC = Space$(lngSize)
    lngRet = WNetGetConnection(MappedDrive, strUNC, lngSize)
    If lngRet = NO_ERROR Then
      LocalPathToUNCPath = Left$(strUNC, InStr(1, strUNC, vbNullChar) - 1)
    End If
  End If
End Function

Für den "Rückwärtsgang", also dem Auffinden eines passenden Netzlaufwerks zu einem UNC Pfad, bietet Windows keine direkte API Funktion, was aber nicht weiter tragisch ist, denn die Zahl der maximal möglichen Laufwerke, hinter denen sich ein Netzlaufwerk verstecken könnte, ist überschaubar und liegt irgendwo zwischen A und Z. Mit der API Funktion GetDriveType wird ermittelt, ob sich hinter einem Laufwerksbuchstaben ein Netzlaufwerk befindet, dann wird mit der Funktion LocalPathToUNCPath der UNC Pfad aufgelöst und mit dem gefragten Pfad verglichen:

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

Private Const DRIVE_REMOTE = 4

Public Function UNCPathToLocalPath(ByVal UNCPath As String) As String
  Dim strDrive As String
  Dim i        As Integer

  If Right$(UNCPath, 1) = "\" Then
    UNCPath = Left$(UNCPath, Len(UNCPath) - 1)
  End If
  
  For i = 65 To 90
    strDrive = Chr$(i) & ":\"
    If GetDriveType(strDrive) = DRIVE_REMOTE Then
      If StrComp(LocalPathToUNCPath(strDrive), UNCPath, vbTextCompare) = 0 Then
        UNCPathToLocalPath = strDrive
        Exit For
      End If
    End If
  Next
End Function