Netzwerk Laufwerk auslesen

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von GOKTerek.

    Netzwerk Laufwerk auslesen

    Hallo,

    aktuell versuche ich, die Ordner eines Netzwerklaufwerks auszulesen. Hierfür habe ich, jedoch nur den Server aus der SQL-Datenbank auslesen können.

    jetzt muss ich jedoch herausfinden, wo die gesuchten Dateien liegen. Natürlich weiß ich jetzt wie der ordner heißt, jedoch kann sich das zukünftig auch ändern, deshalb wollte ich gerne die Ordner auslesen.

    in dem fall habe ich die Alias Adresse "\\SWArchiv.***.***.**", das drive ist nicht gemappt und soll auch nicht gemappt werden!!! siehe Bild im Anhang.

    io.directoryinfo geht nicht :) .
    Bilder
    • Netzwerk.PNG

      19,68 kB, 430×429, 151 mal angesehen
    Hi,

    die Basis findest Du hier: https://www.codeproject.com/Questions/572248/GetplusFilesplusFromplusUNCplusPath

    Dann musst Du nur noch eine rekursive Funktionalität drum herum bauen.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Das hatte ich ja getestet, jedoch wie ich schon sagte, ich muss mir die Ordner anzeigen lassen von "\\swarchiv.***.***.**".
    Ich kann mit mit den Io.****** befehlen nur mit angabe eines ordners auslesen.

    System.ArgumentException: "Der UNC-Pfad muss folgendes Format haben: \\server\share."

    d.h ich muss angeben "\\swarchiv.***.***.**\PDMArchiv\" um die dateien anzuzeigen. Jeodoch kann sich "PDMArchiv" ändern in" CADArchiv" als bsp.!
    Ich habe nur den Server :) !
    @HenryV, Perfekt das war es wonach ich gesucht habe, hat auf anhieb funktioniert. Zwar bekomme ich die Info, das der "Acces Denied" ist auf die Ordner(was mich wunderd da ich definitiv darauf zugreifen kann! Falls hierfür eine Erklärung da ist, würde ich die gerne hören ansonsten auch ok). Dennoch konnte ich die auslesen.

    GOKTerek schrieb:

    Zwar bekomme ich die Info, das der "Acces Denied" ist
    Bei welcher Abfrage?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Bei der Function GetSharedFromHost. Hier bekommst du ein Sharecollection list object zurück, da steht der Pfad etc. drinn.
    Es wird alles abgerufen, jedoch steht überall in der Info Path 'Acces Denied'. Ich kann mir das nur so vorstellen, das er als User den Application Namen zur abfrage angibt, bin mir aber nicht sicher.
    Das Finally musste ich erstmal auskommentieren, da es da immer zum Fehler gekommen ist.

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System
    3. Imports System.Runtime.InteropServices
    4. Imports System.Text
    5. Public Class Folder_Functions_Network
    6. Public ServerShareCollection As ShareCollection
    7. Public Structure ShareType
    8. Dim Name As String
    9. Dim Path As String
    10. Dim Type As Integer
    11. Dim Remark As String
    12. End Structure
    13. Public Structure ShareCollection
    14. Dim Shares() As ShareType
    15. Dim ShareCount As Integer
    16. Sub Clear()
    17. Shares = Nothing
    18. End Sub
    19. Sub Add(ByVal Name As String, ByVal Path As String, ByVal Type As Integer, ByVal Remark As String)
    20. If Shares Is Nothing Then
    21. ReDim Shares(0)
    22. Shares(0).Name = Name
    23. Shares(0).Path = Path
    24. Shares(0).Type = Type
    25. Shares(0).Remark = Remark
    26. Else
    27. ReDim Preserve Shares(Shares.Length)
    28. Shares(Shares.Length - 1).Name = Name
    29. Shares(Shares.Length - 1).Path = Path
    30. Shares(Shares.Length - 1).Type = Type
    31. Shares(Shares.Length - 1).Remark = Remark
    32. End If
    33. If Type = 0 Then ShareCount = ShareCount + 1
    34. End Sub
    35. End Structure
    36. Declare Unicode Function NetShareEnum Lib "netapi32.dll" (ByVal ServerName As StringBuilder, ByVal level As Integer,
    37. ByRef BufPtr As IntPtr,
    38. ByVal prefmaxbufferlen As Integer,
    39. ByRef entriesread As Integer,
    40. ByRef totalentries As Integer,
    41. ByRef resume_handle As Integer) As Integer
    42. Declare Unicode Function NetShareGetInfo Lib "netapi32.dll" (ByVal ServerName As String,
    43. ByVal ShareName As String,
    44. ByVal Level As Integer,
    45. ByRef BufPtr As IntPtr) As Integer
    46. 'Declare Unicode Function NetApiBufferFree Lib "netapi32.dll" (ByRef buffer As IntPtr) As Long
    47. #Region "Constants"
    48. Const MAX_PREFERRED_LENGTH As Integer = -1 ' originally 0
    49. Const ERROR_SUCCESS As Long = 0& ' No errors encountered.
    50. Const NERR_Success As Long = 0&
    51. Const ERROR_ACCESS_DENIED As Long = 5& ' The user has insufficient privilege for this operation.
    52. Const ERROR_NOT_ENOUGH_MEMORY As Long = 8& ' Not enough memory
    53. Const ERROR_NETWORK_ACCESS_DENIED As Long = 65& ' Network access is denied.
    54. Const ERROR_INVALID_PARAMETER As Long = 87& ' Invalid parameter specified.
    55. Const ERROR_BAD_NETPATH As Long = 53& ' The network path was not found.
    56. Const ERROR_INVALID_NAME As Long = 123& ' Invalid name
    57. Const ERROR_INVALID_LEVEL As Long = 124& ' Invalid level parameter.
    58. Const ERROR_MORE_DATA As Long = 234& ' More data available, buffer too small.
    59. Const NERR_BASE As Long = 2100&
    60. Const NERR_NetNotStarted As Long = 2102& ' Device driver not installed.
    61. Const NERR_RemoteOnly As Long = 2106& ' This operation can be performed only on a server.
    62. Const NERR_ServerNotStarted As Long = 2114& ' Server service not installed.
    63. Const NERR_BufTooSmall As Long = 2123& ' Buffer too small for fixed-length data.
    64. Const NERR_RemoteErr As Long = 2127& ' Error encountered while remotely. executing function
    65. Const NERR_WkstaNotStarted As Long = 2138& ' The Workstation service is not started.
    66. Const NERR_BadTransactConfig As Long = 2141& ' The server is not configured for this transaction; IPC$ is not shared.
    67. Const NERR_NetNameNotFound As Long = (NERR_BASE + 210) ' Sharename not found.
    68. Const NERR_InvalidComputer As Long = 2351& ' Invalid computername specified.
    69. #End Region ' "Constants"
    70. #Region "API Calls With Structures"
    71. <StructLayout(LayoutKind.Sequential)>
    72. Structure SHARE_INFO_1
    73. <MarshalAs(UnmanagedType.LPWStr)> Dim netname As String
    74. Public ShareType As Integer
    75. <MarshalAs(UnmanagedType.LPWStr)> Dim Remark As String
    76. End Structure
    77. <StructLayout(LayoutKind.Sequential)>
    78. Structure SHARE_INFO_2
    79. <MarshalAs(UnmanagedType.LPWStr)> Dim shi2_netname As String
    80. Dim shi2_type As Integer
    81. <MarshalAs(UnmanagedType.LPWStr)> Dim shi2_remark As String
    82. Dim shi2_permissions As Integer
    83. Dim shi2_max_uses As Integer
    84. Dim shi2_current_uses As Integer
    85. <MarshalAs(UnmanagedType.LPWStr)> Dim shi2_path As String
    86. <MarshalAs(UnmanagedType.LPWStr)> Dim shi2_passwd As String
    87. End Structure
    88. #End Region ' "API Calls With Structures"
    89. Public Function GetSharesFromHost(ByVal server As String) As ShareCollection
    90. Dim Shares As New ShareCollection
    91. Shares.Clear()
    92. Dim level As Integer = 2
    93. Dim svr As New StringBuilder(server)
    94. Dim entriesRead As Integer, totalEntries As Integer, nRet As Integer, hResume As Integer = 0
    95. Dim pBuffer As IntPtr = IntPtr.Zero
    96. Try
    97. nRet = NetShareEnum(svr, level, pBuffer, -1, entriesRead, totalEntries, hResume)
    98. If ERROR_ACCESS_DENIED = nRet Then
    99. 'Need admin for level 2, drop to level 1
    100. level = 1
    101. nRet = NetShareEnum(svr, level, pBuffer, -1, entriesRead, totalEntries, hResume)
    102. End If
    103. If 0 = nRet AndAlso entriesRead > 0 Then
    104. Dim t As Type = CType(IIf((2 = level), GetType(SHARE_INFO_2), GetType(SHARE_INFO_1)), Type)
    105. Dim offset As Integer = Marshal.SizeOf(t)
    106. Dim i As Integer = 0, lpItem As Integer = pBuffer.ToInt32()
    107. While i < entriesRead
    108. Dim pItem As New IntPtr(lpItem)
    109. If 1 = level Then
    110. Dim si As SHARE_INFO_1 = DirectCast(Marshal.PtrToStructure(pItem, t), SHARE_INFO_1)
    111. Shares.Add(si.netname, "Access Denied", si.ShareType, si.Remark)
    112. Else
    113. Dim si As SHARE_INFO_2 = DirectCast(Marshal.PtrToStructure(pItem, t), SHARE_INFO_2)
    114. Shares.Add(si.shi2_netname, si.shi2_path, si.shi2_type, si.shi2_remark)
    115. End If
    116. i += 1
    117. lpItem += offset
    118. End While
    119. End If
    120. Return Shares
    121. 'Finally
    122. ' Clean up buffer allocated by system
    123. 'If IntPtr.Zero <> pBuffer Then
    124. ' NetApiBufferFree(pBuffer)
    125. 'End If
    126. 'End Try
    127. Catch ex As Exception
    128. Return Shares
    129. End Try
    130. End Function
    131. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „GOKTerek“ ()

    GOKTerek schrieb:

    Bei der Function GetSharedFromHost.
    Wo finde ich die? Wo wird die aufgerufen?
    ====
    Was muss ich tun, um den Effekt zu reproduzieren?
    Und:
    Statt

    VB.NET-Quellcode

    1. Dim Shares() As ShareType
    machst Du

    VB.NET-Quellcode

    1. Dim Shares As New List(Of ShareType)

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany,

    ich habe ein Klasse aus dem Code erstellt, da.h du kannst den Code als Klasse in einem neuen WPF oder Form Projekt hinzufügen.
    In die Form/WPF legts du einen Button. In dem Button.Click befehl rufst du die Klasse mit GetsharesFromHost auf.

    Bei mir sieht das etwas anders aus da ich vorher noch SQL Daten Auslese.

    Achtung Code ist noch fehlerhaft, da bin ich gerade dabei, das zu lösen!!!

    VB.NET-Quellcode

    1. Private Sub StartCopyProcess(ByVal Source_PDM_System As String, ByVal Destination_PDM_System As String) Handles GOK_Copy_PDM_System.StartCopyProcess
    2. PDMSystem_Information = New DataTable
    3. AddColumnsPDMSystem_Information()
    4. AddNeedInformations(Source_PDM_System, Destination_PDM_System)
    5. GOK_Copy_PDM_System.AddDatatable(PDMSystem_Information)
    6. SQLFunctions.GetInformations(PDMSystem_Information)
    7. For Each SelectedRow As DataRow In PDMSystem_Information.Rows
    8. If CStr(SelectedRow("Table_CLM")) = "NetworkFileReader" Then
    9. Dim FoundRow() As DataRow = PDMSystem_Information.Select("PDM_Type = '" & CStr(SelectedRow("PDM_System")) & "'") 'Hier ist der Fehler
    10. For Each Second_SelectedRow As DataRow In FoundRow
    11. If CStr(Second_SelectedRow("Table_Name")) = "SystemInfo" Then
    12. SelectedRow("Desc_Value") = GetPDM_ArchiveLocation(CStr(SelectedRow("PDM_System")), "\\" & CStr(Second_SelectedRow("Desc_Value")))
    13. End If
    14. Next
    15. End If
    16. Next
    17. NewWindow.UpdateLayout()
    18. End Sub
    19. Private Function GetPDM_ArchiveLocation(ByVal PDM_System As String, ByVal ServerAdress As String) As String
    20. GOK_FolderFunctions_Network = New GOK_Main_Functions.GOK_Folder_Functions_Network
    21. Dim SharedFolderResult As GOK_Main_Functions.GOK_Folder_Functions_Network.ShareCollection = GOK_FolderFunctions_Network.GetSharesFromHost(ServerAdress)
    22. Dim Returning_PDM_ArchivLocation As String = ""
    23. If Not IsDBNull(SharedFolderResult) Then
    24. For Each SharedFolder As ShareType In SharedFolderResult.Shares
    25. If SharedFolder.Name <> "" Then
    26. If SharedFolder.Name = PDM_System Then
    27. Returning_PDM_ArchivLocation = ServerAdress & "\" & SharedFolder.Name
    28. Else
    29. Dim SharedDirectoryInfo As New IO.DirectoryInfo(ServerAdress & "\" & SharedFolder.Name)
    30. Try
    31. ' Hier währe die Acces geschichte Interessant gewesen, jedoch habe ich ja überall 'Acces Denied' gehabt, obwohl ich zugriffsrechte habe
    32. For Each Subfolder As IO.DirectoryInfo In SharedDirectoryInfo.GetDirectories(PDM_System, IO.SearchOption.AllDirectories)
    33. Dim SWFiles As IO.FileInfo() = Subfolder.GetFiles("*.sld*", IO.SearchOption.AllDirectories)
    34. If SWFiles.Length >= 500 Then
    35. Returning_PDM_ArchivLocation = Subfolder.FullName.Replace(PDM_System, "")
    36. End If
    37. Next
    38. Catch ex As Exception
    39. End Try
    40. End If
    41. End If
    42. Next
    43. End If
    44. Return Returning_PDM_ArchivLocation
    45. End Function
    @GOKTerek Dein Code oben funktioniert bestens.
    Ich hab ihn mal leicht aufgeräumt, die Klasse umbenannt, aus der Struct eine Klasse gemacht und deren Instanzen in eine List(Of T) gepackt. Die Information "Access Denied" steckt nun m Member .Valid.
    Interessant ist die überladene Funktion ToString(), da kannst Du im Debug per Mouseklick die Namen aller gefundenen Laufwerke ansehen.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Imports System.Text
    3. Public Class NetworkFolderFunctions
    4. 'Public ServerShareCollection As ShareCollection
    5. Public Structure ShareType
    6. Dim Name As String
    7. Dim Path As String
    8. Dim Type As Integer
    9. Dim Remark As String
    10. Dim Valid As Boolean
    11. Public Overrides Function ToString() As String
    12. Return $"{Name} => {Path} ({If(Valid, "valid", "invalid")})"
    13. End Function
    14. End Structure
    15. Public Class ShareCollection
    16. ReadOnly Shares As New List(Of ShareType)
    17. 'Dim ShareCount As Integer
    18. Sub Clear()
    19. Shares.Clear()
    20. End Sub
    21. Sub Add(Name As String, Path As String, Type As Integer, Remark As String)
    22. Dim st As ShareType
    23. st.Name = Name
    24. st.Path = Path
    25. st.Type = Type
    26. st.Remark = Remark
    27. st.Valid = Type = 0
    28. Shares.Add(st)
    29. End Sub
    30. End Class
    31. Declare Unicode Function NetShareEnum Lib "netapi32.dll" (ServerName As StringBuilder, level As Integer,
    32. ByRef BufPtr As IntPtr,
    33. prefmaxbufferlen As Integer,
    34. ByRef entriesread As Integer,
    35. ByRef totalentries As Integer,
    36. ByRef resume_handle As Integer) As Integer
    37. Declare Unicode Function NetShareGetInfo Lib "netapi32.dll" (ServerName As String, ShareName As String, Level As Integer, ByRef BufPtr As IntPtr) As Integer
    38. 'Declare Unicode Function NetApiBufferFree Lib "netapi32.dll" (ByRef buffer As IntPtr) As Long
    39. #Region "Constants"
    40. Const MAX_PREFERRED_LENGTH As Integer = -1 ' originally 0
    41. Const ERROR_SUCCESS As Long = 0& ' No errors encountered.
    42. Const NERR_Success As Long = 0&
    43. Const ERROR_ACCESS_DENIED As Long = 5& ' The user has insufficient privilege for this operation.
    44. Const ERROR_NOT_ENOUGH_MEMORY As Long = 8& ' Not enough memory
    45. Const ERROR_NETWORK_ACCESS_DENIED As Long = 65& ' Network access is denied.
    46. Const ERROR_INVALID_PARAMETER As Long = 87& ' Invalid parameter specified.
    47. Const ERROR_BAD_NETPATH As Long = 53& ' The network path was not found.
    48. Const ERROR_INVALID_NAME As Long = 123& ' Invalid name
    49. Const ERROR_INVALID_LEVEL As Long = 124& ' Invalid level parameter.
    50. Const ERROR_MORE_DATA As Long = 234& ' More data available, buffer too small.
    51. Const NERR_BASE As Long = 2100&
    52. Const NERR_NetNotStarted As Long = 2102& ' Device driver not installed.
    53. Const NERR_RemoteOnly As Long = 2106& ' This operation can be performed only on a server.
    54. Const NERR_ServerNotStarted As Long = 2114& ' Server service not installed.
    55. Const NERR_BufTooSmall As Long = 2123& ' Buffer too small for fixed-length data.
    56. Const NERR_RemoteErr As Long = 2127& ' Error encountered while remotely. executing function
    57. Const NERR_WkstaNotStarted As Long = 2138& ' The Workstation service is not started.
    58. Const NERR_BadTransactConfig As Long = 2141& ' The server is not configured for this transaction; IPC$ is not shared.
    59. Const NERR_NetNameNotFound As Long = (NERR_BASE + 210) ' Sharename not found.
    60. Const NERR_InvalidComputer As Long = 2351& ' Invalid computername specified.
    61. #End Region ' "Constants"
    62. #Region "API Calls With Structures"
    63. <StructLayout(LayoutKind.Sequential)>
    64. Structure ShareInfo1
    65. <MarshalAs(UnmanagedType.LPWStr)> Dim netname As String
    66. Public ShareType As Integer
    67. <MarshalAs(UnmanagedType.LPWStr)> Dim Remark As String
    68. End Structure
    69. <StructLayout(LayoutKind.Sequential)>
    70. Structure ShareInfo2
    71. <MarshalAs(UnmanagedType.LPWStr)> Dim shi2_netname As String
    72. Dim shi2_type As Integer
    73. <MarshalAs(UnmanagedType.LPWStr)> Dim shi2_remark As String
    74. Dim shi2_permissions As Integer
    75. Dim shi2_max_uses As Integer
    76. Dim shi2_current_uses As Integer
    77. <MarshalAs(UnmanagedType.LPWStr)> Dim shi2_path As String
    78. <MarshalAs(UnmanagedType.LPWStr)> Dim shi2_passwd As String
    79. End Structure
    80. #End Region ' "API Calls With Structures"
    81. Public Function GetSharesFromHost(server As String) As ShareCollection
    82. Dim Shares As New ShareCollection
    83. Shares.Clear()
    84. Dim level As Integer = 2
    85. Dim svr As New StringBuilder(server)
    86. Dim entriesRead As Integer, totalEntries As Integer, nRet As Integer, hResume As Integer = 0
    87. Dim pBuffer As IntPtr = IntPtr.Zero
    88. Try
    89. nRet = NetShareEnum(svr, level, pBuffer, -1, entriesRead, totalEntries, hResume)
    90. If ERROR_ACCESS_DENIED = nRet Then
    91. 'Need admin for level 2, drop to level 1
    92. level = 1
    93. nRet = NetShareEnum(svr, level, pBuffer, -1, entriesRead, totalEntries, hResume)
    94. End If
    95. If 0 = nRet AndAlso entriesRead > 0 Then
    96. Dim t As Type = CType(IIf((2 = level), GetType(ShareInfo2), GetType(ShareInfo1)), Type)
    97. Dim offset As Integer = Marshal.SizeOf(t)
    98. Dim i As Integer = 0, lpItem As Integer = pBuffer.ToInt32()
    99. While i < entriesRead
    100. Dim pItem As New IntPtr(lpItem)
    101. If 1 = level Then
    102. Dim si As ShareInfo1 = DirectCast(Marshal.PtrToStructure(pItem, t), ShareInfo1)
    103. Shares.Add(si.netname, "Access Denied", si.ShareType, si.Remark)
    104. Else
    105. Dim si As ShareInfo2 = DirectCast(Marshal.PtrToStructure(pItem, t), ShareInfo2)
    106. Shares.Add(si.shi2_netname, si.shi2_path, si.shi2_type, si.shi2_remark)
    107. End If
    108. i += 1
    109. lpItem += offset
    110. End While
    111. End If
    112. Return Shares
    113. 'Finally
    114. ' Clean up buffer allocated by system
    115. 'If IntPtr.Zero <> pBuffer Then
    116. ' NetApiBufferFree(pBuffer)
    117. 'End If
    118. 'End Try
    119. Catch ex As Exception
    120. Return Shares
    121. End Try
    122. End Function
    123. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo @RodFromGermany, danke für die Blumen(wenn ich eins kann dann Copy and paste) aber das ist nicht mein code , der ist von dem Link den @HenryV gepostet hat.
    Danke, für die Änderungen ich schau mir das gleich mal an :-)!
    Guten Morgen @RodFromGermany,

    funktioniert. Musste nur Zeile 21 ändern. Hier konnte ich nicht auf die Liste zugreifen, da nicht Public.

    VB.NET-Quellcode

    1. Public ReadOnly Shares As New List(Of ShareType)


    zumindest habe ich evtl. eine Lösung zu meinem Try Catch gepfusche, beim auslesen der Shared Folder gefunden.

    Bei der Abfrage, bekomme ich ja ST.Name, ST.Path , ST-Valid zurück. Hier könnte ich ST.Valid abfragen und spare mir das Try Catch. Ich lasse das Try Catch dennoch erstmal drin um unbekannte Fehler zu finden.

    Danke an @HenryV(was ist eingentlich mit den anderen 4 Henry'S passiert) und @RodFromGermany.