Benutzer mit den meisten Antworten
Drive Mapping in Visual Basic 2015 herstellen

Frage
-
Hallo,
ich möchte in einem Visual Basic 2015 Programm verschiedene Laufwerks Buchstaben mit einem UNC Pfad von meinen Windows Servern verbinden, damit dann andere Programme die sich außerhalb meines Visual Basic Programms damit kommunizieren können.
Leider habe ich dazu keine Beispiele gefunden, daher stelle ich hier die Frage wie ich diese Herausforderung bewältigen kann.
Vielleicht hat bereits jemand dazu eine Lösung?
Ich wäre hier an einem Programm Beispiel Interessiert.
Mit Freundlichen Grüßen
Jens Geier
Avangard-Malz AG
Antworten
-
Hallo Jens,
zur Sicherheit habe ich mein Programm noch einmal unter Win10 64 Bit getestet, auch da läuft es ohne Fehler.
Hier noch mal das Programm wie ich es aufgebaut habe:
Private 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 Const RESOURCETYPE_DISK = &H1 Const CONNECT_UPDATE_PROFILE = &H1 Private 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 Sub Main() MyNET_DriveMapping("F:", "\\xxxxx\yyyy") End Sub Public Function MyNET_DriveMapping(ByVal Laufwerk As String, ByVal Share As String, Optional ByVal Username As String = "", Optional ByVal Password As String = "") As Long Dim Netz As New NETRESOURCE Dim Ret As Long Netz.dwType = RESOURCETYPE_DISK Netz.lpProvider = Nothing Netz.lpRemoteName = Share Netz.lpLocalName = Laufwerk If Username = "" Then Ret = WNetAddConnection2(Netz, 0, 0, CONNECT_UPDATE_PROFILE) Else Ret = WNetAddConnection2(Netz, Password, Username, CONNECT_UPDATE_PROFILE) End If Return Ret End Function
Grüße
Roland
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 13. November 2017 12:27
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 24. November 2017 13:56
Alle Antworten
-
Hallo Jens,
eine einfach Methode wäre einen Net Use Befehl auszuführen; das geht sogar ohne VB als einfache Batch Datei.
Olaf Helper
[ Blog] [ Xing] [ MVP]- Bearbeitet Olaf HelperMVP Freitag, 3. November 2017 06:34
-
Hallo Olaf,
das ist es was ich zur Zeit mache.
Da geht natürlich immer das schwarze Fenster der Kommando Zeile auf, was meine Anwender sehr stört.
Daher wollte ich eine Methode wählen die dieses als Dienst im Hintergrund macht.
Eine Batch Script im Hintergund als Dienst ausführen, das habe ich noch nicht geschafft, auch nicht das dass schwarze Fenster der Kommando Zeile auf geht auch nicht.
Daher meine Frage dieses innerhalb von VB zu machen.
Mit freundlichen Grüßen
Jens Geier
Avangard-Malz AG
-
Hallo Jens,
im .Net Framework gibt es meines Wissens leider keine Bibliothek hierfür.
Als Alternative kannst Du die Win32-Api nutzen.
Hier mal ein Beispielcode in VB:
Declare Function WNetGetConnection Lib "mpr.dll" Alias "WNetGetConnectionA" (ByVal lpszLocalName As String, ByVal lpszRemoteName As String, cbRemoteName As Long) As Long Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUserName As String, ByVal dwFlags As Long) As Long Declare Function WNetCancelConnection Lib "mpr.dll" Alias _ "WNetCancelConnectionA" _ (ByVal lpszName As String, _ ByVal bForce As Long) As Long Declare Function WNetGetUser Lib "mpr" Alias _ "WNetGetUserA" _ (ByVal lpName As String, _ ByVal lpUserName As String, _ lpnLength As Long) As Long Type NETRESOURCE dwScope As Long dwType As Long dwDisplayType As Long dwUsage As Long lpLocalName As String lpRemoteName As String lpComment As String lpProvider As String End Type Function MakeCon(Laufwerk As String, Share As String, Username As String, Password As String) As Boolean Dim Net As NETRESOURCE Dim Ret As Long Dim Retry As Boolean Dim NetPath, MsgHeader As String Net.lpRemoteName = Share If Username = "" Then Ret = WNetAddConnection2(Net, 0, 0, CONNECT_UPDATE_PROFILE) Else Ret = WNetAddConnection2(Net, Password, Username, CONNECT_UPDATE_PROFILE) End If MakeConPW = False End Function
Mit der Funktion MakeCon stellst Du die Verbindung her und weist diese einem Laufwerk zu.
Grüße
Roland
-
Hallo Roland,
Ich habe mir Deinen Code angesehen und habe dazu einige Fragen. Wie passt die Deklaration der Funktion
__MakeCon__ zusammen mit __WNetAddConnection2(Net, 0, 0, CONNECT_UPDATE_PROFILE)__??
Mit freundlichen Grüßen
Jens Geier
Avangard-Malz AG
Public Function MakeCon(Laufwerk As String, Share As String, Username As String, Password As String) As Boolean Dim Net As NETRESOURCE Dim Ret As Long Dim Retry As Boolean Dim NetPath, MsgHeader As String Net.lpRemoteName = Share If Username = "" Then Ret = WNetAddConnection2(Net, 0, 0, CONNECT_UPDATE_PROFILE) Else Ret = WNetAddConnection2(Net, Password, Username, CONNECT_UPDATE_PROFILE) End If MakeCon = False End Function
-
Hallo Roland,
vielen Dank für den Link zur API Referenz.
Das hat mir sehr weitergeholfen.
Ich habe mich eingehend damit beschäftigt. Allerdings habe ich nicht gefunden, wo die Flags/Konstanten Definiert werden, daher weis ich z.B. nicht welchen wert die anderen Konstanten haben ...
Mit Freundlichen Grüßen
Jens Geier
Avangard-Malz AG
-
Hallo Roland,
Ja, jetzt habe ich verstanden, wie das mit den Konstanten gemeint ist.
So sieht nun meine Funktion aus.
Public Function MyNET_DriveMapping(ByVal Laufwerk As String, ByVal Share As String, Optional ByVal Username As String = "", Optional ByVal Password As String = "") As Long Dim Netz As New NETRESOURCE Dim Ret As Long = -2 Netz.dwType = RESOURCETYPE_DISK ' Netz.lpProvider = "" Netz.lpRemoteName = Share Netz.lpLocalName = Laufwerk If Username = "" Then Ret = WNetAddConnection2A(Netz, 0, 0, CONNECT_UPDATE_PROFILE) Else Ret = WNetAddConnection2A(Netz, Password, Username, CONNECT_UPDATE_PROFILE) End If Return Ret End Function
Jedoch bekomme ich beim Aufruf eine Fehlermeldung, mit der ich nicht viel anfangen kann.
Vielleicht hast Du ja eine Idee was diese bedeutet.
Der Assistent für verwaltetes Debugging ""PInvokeStackImbalance"" hat ein Problem in ""C:\!RSYNC\PROJEKTE\VB\AVMServicesForm000\AVMServicesForm000\bin\Debug\AVMServicesForm000.vshost.exe"" festgestellt. Zusätzliche Informationen: Ein Aufruf an die PInvoke-Funktion "AVMServicesForm000!AVMServicesForm000.My_SUB_Windows_Networking_Functions::WNetAddConnection2A" hat das Gleichgewicht des Stapels gestört. Wahrscheinlich stimmt die verwaltete PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur überein. Überprüfen Sie, ob die Aufrufkonvention und die Parameter der PInvoke-Signatur mit der nicht verwalteten Zielsignatur übereinstimmen.
Mit freundlichen Grüßen
Jens Geier
-
Sorry,
ich hatte in der Eile den Code für VBA gepostet.
Das meiste hast Du ja bereits umgestellt, was noch fehlt ist die Methodendeklaration, die muss im VB.NET so aussehen:
Private 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
Grüße
Roland
-
Hallo Roland,
das habe ich so probiert, es gib jedoch den gleichen Fehler wieder.
Sub MAIN MyNET_DriveMapping("X:", "\\Ctq-weichhaus\citect") End Sub Public Function MyNET_DriveMapping(ByVal Laufwerk As String, ByVal Share As String, Optional ByVal Username As String = "", Optional ByVal Password As String = "") As Integer Dim Netz As New NETRESOURCE Dim Ret As Integer = -2 Netz.dwType = RESOURCETYPE_DISK ' Netz.lpProvider = "" Netz.lpRemoteName = Share Netz.lpLocalName = Laufwerk If Username = "" Then Ret = WNetAddConnection2(Netz, 0, 0, CONNECT_UPDATE_PROFILE) Else Ret = WNetAddConnection2(Netz, Password, Username, CONNECT_UPDATE_PROFILE) End If Return Ret End Function Private Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (ByVal lpNetResource As NETRESOURCE, ByVal lpPassword As String, ByVal lpUsername As String, ByVal dwFlags As Integer) As Integer
Der Assistent für verwaltetes Debugging ""PInvokeStackImbalance"" hat ein Problem in ""C:\!RSYNC\PROJEKTE\VB\AVMServicesForm000\AVMServicesForm000\bin\Debug\AVMServicesForm000.vshost.exe"" festgestellt. Zusätzliche Informationen: Ein Aufruf an die PInvoke-Funktion "AVMServicesForm000!AVMServicesForm000.My_SUB_Windows_Networking_Functions::WNetAddConnection2" hat das Gleichgewicht des Stapels gestört. Wahrscheinlich stimmt die verwaltete PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur überein. Überprüfen Sie, ob die Aufrufkonvention und die Parameter der PInvoke-Signatur mit der nicht verwalteten Zielsignatur übereinstimmen.
Mit freundlichen Grüßen
Jens Geier
-
Hallo Roland,
die definition sieht so aus.
'! '! NETRESOURCE structure '! ===================== '! '! https://msdn.microsoft.com/en-us/library/windows/desktop/aa385353(v=vs.85).aspx '! 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
Hatte ich eigentlich schon erwähnt, das ich Windows 10 Professional 64-Bit als Betriebsystem nutze?
Eigentlich sollte das ja bei der Entwicklung egal sein, nicht wahr?
Mit freundlichen Grüßen
Jens Geier
-
Hallo Jens,
zur Sicherheit habe ich mein Programm noch einmal unter Win10 64 Bit getestet, auch da läuft es ohne Fehler.
Hier noch mal das Programm wie ich es aufgebaut habe:
Private 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 Const RESOURCETYPE_DISK = &H1 Const CONNECT_UPDATE_PROFILE = &H1 Private 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 Sub Main() MyNET_DriveMapping("F:", "\\xxxxx\yyyy") End Sub Public Function MyNET_DriveMapping(ByVal Laufwerk As String, ByVal Share As String, Optional ByVal Username As String = "", Optional ByVal Password As String = "") As Long Dim Netz As New NETRESOURCE Dim Ret As Long Netz.dwType = RESOURCETYPE_DISK Netz.lpProvider = Nothing Netz.lpRemoteName = Share Netz.lpLocalName = Laufwerk If Username = "" Then Ret = WNetAddConnection2(Netz, 0, 0, CONNECT_UPDATE_PROFILE) Else Ret = WNetAddConnection2(Netz, Password, Username, CONNECT_UPDATE_PROFILE) End If Return Ret End Function
Grüße
Roland
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 13. November 2017 12:27
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 24. November 2017 13:56
-
Hallo Roland,
zuerst einmal ...
__YEAHH__
jetzt hat alles wunderbar funktioniert.
Dieses ist die LÖSUNG.
Es gab definitions Probleme mit Integer, UINT32 ...
Vielen Dank für Deine Hilfe, was wäre ich nur ohne Dich?
Mit Freundlichen Grüßen
Jens Geier
AVANGARD-MALZ AG
Hallo, Mit freundlichen Grüßen Jens Geier Avangard-Malz AG
- Bearbeitet J.Geier Mittwoch, 29. November 2017 07:03