alphagen
Goto Top

Dienst ohne Benutzeranmeldung beenden

Hallo liebe Community,
folgendes Problem:

Ich habe eine Exe geschrieben, die über eine Batchdatei mittels Aufgabenplanung aufgerufen wird um eine Lexware-Datenbank zu sichern auf einem SBS 2012.
Um die DB zu sichern, muss der Lexware Dienst "Lexware-Datenbank" beendet werden.

NET STOP "Lexware_Datenbank"  
Backup.exe
NET START"Lexware_Datenbank"  

Die Backup.exe enthält eine Aneinanderreihnung von xcopy-Befehlen mit try { } catch { } blöcken aber denke, dass ist uninteressant.

Die Aufgabe wurde so eingerichtet, dass sie unabhängig von der Benutzeranmeldung läuft und die Batch wird immer als Administrator ausgeführt.
Wenn ich als Administrator (über remote) angemeldet bin, funktioniert das Script. Wenn ich nicht über Remote verbunden bin, funktioniert das Script nicht.
Die Backup.exe Logt jedes mal den Fehler "Zugriff verweigert".

Ich habe testweise das Starten und Stoppen des Dienstes auch schon in die exe übernommen aber laut logg-Datei werden sie ordentlich beendet und wieder gestartet.

Hat jemand einen Idee, wo ich meinen Denkfehler / Problem habe? Bin so langsam ziemlich ratlos. face-confused

Mit freundlichen Grüßen

Martin Schweisel

Content-ID: 305286

Url: https://administrator.de/contentid/305286

Ausgedruckt am: 25.11.2024 um 20:11 Uhr

129413
129413 25.05.2016 aktualisiert um 10:00:54 Uhr
Goto Top
Wenn ich als Administrator (über remote) angemeldet bin, funktioniert das Script. Wenn ich nicht über Remote verbunden bin, funktioniert das Script nicht.
Das hört sich verdächtig nach Nutzung von Laufwerksbuchstaben anstatt UNC-Pfaden in deiner EXE an, wenn du in deiner EXE damit auf Netzlaufwerke kopierst.
Laufwerke sind Sessionabhängig, d.h. wenn du einen Task hast der als Admin läuft hat er diese Laufwerke nicht zur Verfügung weil hier das Profil nicht geladen wird und eben auch keine Laufwerke gemappt werden, deshalb sollte man wenn möglich immer UNC-Pfade verwenden.

Wenn du dich stattdessen anmeldest und den Task startest, sind die Laufwerke ja gemappt und dein Skript läuft durch.

Das mal als Hypothese was bei dir schief gelaufen sein könnte.

Aber ohne deinen Code der EXE ist das alles nur pures Rumraten hier face-sad. Also, der Code ist sehr wohl von Belang.

Gruß skybird
AlphaGen
AlphaGen 25.05.2016 um 12:13:35 Uhr
Goto Top
Der Code der Exe ist rund 800 Zeilen lang. Dazu die config-XML von rund 100 Zeilen. Ich denke das sprengt den Rahmen oder? face-big-smile

Die Exe bindet Netzlaufwerke ein, baut VPN - Verbindungen auf und ab, Reconnectet falls die Verbindung unterbrochen wurde, prüft aufgrund des Archivbits, welche Daten sich verändert haben, sichert die entsprechenden Daten und setzt das Archivbit zurück.

Da alle Daten außer Lexware richtig gesichert werden und die Netzlaufwerke vor dem Start der Exe ebenfalls mittels der Batch-Datei gemappt werden, bin ich mir ziemlich sicher, dass es nicht am Pfad liegt.

Vorallem funktioniert die Exe ja ohne Probleme, wenn ich per Remote dabei zusehe und mit dem Administrator angemeldet bin.

Sorry, die Infos hätte ich am Anfang eventuell auch noch rein schreiben müssen. face-confused
129413
129413 25.05.2016 aktualisiert um 12:53:33 Uhr
Goto Top
Vorallem funktioniert die Exe ja ohne Probleme, wenn ich per Remote dabei zusehe und mit dem Administrator angemeldet bin.
Per Task wird das Profil nicht geladen das ist dein Problem beim Verwenden von Netzlaufwerken. Deswegen funktioniert es ja wenn du dich anmeldest, denn dann ist das Userprofil geladen face-wink

Deswegen in Tasks besser immer mit UNC-Pfaden arbeiten.
Und Dienste per vb.net mit "net stop" beenden ?? Das geht dort nativ wesentlich zuverlässiger.

Der Code der Exe ist rund 800 Zeilen lang. Dazu die config-XML von rund 100 Zeilen. Ich denke das sprengt den Rahmen oder?
Dann liegt der Fehler zu 99% darin.

Welcome Glaskugel ...
AlphaGen
AlphaGen 25.05.2016 um 13:45:14 Uhr
Goto Top
Also ich habe das mit UNC-Pfaden getestet ohne Veränderung.

Ich habe auch kein Problem beim verwenden von Netzlaufwerken. Ohne Remote kopiert die Software alles bis auf Lexware. Die Netzlaufwerke werden von der Software zur Laufzeit verbunden. Dazu muss nur Benutzer und Passwort beim verbinden mit dem Netzlaufwerk angegeben werden.

Beispiel (nur zur Verdeutlichung):

PC 1 (Quelle)
IP: 192.168.0.2
Freigegebene Ordner: (+ --> Unterordner)
Daten
+ Download
+ Lexware
+ Sonstiges

PC 2 (Ziel)
IP: 192.168.0.3
Freigegebene Ordner:
Daten

net use z: \\192.168.0.2\Daten /user:administrator passwort
net use y: \\192.168.0.3\Daten /user:administrator passwort

Ich habe eine rekursive Kopierfunktion die alle Unterordner mit kopiert.
Wenn ich der Kopierfunktion jetzt sage "Kopiere z: nach y:" kopiert sie den Ordner Download mit allen Unterordner und Dateien, den Ordner Sonstiges mit allen Unterordner und Dateien, und sogar ein paar Dateien (die nicht in Benutzung sind) aus dem Lexware-Ordner. AUSSER Die Datenbank, weil die in Benutzung ist.

Ich benutze C#, kein vb.net.

Das "net stop" wurde in die Batch ausgelagert um zu testen, ob damit der Dienst beendet wird.
Der Code der Exe zum beenden eines Dienstes sieht wie folgt aus:

try
            {
                ServiceController sc = new ServiceController();
                sc.ServiceName = "Lexware-Datenbank";  
                if (sc.Status == ServiceControllerStatus.Running)
                {
                    sc.Stop();
                    sc.WaitForStatus(ServiceControllerStatus.Stopped);
                    logg("Lexware Dienst wurde beendet!");  
                }
            } catch (Exception e) {
                logg("Lexware Dienst konnte nicht beendet werden!");  
                errors.Add("LEXWAREDIENST NICHT BEENDET!!!" + e.Message);  
            }

In meiner Log-Datei steht dann "Lexware Dienst wurde beendet!".
129413
129413 25.05.2016 aktualisiert um 14:06:04 Uhr
Goto Top
Womit kopierst du rekursiv? Mit xcopy ? Dann mach es stattdessen mal mit Robocopy und dem Schalter /B das ist zuverlässiger als xcopy. Es gibt auch Ordner bzw. Dateien die auch für einen Admin gesperrt sein können.

Ich würde hier lieber auch mit Schattenkopien arbeiten, erst Schattenkopie erstellen und diese dann wegsichern ...
AlphaGen
AlphaGen 25.05.2016 um 14:31:03 Uhr
Goto Top
Also zunächst an dieser Stelle erstmal vielen Dank für deine Hilfe und Zeit face-smile Muss auch mal gesagt werden!

Ich durchlaufe die Ordner mittels einer eigenen Rekursion.

Kopiert wird dann mit:
ZlpFileInfo file = new ZlpFileInfo(SourcePath);
file.CopyTo(DestinationPath, true);

Okay, dann guck ich mir mal Schattenkopien an mittels Batch oder C#. Mal sehen ob mich das weiter bringt.
Dank dir schonmal. Ich gebe Rückmeldung wenn ich weiter gekommen bin! face-smile
129413
129413 25.05.2016 aktualisiert um 18:39:52 Uhr
Goto Top
Zitat von @AlphaGen:
Ich durchlaufe die Ordner mittels einer eigenen Rekursion.
Dann ist mir klar warum ... Dabei muss man einiges beachten.

Ich würde den Task mit "System"-Rechten laufen lassen wenn du sowieso die Passwörter mit in die EXE packst, was man eigentlich immer vermeiden sollte.
emeriks
emeriks 25.05.2016 um 18:35:33 Uhr
Goto Top
hi,
hast du an der aufgabe auch "mit höchsten rechten ausführen" aktiviert?

E.
AlphaGen
AlphaGen 26.05.2016 um 08:16:49 Uhr
Goto Top
hast du an der aufgabe auch "mit höchsten rechten ausführen" aktiviert?

Ja habe ich aktiviert. face-smile
129413
129413 26.05.2016 aktualisiert um 09:00:26 Uhr
Goto Top
Wenn du die Rekursion selber machst dann lass dir doch mal das File protokollieren welches den "AccessDenied" Fehler wirft. Du hast ja hunderte Debugging-Möglichkeiten wenn du deinen Code selber schreibst!

Also mach keinen TryCatch um das ganze Konstrukt sondern um die einzelne Kopieraktion, und lass dir alle möglichen Infos in ein Log schreiben.
Dann wird sich der Grund schon finden.