none
Befehl für Netzlaufwerk verbinden RRS feed

  • Frage

  • Hallo Community,

    ich bin neu in VB und würde gerne wissen, wie der Befehl zum Netzlaufwerk verbinden lautet, vergleichbar mit NET USE in der Kommandozeile.
    Für eure Antwort bedanke ich mich im vorraus.
    Dienstag, 2. Juni 2009 14:59

Antworten

  • Hallo blume2054,


    Schau dir mal auch dieses Artikel an: "Wie Verwenden des WNetUseConnection API zu dem Zuordnen eines Laufwerks in Visual Basic"
    http://support.microsoft.com/kb/256847/de

    Für ein Netzlaufwerk zu verbinden du must WinAPI verwenden oder das NET USE Befehl.

    Zu erst must du in deinem VB.NET Projekt den folgenden Namespace eintragen:

    Imports System.Runtime.InteropServices

    Folgend, in deiner Form Klasse die zwei WINAPIs erklären:

    Public Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" _
    (ByRef lpNetResource As NETRESOURCE, ByVal lpPassword As String, _
    ByVal lpUserName As String, ByVal dwFlags As Integer) As Integer
    Public Declare Function WNetCancelConnection2 Lib "mpr" Alias "WNetCancelConnection2A" _
    (ByVal lpName As String, ByVal dwFlags As Integer, ByVal fForce As Integer) As Integer

    Nach der Erklärung der WINAPIs mus man eine Public Structure erstellen wie folgend:

    <structlayout(layoutkind.sequential)>Public Structure NETRESOURCE
    Public dwScope As Integer
    Public dwType As Integer
    Public dwDisplayType As Integer
    Public dwUsage As Integer
    Public lpLocalName As String
    Public lpRemoteName As String
    Public lpComment As String
    Public lpProvider As String
    End Structure

    Zwei Konstanten braucht man auch noch:

    Public Const ForceDisconnect As Integer = 1
    Public Const RESOURCETYPE_DISK As Long = &H1

    Jetzt kommen die zwei Map und UnMap Funktionen:

    Public Function MapDrive(ByVal DriveLetter As String, ByVal UNCPath As String) As Boolean
    
    Dim nr As NETRESOURCE
    Dim strUsername As String '// Benutzername
    Dim strPassword As String '//Kennwort
    
    nr = New NETRESOURCE
    nr.lpRemoteName = UNCPath
    nr.lpLocalName = DriveLetter & ":"
    
    strUsername = Nothing
    strPassword = Nothing
    If txtUsername.Text.Length > 0 Then
    strUsername = txtUsername.Text
    End If
    If txtPassword.Text.Length > 0 Then
    strPassword = txtPassword.Text
    End If
    
    nr.dwType = RESOURCETYPE_DISK
    
    Dim result As Integer
    result = WNetAddConnection2(nr, strPassword, strUsername, 0)
    
    If result = 0 Then
    Return True
    Else
    Return False
    End If
    End Function
    
    Public Function UnMapDrive(ByVal DriveLetter As String) As Boolean
    Dim rc As Integer
    rc = WNetCancelConnection2(DriveLetter & ":", 0, ForceDisconnect)
    
    If rc = 0 Then
    Return True
    Else
    Return False
    End If
    
    End Function

    Gruesse,

    Dienstag, 2. Juni 2009 20:21
  • Hallo Messiahs,

    Es gibt eine Funktion die den UNCPath ermitteln kann, diese Lautet:

    WNetGetUniversalName Function à http://msdn.microsoft.com/en-us/library/aa385474(VS.85).aspx

    Ich habe auch einen kleinen Code noch getestet wo diese Funktion gerufen wird (in VS 2008 mit Vista).

    Wir brauchen:

    Imports System.Runtime.InteropServices

    Deklarationen sind:

    Private Declare Auto Function WNetGetUniversalName Lib "mpr.dll" ( _
     <MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)> _
     ByVal lpLocalPath As String, _
     ByVal dwInfoLevel As INFO_LEVEL, _
     ByVal lpBuffer As IntPtr, _
     ByRef lpBufferSize As Integer _
    ) As Integer
    
        Private Structure REMOTE_NAME_INFO
            <MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)> _
            Public lpUniversalName As String
            <MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)> _
            Public lpConnectionName As String
            <MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)> _
            Public lpRemainingPath As String
        End Structure
    
        Private Enum INFO_LEVEL As Integer
            UNIVERSAL_NAME_INFO_LEVEL = 1
            REMOTE_NAME_INFO_LEVEL = 2
        End Enum
    Die Funktion ist:

    Public Function GetUniversalName(ByVal Path As String, ByRef UniversalName As String, ByRef ConnectionName As String, ByRef RemainingPath As String) As Boolean
     
    
            Dim buffer As Integer
            Dim ptrbuffer As IntPtr
            Dim status As Integer
            Dim rni As REMOTE_NAME_INFO
            Dim Success As Boolean
            Dim SafteyCount As Integer = 0
    
            Const ERROR_MORE_DATA = &HEA
            Const NO_ERROR = &H0
    
            UniversalName = ""
            ConnectionName = ""
            RemainingPath = ""
            buffer = 1024
    
            ptrbuffer = Marshal.AllocHGlobal(buffer)
            status = WNetGetUniversalName(Path, INFO_LEVEL.REMOTE_NAME_INFO_LEVEL, ptrbuffer, buffer)
            Do While True
                Select Case status
                    Case NO_ERROR
                        rni = Marshal.PtrToStructure(ptrbuffer, GetType(REMOTE_NAME_INFO))
                        UniversalName = rni.lpUniversalName
                        ConnectionName = rni.lpConnectionName
                        RemainingPath = rni.lpRemainingPath
                        Success = True
                        Exit Do
                    Case ERROR_MORE_DATA
                        If SafteyCount > 3 Then
                            Success = False
                            Exit Do
                        End If
                        SafteyCount += 1
                        Marshal.FreeHGlobal(ptrbuffer)
                        ptrbuffer = Marshal.AllocHGlobal(buffer)
                        status = WNetGetUniversalName(Path, _
                          INFO_LEVEL.REMOTE_NAME_INFO_LEVEL, ptrbuffer, buffer)
                    Case Else
                        Success = False
                        Exit Do
                End Select
            Loop
            Marshal.FreeHGlobal(ptrbuffer)
            Return Success
        End Function

    Wenn das Ergebnis der Funktion erfolgreich ist (TRUE) dann füllt sie UniversalName, ConnectionName und RemainingPath. Im UniversalName findet man den ganzen UNC Pfad.

    Wenn das Ergebnis der Funktion nicht erfolgreich ist: lokales oder nicht gemapptes Laufwerk.


    Als test auf einem Knopf:


      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim mytest As Boolean
            mytest = GetUniversalName("Z:\OS", vbNullString, vbNullString, vbNullString)
        End Sub

     

    Grüße und Erfolg,

    • Als Antwort markiert Forenteam Freitag, 26. Juni 2009 15:05
    Freitag, 26. Juni 2009 13:34

Alle Antworten

  • Hallo blume2054,


    Schau dir mal auch dieses Artikel an: "Wie Verwenden des WNetUseConnection API zu dem Zuordnen eines Laufwerks in Visual Basic"
    http://support.microsoft.com/kb/256847/de

    Für ein Netzlaufwerk zu verbinden du must WinAPI verwenden oder das NET USE Befehl.

    Zu erst must du in deinem VB.NET Projekt den folgenden Namespace eintragen:

    Imports System.Runtime.InteropServices

    Folgend, in deiner Form Klasse die zwei WINAPIs erklären:

    Public Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" _
    (ByRef lpNetResource As NETRESOURCE, ByVal lpPassword As String, _
    ByVal lpUserName As String, ByVal dwFlags As Integer) As Integer
    Public Declare Function WNetCancelConnection2 Lib "mpr" Alias "WNetCancelConnection2A" _
    (ByVal lpName As String, ByVal dwFlags As Integer, ByVal fForce As Integer) As Integer

    Nach der Erklärung der WINAPIs mus man eine Public Structure erstellen wie folgend:

    <structlayout(layoutkind.sequential)>Public Structure NETRESOURCE
    Public dwScope As Integer
    Public dwType As Integer
    Public dwDisplayType As Integer
    Public dwUsage As Integer
    Public lpLocalName As String
    Public lpRemoteName As String
    Public lpComment As String
    Public lpProvider As String
    End Structure

    Zwei Konstanten braucht man auch noch:

    Public Const ForceDisconnect As Integer = 1
    Public Const RESOURCETYPE_DISK As Long = &H1

    Jetzt kommen die zwei Map und UnMap Funktionen:

    Public Function MapDrive(ByVal DriveLetter As String, ByVal UNCPath As String) As Boolean
    
    Dim nr As NETRESOURCE
    Dim strUsername As String '// Benutzername
    Dim strPassword As String '//Kennwort
    
    nr = New NETRESOURCE
    nr.lpRemoteName = UNCPath
    nr.lpLocalName = DriveLetter & ":"
    
    strUsername = Nothing
    strPassword = Nothing
    If txtUsername.Text.Length > 0 Then
    strUsername = txtUsername.Text
    End If
    If txtPassword.Text.Length > 0 Then
    strPassword = txtPassword.Text
    End If
    
    nr.dwType = RESOURCETYPE_DISK
    
    Dim result As Integer
    result = WNetAddConnection2(nr, strPassword, strUsername, 0)
    
    If result = 0 Then
    Return True
    Else
    Return False
    End If
    End Function
    
    Public Function UnMapDrive(ByVal DriveLetter As String) As Boolean
    Dim rc As Integer
    rc = WNetCancelConnection2(DriveLetter & ":", 0, ForceDisconnect)
    
    If rc = 0 Then
    Return True
    Else
    Return False
    End If
    
    End Function

    Gruesse,

    Dienstag, 2. Juni 2009 20:21
  • PERFEKT, funktioniert. Vielen Dank.
    • Als Antwort markiert blume2054 Donnerstag, 4. Juni 2009 08:07
    • Tag als Antwort aufgehoben Mathias Schiffer Freitag, 26. Juni 2009 12:58
    Mittwoch, 3. Juni 2009 10:16
  • Läuft ohne Probleme.
    Ich habe aber das Problem, dass ich den UNCPath nicht zurVerfügung habe.
    Es besteht zwar die Möglichkeit diesen aus der Reg zu lesen, aber ob dies dann bei Windows Versionen > XP noch funktioniert, steht in den Sternen.
    Gibt es eine Möglichkeit bzw. Funktion den UNCPath zu ermitteln ?

    Grüße
     
    Donnerstag, 25. Juni 2009 23:50
  • Hallo Messiahs,

    Es gibt eine Funktion die den UNCPath ermitteln kann, diese Lautet:

    WNetGetUniversalName Function à http://msdn.microsoft.com/en-us/library/aa385474(VS.85).aspx

    Ich habe auch einen kleinen Code noch getestet wo diese Funktion gerufen wird (in VS 2008 mit Vista).

    Wir brauchen:

    Imports System.Runtime.InteropServices

    Deklarationen sind:

    Private Declare Auto Function WNetGetUniversalName Lib "mpr.dll" ( _
     <MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)> _
     ByVal lpLocalPath As String, _
     ByVal dwInfoLevel As INFO_LEVEL, _
     ByVal lpBuffer As IntPtr, _
     ByRef lpBufferSize As Integer _
    ) As Integer
    
        Private Structure REMOTE_NAME_INFO
            <MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)> _
            Public lpUniversalName As String
            <MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)> _
            Public lpConnectionName As String
            <MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)> _
            Public lpRemainingPath As String
        End Structure
    
        Private Enum INFO_LEVEL As Integer
            UNIVERSAL_NAME_INFO_LEVEL = 1
            REMOTE_NAME_INFO_LEVEL = 2
        End Enum
    Die Funktion ist:

    Public Function GetUniversalName(ByVal Path As String, ByRef UniversalName As String, ByRef ConnectionName As String, ByRef RemainingPath As String) As Boolean
     
    
            Dim buffer As Integer
            Dim ptrbuffer As IntPtr
            Dim status As Integer
            Dim rni As REMOTE_NAME_INFO
            Dim Success As Boolean
            Dim SafteyCount As Integer = 0
    
            Const ERROR_MORE_DATA = &HEA
            Const NO_ERROR = &H0
    
            UniversalName = ""
            ConnectionName = ""
            RemainingPath = ""
            buffer = 1024
    
            ptrbuffer = Marshal.AllocHGlobal(buffer)
            status = WNetGetUniversalName(Path, INFO_LEVEL.REMOTE_NAME_INFO_LEVEL, ptrbuffer, buffer)
            Do While True
                Select Case status
                    Case NO_ERROR
                        rni = Marshal.PtrToStructure(ptrbuffer, GetType(REMOTE_NAME_INFO))
                        UniversalName = rni.lpUniversalName
                        ConnectionName = rni.lpConnectionName
                        RemainingPath = rni.lpRemainingPath
                        Success = True
                        Exit Do
                    Case ERROR_MORE_DATA
                        If SafteyCount > 3 Then
                            Success = False
                            Exit Do
                        End If
                        SafteyCount += 1
                        Marshal.FreeHGlobal(ptrbuffer)
                        ptrbuffer = Marshal.AllocHGlobal(buffer)
                        status = WNetGetUniversalName(Path, _
                          INFO_LEVEL.REMOTE_NAME_INFO_LEVEL, ptrbuffer, buffer)
                    Case Else
                        Success = False
                        Exit Do
                End Select
            Loop
            Marshal.FreeHGlobal(ptrbuffer)
            Return Success
        End Function

    Wenn das Ergebnis der Funktion erfolgreich ist (TRUE) dann füllt sie UniversalName, ConnectionName und RemainingPath. Im UniversalName findet man den ganzen UNC Pfad.

    Wenn das Ergebnis der Funktion nicht erfolgreich ist: lokales oder nicht gemapptes Laufwerk.


    Als test auf einem Knopf:


      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim mytest As Boolean
            mytest = GetUniversalName("Z:\OS", vbNullString, vbNullString, vbNullString)
        End Sub

     

    Grüße und Erfolg,

    • Als Antwort markiert Forenteam Freitag, 26. Juni 2009 15:05
    Freitag, 26. Juni 2009 13:34