Announcement

Collapse
No announcement yet.

Windows Service ...

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Windows Service ...

    Hallo zusammen,

    ich bin neu hier.

    Bei mir stellt sich zur zeit ein kleines Problem dar. Und zwar muss ich einen WindowsSerive schreiben, der auf ein bereits auf ein gemapptes Laufwerk zugreifen soll. Leider kann ich nicht über UNC Pfade arbeiten, da hier der Effekt nicht auftreten würde. Denn wir haben eine Anwendung, die scheinbar bei bestimmten Aktionen kurfristig und sporadisch die Verbindung zu diesem Laufwerk verliert. Es handelt sich um eine ältere Anwendung. Da wir aber langfristig alles umstellen wollen auf C#, wollte ich schonmal langsam anfangen. HIerfür soll der Serivice mit C# gesschrieben diesen. Ich habe den Service bereits auf FullTrust eingestellt. Er funktioniert außer das schreiben und löschen von Files oder Verzeichnissen auf diesem Netzwerklaufwerk. Wie gesagt, über UNC klappt das Ganze tadellos, aber ich brauche wirklich die feste Laufwerksangabe. Vielleicht gibt auch noch andere Möglichkeiten. Aber prinzipiell möchte ich auf dem Laufwerk (z.B. S:\) eine Datei erzeugen, dann kurz lesen und wieder löschen. Vorher, beim Start des Services soll evtl. noch ein Verzeichnis angelegt werden.

    Könnt ihr mir da weiterhelfen ...

    pa775

  • #2
    Was genau ist denn dein Problem?

    Weißt du nicht, wie man mit C# Dateien schreibt oder bekommst du Fehlermeldungen, weil du keine Schreibrechte auf das Netzlaufwerk hast?

    Bitte erläutere etwas ausführlicher, worin genau das Problem liegt.

    Comment


    • #3
      Achso, stimmt. Also ich bekomme immer die Fehlermeldung, dass ein Teil der Pfades nicht gefunden werden kann. Und dabei ist es egal, mit welchem User der Serive gestartet wird. Selbst der Admin dieses Servers, den ich im Service hinterlegt habe, bekommt diese Meldung. Wenn ich den Service als reine GUI Anwendung (WinForms) erstelle, geht es. Nur der Service lässt sich nicht überreden.

      Gruß

      Comment


      • #4
        Dann poste doch bitte den Code-Ausschnitt, mit welchem du auf das Netzlaufwerk zugreifst. Dann können wir hier ziemlich schnell schreiben, was da falsch läuft.

        Comment


        • #5
          Soweit ich weiß ziehen die DriveMappings eines Users nur während dessen Usersession läuft und der Service natürlich unter dem Account dieses dann angemeldeten Users läuft und Interaktion mit dem Desktop erlaubt ist. Ab Vista geht das aber vermutlich auch nicht mehr.

          Eventuell kannst du selbst das Mapping zur Laufzeit des Services für den Service anlegen. Mir ist aber nicht bewusst das das in .NET direkt möglich wäre. Du müsstest also auf die Windows API ausweichen. Siehe die WNetAddConnection API Methode.

          Comment


          • #6
            [highlight=c#]
            string aFileName = string.Empty;
            FileStream aFileStream = null;
            StreamWriter aStreamWriter = null;
            StringBuilder aMessage = new StringBuilder();
            try
            {
            aFileStream = new FileStream("r:\\" + DateTime.Now.ToFileTime() + ".txt",
            FileMode.CreateNew, FileAccess.ReadWrite);
            aStreamWriter = new StreamWriter(aFileStream);
            aStreamWriter.BaseStream.Seek(0, SeekOrigin.End);
            aMessage.Append(System.DateTime.Now.ToString("dd.M M.yyyy HH:mm:ss:fff"))
            .Append(" - ")
            .Append("checked ...");
            aStreamWriter.WriteLine(aMessage.ToString());
            aStreamWriter.Flush();
            aFileName = aFileStream.Name;
            LogMessage(string.Format("file created ... [{0}]", aFileName));
            }
            catch (Exception aExp)
            {
            LogMessage(aExp.Message);
            }
            finally
            {
            if (aStreamWriter != null) aStreamWriter.Close();
            }
            [/highlight]
            Zuletzt editiert von gfoidl; 30.09.2009, 11:56. Reason: pre-Tags entfernt und highlight-Tags eingefügt so wie es beschrieben ist

            Comment


            • #7
              Könnte man hier nicht einfach den UNC Pfad verwenden? Der ist dann nicht mehr auf den Laufwerksbuchstaben bezogen und somit Benutzerunabhängig. Natürlich vorausgesetzt der Benutzer hat Zugriff auf das Netzlaufwerk (das wäre beim Starten des Service noch zu prüfen).

              Comment


              • #8
                Um dem eigentlichen Problem auf die Spur zu kommen, muss ich leider über den Laufwerksbuchstaben gehen, denn UNC würde funktionieren, aber der Effekt bleibt aus.

                Comment


                • #9
                  1. man muss wissen unter welchem Account funktioniert Service
                  [Highlight=c#]
                  WindowsPrincipal MyPrincipal = (WindowsPrincipal)Thread.CurrentPrincipal;
                  String s = MyPrincipal.Identity.Name;
                  [/Highlight]

                  2. man muss prüfen ob dieses Account die Zugriffsrechte für r:\\xxx.txt hat
                  (bzw. Schreibzugriff)
                  Zuletzt editiert von vadym voytas; 01.10.2009, 22:11.
                  Bitte vergessen Sie nicht die Antwort zu bewerten. Danke.:-)

                  Comment


                  • #10
                    Hi,

                    habe mal etwas mit Windows.Principal gespielt. leider liefert der Service immer einen leeren String zurück. Egal ob der Service als lokaler Dienst läuft oder unter einem administrativen User. Also merkwürdig ist das schon alles irgendwie, aber vielleicht habt ihr ja noch den ein oder anderen Tip für mich ...

                    Gruß

                    Comment


                    • #11
                      @pa775
                      Standartmäßig lauft WindowsDienst unter
                      LocalService
                      oder
                      NetworkService
                      oder
                      LocalSystem

                      Diese drei werden von Security-System nicht erkannt. Deshalb liefert Windows.Principal leeres String zurück.

                      Du kannst das Account unter SCM-Console (Verwaltung-Dienste) ändern.

                      Da gibt es auch die Möglichkeit Dienst unter Benutzer-Account laufen lassen.
                      (Das sollte ein Domainbenutzer sein, kein lokaler Benutzer)

                      Benutzer sollte aber die Zugriffsrechte zu dem Katalog r:\\xxx.txt haben
                      Zuletzt editiert von vadym voytas; 05.10.2009, 22:10.
                      Bitte vergessen Sie nicht die Antwort zu bewerten. Danke.:-)

                      Comment


                      • #12
                        Hallo,
                        mich würde mal interessieren ob die Lösung von vadym funktioniert hat.

                        gruß
                        anita

                        Comment

                        Working...
                        X