vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Zippen wie die Profis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Dienst Anmeldung an SMB mit anderen Credentials 
Autor: Tomahawk
Datum: 19.04.18 09:44

Moinsen,

arbeite momentan an einem Windows-Dienst, der einer Freigabe auf einem entfernten Windows-Rechners, der nicht Mitglied der Domäne ist, auf neuen CSV-Dateien überwachen soll. Diese CSV-Dateien enthalten Protokolldaten und werden von einer SPS-Steuerung dort abgelegt, die ich dann in einer DB einspielen möchte.
Für die Anmeldung habe ich dem Dienst via INI-Datei Anmeldedaten zur Verfügung gestellt, die richtig sind. Der Dienst, der auf einem Win2k8r2 im Kontext des lokalen Systems laufen soll, erhält aber "Zugriff verweigert".

 
Dim strUsername as String, sstrSPassword As SecureString
'
' ... Username und Password zusammenstellen...bla bla
For Each c As Char In strPlainTextPassword.ToCharArray
  sstrSPassword.AppendChar(c)
Next
'
'
Dim ncLoginSource As New NetworkCredential(strSUsername, sstrSPassword, _
  "MeineDOMÄNE")
Dim ccSource As New CredentialCache
Dim strFolderContent() As String
 
' strSPath = \\Hostname\Freigabe_Name$
ccSource.Add(New Uri(strSPath), "Basic", ncLoginSource)
' Sobald der Dienst den Inhalt des Ordners auflisten möchte, erhält er die 
' Ablehnung.
strFolderContent = System.IO.Directory.GetFiles(strSPath)
Wenn ich eine Freigabe innerhalb der Domäne nutze, und den Dienst im Kontext eines berechtigten Users laufen lasse, ist die Anmeldung erfolgreich. Dies ist aber nicht mein favorisierter Weg über einen extra Service-User.
Hat jemand eine Idee wie der Dienst eine zusätzliche Anmeldung/Authentfizierung an dem entfernten System durchführen kann?

Danke Euch schon mal

LG Tomahawk

Die Zeit ist der größte Feind des Menschen.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Dienst Anmeldung an SMB mit anderen Credentials 
Autor: Jabberwock_v6
Datum: 04.06.18 23:34

Hallo,

ich schmeiße Dir das mal einfach so hin.
Musst Du dir aber noch anpassen.


Public Class clsNetwork
    Public 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
    Public Declare Function WNetCancelConnection2 Lib "mpr" Alias _
    "WNetCancelConnection2A" (ByVal lpName As String, ByVal dwFlags As Integer, _
    ByVal fForce As Integer) As Integer
    Public Const ForceDisconnect As Integer = 1
    Public Const RESOURCETYPE_DISK As Long = &H1
 
    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
 
    Public Shared Function ConnectServer(ByVal Pfad As String, ByVal _
      Driveletter As String) As Integer
 
        If Not My.Computer.Network.IsAvailable Then
            MsgBox("Du hast keine Netzwerkverbindung!")
            Return -1
        Else
 
            Dim Host As String = ""
 
            If Pfad.IndexOf("\\", 0, 2) >= 0 Then
                Host = Pfad.Replace("\\", "")
                Host = Host.Substring(0, Host.IndexOf("\"))
            End If
 
 
 
            If Host = "10.209.76.50" Or Host = "Siplaceserver" Then
                If System.IO.Directory.Exists(Pfad) = False Then
                    'Wenn kein Laufwerksbuchstabe angegeben wird wird auch kein 
                    ' Laufwerk angelegt. Der Zugriff ist aber über UNC 
                    ' möglich!!!
                    'Usage: mapdrive(driveletter with ":", uncpath, username, 
                    ' password). Use "Nothing" without quotes if username or 
                    ' password are blank
                    clsNetwork.MapDrive(Driveletter, Pfad, "Administrator", _
                      "xxxx")
                End If
 
            ElseIf Host = "cgdtr0510" Then
                If System.IO.Directory.Exists(Pfad) = False Then
                    'Wenn kein Laufwerksbuchstabe angegeben wird wird auch kein 
                    ' Laufwerk angelegt. Der Zugriff ist aber über UNC 
                    ' möglich!!!
                    'Usage: mapdrive(driveletter with ":", uncpath, username, 
                    ' password). Use "Nothing" without quotes if username or 
                    ' password are blank
                    clsNetwork.MapDrive(Driveletter, Pfad, _
                      "cgdtr0510\Administrator", "xxxxx")
                End If
            Else
                If System.IO.Directory.Exists(Pfad) = False Then
                    'Wenn kein Laufwerksbuchstabe angegeben wird wird auch kein 
                    ' Laufwerk angelegt. Der Zugriff ist aber über UNC 
                    ' möglich!!!
                    'Usage: mapdrive(driveletter with ":", uncpath, username, 
                    ' password). Use "Nothing" without quotes if username or 
                    ' password are blank
                    clsNetwork.MapDrive(Driveletter, Pfad, Host & "\" & _
                      My.Settings.RemoteUser, My.Settings.RemotePW)
 
                End If
            End If
 
 
 
        End If
 
            Return 0
 
    End Function
 
 
 
    'Function to map drive/connect to drive
    Public Shared Function MapDrive(ByVal DriveLetter As String, ByVal UNCPath _
      As String, ByVal strUsername As String, ByVal strPassword As String) As _
      Boolean
 
        Dim nr As NETRESOURCE
 
        nr = New NETRESOURCE
        nr.lpRemoteName = UNCPath
        nr.lpLocalName = DriveLetter
 
        nr.dwType = RESOURCETYPE_DISK
 
        Dim result As Integer
        Try
            result = WNetAddConnection2(nr, strPassword, strUsername, 0)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
 
 
 
        If result = 0 Then
            Return True
        Else
            Return False
        End If
 
    End Function
 
    'Function to disconnect from drive
    Public Shared Function UnMapDrive(ByVal DriveLetter As String) As Boolean
        Dim rc As Integer
        rc = WNetCancelConnection2(DriveLetter & ":", 0, ForceDisconnect)
 
        If rc = 0 Then
            Return True
        Else
            Return False
        End If
 
    End Function
 
End Class
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Dienst Anmeldung an SMB mit anderen Credentials 
Autor: Tomahawk
Datum: 05.06.18 10:37

Moin Jabberwock_v6,

Danke für den Code, der mich schon etwas weitergebracht hat. Leider stehe ich aber genau vor dem gleichen Problem, dass sich der Dienst, der ja im Kontext des lokalen Systemkontos läuft, bei der Remote-Freigabe nicht mit den Anmeldedaten versucht anzumelden, die ich ihm explizit gegeben habe.

Auf dem Server, der die Freigabe hostet, kann man in der Computerverwaltung unter Freigaben/Sitzungen genau sehen, dass dort eine Sitzung mit dem Rechnername$, also dem Computerkonto angemeldet ist. Warum werden die mitgegebenen Anmeldedaten denn überschrieben?

Hat da jemand eine Erklärung für?

Die Zeit ist der größte Feind des Menschen.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Dienst Anmeldung an SMB mit anderen Credentials 
Autor: Jabberwock_v6
Datum: 05.06.18 13:53

Ich weiß nicht genau was Du meinst.

Ich habe bei mir im Code die Anmeldedaten hinterlegt.
Das ist nicht schön aber es funktioniert...

Im Grunde bauchst Du nur die Zeile

 MapDrive(Driveletter, Pfad, "Administrator", "xxxx")
Und natürlich die Funktion dazu.
Die stand ja darunter.

Die Anmeldedaten müssen natürlich im Richtigen Format kommen.
Also eventuell mit Domäne oder Rechnename vorweg.


Bei dem was ich Dir gegeben hatte versucht er vorher die Freigabe mit dem angemeldeten User zu erreichen, wenn das funktioniert macht er keine neue Anmeldung.
Aber so wie Du es sagst dürfte die Freigabe ja nicht erreichbar sein. Dann sollte er mit den übergeben Userdaten die Verbindung erstellen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Dienst Anmeldung an SMB mit anderen Credentials 
Autor: effeff
Datum: 06.06.18 10:44

Der Systemaccount dürfte nicht genug Rechte haben, sich mit Shares zu verbinden. Wahrscheinlich bleibt hier nur über, die Aktionen über einen spezielles Konto mit User-Privilegien durchzuführen.

EALA FREYA FRESENA

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Dienst Anmeldung an SMB mit anderen Credentials 
Autor: Tomahawk
Datum: 06.06.18 14:42

Hallo zusammen,

es funktioniert jetzt, wie erwartet.
Ich habe das mit dem WNetAddConnection2 aus Jabberwock_v6' Vorschlag probiert. Bin erst beim mehrfachen prüfen darauf gestoßen, dass Username und Password ja in der anderen Reihenfolge bei der API angegeben werden mussten, war wohl etwas zu voreilig.
Damit klappt es jetzt ....als Dienst, der auf einem Domänen-Computer im Kontext des lokalen Systems läuft.
Private Function MapRemoteShare(ByVal strShare As String) As Boolean
 
    Dim bolReturn As Boolean = False, intResult As Integer = -1, nrMap As _
      NETRESOURCE
 
    Try
        If My.Computer.Network.IsAvailable Then
 
            nrMap = New NETRESOURCE
            nrMap.lpRemoteName = strSPath
            nrMap.lpLocalName = "X:"
            nrMap.dwType = RESOURCETYPE_DISK
 
            Try
                intResult = WNetAddConnection2(nrMap, GetUnsecureString( _
                  sstrSPassword), strSUsername, 0)
 
            Catch ex As Exception
                WriteProtocolEntry(ex.Message & vbCrLf & ex.StackTrace, _
                  ProtocolType.Warning, False)
            Finally
                If intResult = 0 Then bolReturn = True Else bolReturn = False                    
            End Try
 
        End If
 
    Catch ex As Exception
        WriteProtocolEntry(ex.Message & vbCrLf & ex.StackTrace, _
          ProtocolType.Warning, False)
    End Try
 
    Return bolReturn
 
End Function
Danke für die Hilfe.

Die Zeit ist der größte Feind des Menschen.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel