Dateihandling auf geschütztem UNC-Pfad

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

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von tragl.

    Um ok ich sehe den Fehler, dein übersetzter Code ruft nie die NetUseDelete Methode auf.

    C#-Quellcode

    1. public void Dispose()
    2. {
    3. if (!this.disposed)
    4. {
    5. NetUseDelete();
    6. }
    7. disposed = true;
    8. GC.SuppressFinalize(this);
    9. }
    @slice
    Ok, ich hab das nochmal neu übersetzt und Dispose müsste nun korrekt drin sein, NetUseDelete wird nun auch aufgerufen.
    Ich bin aber nochmal ein kleines Stück weiter. Ich hab mal den Namen TRAGL-NAS durch die IP ersetzt und schon kam ich wieder drauf.
    Parallel dazu hab ich auf dem Firmen-Laptop mal versucht die Live-Freigabe zu mappen mit NET USE, da kam mir dann Fehler 1219, der dort sagt
    Mehrfache Verbindungen zu einem Server oder einer freigegebenen Ressource von demselben Benutzer unter Verwendung mehrerer Benutzernamen sind nicht zulässig. Trennen Sie alle früheren Verbindungen zu dem Server bzw. der freigegebenen Ressource, und versuchen Sie es erneut.


    Die gleiche Fehlernummer hatte ich auf meiner Testumgebung mit TRAGL-NAS anstatt IP.


    Wird also - selbst wenn das mit dem Freigabeproblem im Firmennetz gelöst wurde - trotzdem knallen. Denn die User sind ja logischerweise mit ihrem
    Windows-Account unterwegs und das Programm versucht ja dann den User unter dem Benutzer für den Storage anzumelden, das wäre ja das gleiche Szenario wie bei mir daheim...

    neue Übersetzung:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System
    2. Imports System.Runtime.InteropServices
    3. Imports BOOL = System.Boolean
    4. Imports DWORD = System.UInt32
    5. Imports LPWSTR = System.String
    6. Imports NET_API_STATUS = System.UInt32
    7. Namespace ConnectUNCWithCredentials
    8. Public Class UNCAccessWithCredentials
    9. Implements IDisposable
    10. <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
    11. Friend Structure USE_INFO_2
    12. Friend ui2_local As LPWSTR
    13. Friend ui2_remote As LPWSTR
    14. Friend ui2_password As LPWSTR
    15. Friend ui2_status As DWORD
    16. Friend ui2_asg_type As DWORD
    17. Friend ui2_refcount As DWORD
    18. Friend ui2_usecount As DWORD
    19. Friend ui2_username As LPWSTR
    20. Friend ui2_domainname As LPWSTR
    21. End Structure
    22. <DllImport("NetApi32.dll", SetLastError:=True, CharSet:=CharSet.Unicode)>
    23. Friend Shared Function NetUseAdd(ByVal UncServerName As LPWSTR, ByVal Level As DWORD, ByRef Buf As USE_INFO_2, <Out> ByRef ParmError As DWORD) As NET_API_STATUS
    24. End Function
    25. <DllImport("NetApi32.dll", SetLastError:=True, CharSet:=CharSet.Unicode)>
    26. Friend Shared Function NetUseDel(ByVal UncServerName As LPWSTR, ByVal UseName As LPWSTR, ByVal ForceCond As DWORD) As NET_API_STATUS
    27. End Function
    28. Private disposed As Boolean = False
    29. Private sUNCPath As String
    30. Private sUser As String
    31. Private sPassword As String
    32. Private sDomain As String
    33. Private iLastError As Integer
    34. Public Sub New()
    35. End Sub
    36. Public ReadOnly Property LastError As Integer
    37. Get
    38. Return iLastError
    39. End Get
    40. End Property
    41. Public Sub Dispose() Implements IDisposable.Dispose
    42. If Not Me.disposed Then
    43. NetUseDelete()
    44. End If
    45. disposed = True
    46. GC.SuppressFinalize(Me)
    47. End Sub
    48. Public Function NetUseWithCredentials(ByVal UNCPath As String, ByVal User As String, ByVal Domain As String, ByVal Password As String) As Boolean
    49. sUNCPath = UNCPath
    50. sUser = User
    51. sPassword = Password
    52. sDomain = Domain
    53. Return NetUseWithCredentials()
    54. End Function
    55. Private Function NetUseWithCredentials() As Boolean
    56. Dim returncode As UInteger
    57. Try
    58. Dim useinfo As USE_INFO_2 = New USE_INFO_2()
    59. useinfo.ui2_remote = sUNCPath
    60. useinfo.ui2_username = sUser
    61. useinfo.ui2_domainname = sDomain
    62. useinfo.ui2_password = sPassword
    63. useinfo.ui2_asg_type = 0
    64. useinfo.ui2_usecount = 1
    65. Dim paramErrorIndex As UInteger
    66. returncode = NetUseAdd(Nothing, 2, useinfo, paramErrorIndex)
    67. iLastError = CInt(returncode)
    68. Return returncode = 0
    69. Catch
    70. iLastError = Marshal.GetLastWin32Error()
    71. Return False
    72. End Try
    73. End Function
    74. Public Function NetUseDelete() As Boolean
    75. Dim returncode As UInteger
    76. Try
    77. returncode = NetUseDel(Nothing, sUNCPath, 2)
    78. iLastError = CInt(returncode)
    79. Return (returncode = 0)
    80. Catch
    81. iLastError = Marshal.GetLastWin32Error()
    82. Return False
    83. End Try
    84. End Function
    85. Protected Overrides Sub Finalize()
    86. Dispose()
    87. End Sub
    88. End Class
    89. End Namespace
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Ok, du möchtest die Netzwerkfreigabe unter dem Benutzer benutzten, der auch in Windows angemeldet ist?
    Dann kannst du dir das alles sparen und einfach auf den Pfad (Beispiel: {tt]\\server.fqdn\freigabename[/tt]) zugreifen.
    @slice: Das ist mir durchaus bewusst.

    Szenario:

    Das Programm bzw. die Update-Daten liegen auf \\server\tool\app-update
    Auf den Pfad hat Berechtigungsgruppe xy Zugriff.

    Die IT hat einen Unterordner gemacht \\server\tool\storage
    da hat ein extra-user Zugriff drauf - die o.g. Gruppe aber nicht.

    Hintergrund ist der, dass auf dem Storage Dateien abgelegt werden (über das Programm) wo nicht jeder User der Zugriff auf Berechtigungsgruppe XY hat
    drauf Zugreifen darf. Der Zugriff auf die Dateien soll ausschließlich über das Programm erfolgen (dort werden die Berechtigungen entsprechend gesteuert)

    Und nein, man kann das nicht auf Freigabe-Ebene lösen, denn:
    Teamleiter Standort A legt einen Arbeitsvertrag auf dem Storage ab - in seiner Abwesenheit muss aber Teamleiter Standort B oder eine Vertretung drauf
    zugreifen können - alle anderen aber nicht. Sowas lässt sich meiner Meinung nach schlecht bis gar nicht über Freigabeberechtigung lösen, es seidenn da sitzt
    jemand und verwaltet alles Live und in Farbe ;)
    Für mich blieb also die logische Konsequenz:
    - die Freigabe kann nur über einen speziellen User/Passwort erfolgen -> erweist sich nun aber als nicht brauchbar
    - die Freigabe muss versteckt sein (der User kommt also auf \\server\tool sieht den Unterordner Storage und dessen Inhalt nicht
    - eine ganz andere Lösung, nur welche?

    Ich hoffe es ist nun verständlich, was ich möchte?
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Uff ok, da bin ich dann leider auch raus, sorry.

    Als Alternative, wenn es mein Projekt wäre, würde ich wahrscheinlich, wie schon erwähnt wurde eine Zwischenschicht bauen, also eine REST-API die auf einem Server läuft und die gewünschten Daten durch abfragen zur Verfügung stellt.
    Ist aber mit Mehraufwand verbunden, dafür hättest du aber volle Kontrolle darüber wer wie und wo zugreifen kann.
    Jo, das wäre aber ziemlich OP für die an sich kleine Geschichte.
    Ich geh davon aus, dass das in der Zukunft mal mit nem Azure-Storage enden wird,
    allerdings muss ich da noch rausfinden wie ich dateien öffne, ohne vorher lokal zu speichern,
    dazu gibt's schon nen anderen Thread
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup: