Getrenntes, aber vorhandenes Netzlaufwerk automatisch wieder verbinden - Laufwerksbuchstabe noch nicht in System.Environment.GetLogicalDrives vorhanden

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von dive26.

    Getrenntes, aber vorhandenes Netzlaufwerk automatisch wieder verbinden - Laufwerksbuchstabe noch nicht in System.Environment.GetLogicalDrives vorhanden

    Hallo Leute,

    in einer Schleife gehe ich alle am Rechner vorhandenen Laufwerksbuchstaben durch und ermittle den Datenträgernamen.
    Ich suche einen USB-Stick mit dem Namen "SECUMEM". Dieser könnte aber auch an einem Netzwerkcomputer angesteckt und als Netzlaufwerk verbunden sein.

    Manachmal passiert es aber, dass beim Hochfahren des Rechners das Netzlaufwerk nicht verbunden ist (siehe Screenshot).
    Dann ist dieses Laufwerk und natürlich auch in der System.Environment.GetLogicalDrives Abfrage nicht gelistet.

    Hier wäre die Aufgabenstellung vor der Ausführung meiner Suchroutine alle unterbrochenen Netzlaufwerke automatisch wieder zu verbinden.

    Da ich dem User so viel Konfigurationsarbeit wie möglich abnehmen möchte, würde ich gerne automatisch ermitteln welche Netzlaufwerke gerade NICHT VERBUNDEN sind (wie z.B. das in meinem Screenshot) und dies dann programmgesteuert verbinden.
    Ich möchte nirgends Netzwerkpfade oder Laufwerksbuchstaben angeben müssen. Der Laufwerksbuchstabe und der Netzwerkpfad könnten in jeder Installation anders sein. Es muss also automatisch gehen.
    (also so als würde ich im Explorer manuell auf dieses nicht verbundene Laufwerk doppelklicken).


    Zur Info ein Teil des Codes mit dem ich die Datenträgernamen auslese und erkenne ob es sich um den "SECUMEM" Stick handelt.

    VB.NET-Quellcode

    1. For Each Drive In System.Environment.GetLogicalDrives()
    2. SECUMEM.AlleLaufwerkeAlsString += Drive.ToString
    3. DriveType = GetDriveType(Left$(Drive, 1) & ":\")
    4. SECUMEM.AlleLaufwerkeAlsString += " " + DriveType.ToString
    5. cdrive = My.Computer.FileSystem.GetDriveInfo(Drive)
    6. Try
    7. SECUMEM.AlleLaufwerkeAlsString += " " + cdrive.VolumeLabel + vbCrLf
    8. If cdrive.VolumeLabel = "SECUMEM" Then
    9. SECUMEM.Laufwerksbuchstabe = Drive
    10. SECUMEM.LaufwerksbuchstabeVollstaendig = Left$(Drive, 1) & ":\"
    11. SECUMEM.StickGefunden = True
    12. End If
    13. Catch
    14. SECUMEM.AlleLaufwerkeAlsString += vbCrLf
    15. End Try
    16. Next Drive


    Ich hoffe ich habe mein Anliegen verständlich erklärt. Wenn nicht, bitte einfach nachfragen.

    LG Roland
    Bilder
    • Netzlaufwerk_Z.jpg

      9,44 kB, 265×66, 1.414 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Vielen Dank. Werde mir das mal ansehen und versuchen das auf VB.NET umzulegen.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Hallo Jonas,

    vielen Dank für den Code. Ich habe einmal versucht diesen automatisch in VB.NET umzuwandeln. Nun weis ich aber nicht wie ich diese "Funktion" aufrufe. Habe den Code in einer eigenen Datei zum Projekt gespeichert. Mit den Schlüsselwörtern "Namespace" hatte ich leider noch nie zuvor zu tun.

    VB.NET-Quellcode

    1. Imports System.Diagnostics
    2. Imports System.IO
    3. Imports System.Threading
    4. Namespace RestartMappedDrives
    5. Class Program
    6. Private Shared Sub Main(args As String())
    7. Dim p = Process.Start(New ProcessStartInfo() With {.FileName = "net", .Arguments = "use", .RedirectStandardOutput = True, .UseShellExecute = False})
    8. Dim str = p.StandardOutput.ReadToEnd()
    9. For Each s As String In str.Split(New Char() {ControlChars.Cr, ControlChars.Lf}, StringSplitOptions.RemoveEmptyEntries)
    10. Dim s2 = s.Split(New Char() {" "c}, StringSplitOptions.RemoveEmptyEntries)
    11. If s2.Length >= 2 AndAlso s2(1)(1) = ":"c Then
    12. Map(s2(1)(0).ToString())
    13. End If
    14. Next
    15. End Sub
    16. Private Shared Sub Map(drive As String)
    17. If Not New DriveInfo(drive).IsReady Then
    18. Try
    19. Process.Start(New ProcessStartInfo() With {.FileName = "explorer", .Arguments = drive & Convert.ToString(":\"), .WindowStyle = ProcessWindowStyle.Minimized})
    20. Thread.Sleep(500)
    21. For Each p As Process In Process.GetProcessesByName("explorer")
    22. If p.MainWindowTitle.EndsWith((Convert.ToString("(") & drive) + ":)", StringComparison.CurrentCultureIgnoreCase) Then
    23. p.Kill()
    24. End If
    25. Next
    26. Catch
    27. End Try
    28. End If
    29. End Sub
    30. End Class
    31. End Namespace
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Der ursprüngliche Code wurde in ein Konsolenprogramm integriert. Kopiere den Inhalt der Methode Main in eine eigene Methode in deiner Hauptklasse, bspw. SearchForUnconnectedDrives.
    Die Methode Map kopierst du darunter, auch in die Hauptklasse. Dann rufst du einfach zum gewünschten Zeitpunkt die Methode SearchForUnconnectedDrives auf und schon sollte alles funktionieren.

    Zu Namespaces: msdn.microsoft.com/de-de/libra…255&MSPPError=-2147217396
    Vielen Dank für die Hilfe und die Tipps.
    Ich habe die Software mal umgeschrieben und jetzt tut sie genau das was ich möchte:

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Sucht nicht verbundene Netzlaufwerke
    3. ''' </summary>
    4. ''' <remarks></remarks>
    5. Public Sub VerbindeNetzlaufwerke()
    6. Dim p = Process.Start(New ProcessStartInfo() With {.FileName = "net", .Arguments = "use", .RedirectStandardOutput = True, .UseShellExecute = False})
    7. Dim str = p.StandardOutput.ReadToEnd()
    8. For Each s As String In str.Split(New Char() {ControlChars.Cr, ControlChars.Lf}, StringSplitOptions.RemoveEmptyEntries)
    9. If InStr(s, "\\") <> 0 And InStr(s, ":") <> 0 Then
    10. If InStr(s, "OK") <> 0 Then
    11. 'Verbundenes Netzlaufwerk
    12. Else
    13. 'Nicht verbundenes Netzlaufwerk
    14. Dim s2 = s.Split(New Char() {" "c}, StringSplitOptions.RemoveEmptyEntries)
    15. Dim LaufwerksBuchstabe As String = ""
    16. Dim URL As String = ""
    17. For i As Integer = 0 To s2.Count - 1
    18. If InStr(s2(i), ":") <> 0 Then LaufwerksBuchstabe = s2(i)
    19. If InStr(s2(i), "\\") <> 0 Then URL = s2(i)
    20. Next
    21. 'MsgBox("Nicht verbunden: " + vbCrLf + LaufwerksBuchstabe + vbCrLf + URL)
    22. Map(LaufwerksBuchstabe)
    23. End If
    24. End If
    25. Next
    26. End Sub
    27. ''' <summary>
    28. ''' Verbindet nicht verbundene Netzlaufwerke
    29. ''' Der Übergabeparameter ist der Laufwerksbuchstabe mit Doppelpunkt
    30. ''' </summary>
    31. ''' <param name="drive"></param>
    32. ''' <remarks></remarks>
    33. Public Sub Map(drive As String)
    34. If Not New DriveInfo(drive).IsReady Then
    35. Try
    36. Process.Start(New ProcessStartInfo() With {.FileName = "explorer", .Arguments = drive & Convert.ToString("\"), .WindowStyle = ProcessWindowStyle.Minimized})
    37. Thread.Sleep(500)
    38. For Each p As Process In Process.GetProcessesByName("explorer")
    39. If p.MainWindowTitle.EndsWith((Convert.ToString("(") & drive) + ":)", StringComparison.CurrentCultureIgnoreCase) Then
    40. p.Kill()
    41. End If
    42. Next
    43. Catch
    44. End Try
    45. End If
    46. End Sub
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at