| |
VB.NET - FortgeschritteneDienst 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. | |
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 | |
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. | |
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. | |
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 | |
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. | |
| 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 |
|
|
sevWizard für VB5/6
Professionelle Assistenten im Handumdrehen
Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|