Benutzer mit den meisten Antworten
Befehl für Netzlaufwerk verbinden

Frage
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,
- Als Antwort vorgeschlagen Robert Breitenhofer Donnerstag, 4. Juni 2009 10:47
- Als Antwort markiert Mathias Schiffer Freitag, 26. Juni 2009 12:59
-
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
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,
- Als Antwort vorgeschlagen Robert Breitenhofer Donnerstag, 4. Juni 2009 10:47
- Als Antwort markiert Mathias Schiffer Freitag, 26. Juni 2009 12:59
-
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
-
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