none
Drive Mapping in Visual Basic 2015 herstellen RRS feed

  • 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

    Donnerstag, 2. November 2017 13:00

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

    Donnerstag, 9. November 2017 06:51

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]


    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

    Freitag, 3. November 2017 10:04
  • 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

    Freitag, 3. November 2017 10:20
  • Hallo Jens,

    dann starte as NET USE aus VB.NET mit Process.Start Method


    Olaf Helper

    [ Blog] [ Xing] [ MVP]


    Freitag, 3. November 2017 14:05
  • 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
    


    Samstag, 4. November 2017 02:08
  • Hallo Jens,

    sorry ich habe die Declaration der Konstante vergessen. Der Wert der Konstante ist übrigens 1.

    Und hier noch mal ein Link zur Referenz der API-Methode wo auch die Flags/Konstanten beschrieben sind.

    Grüße

    Roland

    Samstag, 4. November 2017 11:23
  • 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

    Montag, 6. November 2017 15:36
  • Hallo Jens,

    die Konstantendeklaration kommt oben zur API-Deklaration:

    Const CONNECT_UPDATE_PROFILE As Long = 1

    Die anderen möglichen Konstanten stehen auch in der von mir verlinken Referenz, siehe nachfolgender Screenshoot:

    Montag, 6. November 2017 19:04
  • 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

    Dienstag, 7. November 2017 14:01
  • 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

    Mittwoch, 8. November 2017 09:39
  • 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

    Mittwoch, 8. November 2017 10:05
  • Hallo Jens,

    ich sehe jetzt auf den ersten Blick keinen Fehler. Wie hast Du NETRESOURCE eingerichtet?

    Grüße

    Roland

    Mittwoch, 8. November 2017 12:37
  • 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

    Mittwoch, 8. November 2017 12:41
  • 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

    Donnerstag, 9. November 2017 06:51
  • 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
    Mittwoch, 29. November 2017 07:03