Autor Beitrag
m.keller
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Di 02.05.17 15:59 
Hallo Gemeinde der Entwickler ;)

Ich habe nun eine Woche damit verbracht Google auf den Kopf zu stellen, aber es will mir leider nicht gelingen.

Nun hoffe ich auf eure Ideen.

Ich habe eine Windows-dienst erstellt mit .Net (C#)
Dieser soll Daten aus der Datenbank lesen und in einen vom Kunden vorgegebenen Netzwerkpfad in eine Datei schreiben.

Dieses Funktioniert auf dem Lokalen System sehr gut.
Problem ist nun, ich kann nicht auf das Netzlaufwerk zugreifen.
Es sei denn ich nutze die Testoberfläche.
Soviel ich herausgefunden habe wird unter Windows 7 das Netzlaufwerk unter dem User angelegt und nicht für alle zugänglich gemacht.

Nun habe ich mit der advapi32.dll LogonUser (Impersonate) es versucht. Diese Methode ist scheinbar auch nicht Zielführend.
Da bekomme ich entweder Fehlercode 1326 oder 1327 (Marshal.GetLastWin32Error()) zurück.

Wie würdet ihr das sinnvollerweise anstellen?
Ich hatte schon mal überlegt dem Dienst ein eigenes Konto zu spendieren.
Aktuell würde der Dienst mit dem ServiceAccount.LocalSystem installiert.
Alles andere schlägt schon bei der Installation Fehl.
Würde das funktionieren?
Was muss ich dabei beachten?

Moderiert von user profile iconTh69: Titel geändert (Groß/Kleinschreibung korrigiert).

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4421
Erhaltene Danke: 902


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 02.05.17 16:09 
Hat Localsystem kein Recht auf dem Networkshare oder versuchst du über ein Mapping (Laufwerkbuchstabe) auf den Share zuzugreifen und Localsystem kennt dieses MApping einfach nicht hätte aber Rechte auf dem Networkshare?
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Di 02.05.17 16:16 
Der Kunde hat das Laufwerk (Mapping) hinzugefügt. Ich hätte aber auch alle Zugangsdaten.
Auf meinem Entwicklungsrechner, versuche ich das nach zu stellen mit einem Netzlaufwerk.
Aber wenn Localsystem Mapping nicht kennt, wie komm ich dann sonst dran? Mit dem Netzwerkpfad, heißt glaube ich UNC, komm ich mit dem Dienst auch nicht weiter.
Ich Frag in meinem Code ab ob der Ordner Existiert um nicht unnötige Fehler zu generieren

ausblenden C#-Quelltext
1:
2:
 
bool ordnerVorhanden = System.IO.Directory.Exists(pfadNetzwerkOrdner);

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4421
Erhaltene Danke: 902


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 02.05.17 19:50 
Zitat:
Der Kunde hat das Laufwerk (Mapping) hinzugefügt. Ich hätte aber auch alle Zugangsdaten.


Für welchen User hat er das gemacht? Es muss schon der User sein unter dem der Dienst läuft.

Zitat:
Aber wenn Localsystem Mapping nicht kennt, wie komm ich dann sonst dran?


- per UNC Pfad
oder
- Mapping im Context des Users erzeugen unter dem der Dienst läuft
oder
- einen Hardlink/Softlink auf den Networkshare anlegen (siehe mklink Kommando) und diesen benutzen
oder
....

was sich am besten eignet kann man von hier ohne Details nicht sagen. Wenn du das auch nicht weißt lasse den Service beim Start eine an einem auffindbaren Ort abgelegte Batchdatei ausführen. Da kann dann derjenige der die Details weiß das passende drin erledigen. Also z.B ein 'net use' ausführen um das Mapping anzulegen oder ähnliches.
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Di 02.05.17 20:26 
Leider nicht für den User Localsystem.

Ich könnte natürlich auch über die config mir den UNC Pfad angeben lassen.
Leider hatte ich mit dem Pfad bis jetzt kein Erfolg.

So wie es aussieht ist der Pfad auch eine direkte Internet Adresse. Vielleicht kann .net das nicht auflösen.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4421
Erhaltene Danke: 902


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 02.05.17 20:42 
Zitat:
So wie es aussieht ist der Pfad auch eine direkte Internet Adresse.


Häh? Willst du uns sagen du hast einen http/https link oder wie?
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Di 02.05.17 20:47 
Nein das nicht.
Es steckt irgend eine Serverstruktur dahinter (\\xxxx.net\Ordner)

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4421
Erhaltene Danke: 902


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 02.05.17 20:53 
Das ist einfach ein UNC Pfad und natürlich kann Windows (und somit .NET) damit umgehen.
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Di 02.05.17 21:58 
dann verstehe ich nicht warum allein die Überprüfung zum Verzeichnis nicht Funktioniert.

Der UNC Pfad ist genauso angegeben wie in einer Batchdatei um ein Laufwerk zu Mounten.
Pfad /user:username passwort

Ich werde mir morgen mal ein tool schreiben um das besser zu testen.
Danke erst mal

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
Holgerx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55
Erhaltene Danke: 22

Win95 - Win8.1 / MSServer2000 - MSServer2012
Delphi 6pro / XE4
BeitragVerfasst: Mi 03.05.17 06:10 
Hmm..

Vorweg:
LocalSystem hat KEIN Profil, kann somit auch keine Konfiguration ala Laufwerkmapping machen.
Auch hat LocalSystem keine Netzwerk-Rechte, gerade in ner Domaine, da diese u.a. ein Passwort verlangt und es dass nicht gibt.

Wenn Du einen Dienst haben willst, welcher auf einem Netzwerkshare (Egal ob per UNC oder Mapping) Dateien ablegen soll, dann muss dieser mit einer Anmeldung als ein regulärer Windows-User Konfiguriert sein.
In einer Domaine muss eventuell der komplette Name mit Domaine angegeben werden.
Diesem User wird dann das Recht auf das Share eingeräumt.

Kleiner Hint:
Achte darauf, dass dieser User auch auf das lokale Ablageverzeichnis deines Dienst-Programmes Leserechte hat ;)
gerade dann, wenn der Dienst vorher als LocalSystem eingerichtet war.

Des weiteren verwende lieber UNC-Pfade statt mapping!
Um das Mapping einzurichten must Du dich als eben dieser User user anmelden und das Mapping dann persistent einrichten. Ein dynamisches Einrichten per script scheidet zumeist aus.
Diese Probleme hat Du bei UNC nicht.
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mi 03.05.17 06:57 
Moin.

Danke für die info.
Das bedeutet ja somit, dass ich einen neuen User anlegen sollte der sämtliche Rechte hat. Ungefähr so wie die Mssql User. Und der könnte dann auch auf den UNC Pfad schreiben.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mi 03.05.17 09:37 
So ich habe nun mit unserer IT gesprochen.
Das ganze stellt sich noch schwieriger da.
Der User hat kein Kennwort, somit läuft der Dienst nicht unter dem aktuellen User.
Der PC ist nicht in der Domäne eingebunden somit auch kein Zugriff direkt auf die Struktur.

Bedeutet:
Der Dienst kann nur unter einem dem Localsystem laufen.
Somit fehlen aber die rechte auf Netzwerk und Daten.
Ich könnte höchstens ein Kennwort festlegen und Autolon einschalten und das Passwort in der Registry eintragen.
Das werde ich jetzt erst ein mal versuchen.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)
m.keller Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 130

Win xp, Win 7
C# (VS 2008)
BeitragVerfasst: Mi 03.05.17 17:26 
So ich habe es nun gelöst.

Mit dem Beispiel von
www.codeproject.com/...ath-with-Credentials

Voraussetzung war das ich dem User noch ein Passwort vergebe und den Dienst mit diesem User ausführe.

Danke für eure Unterstützung.

_________________
Der gesunde Menschenverstand ist nur eine Anhäufung von Vorurteilen, die man bis zum 18. Lebensjahr erworben hat. (Albert Einstein)