highend01
Goto Top

Aufgabenplanung - Einträge im Log durch Batchdatei?

Hi,

meine (kompilierte) Batchdatei wird momentan mit höchsten Berechtigungen als angemeldeter Benutzer ausgeführt.

Dabei erhalte ich im Log (Verlauf) der Aufgabenplanung bei so ziemlich jedem Aufruf (stündlich) eine Warnung (ID 322 "Task Scheduler did not launch task "%1" because instance "%2" of the same task is already running.") und einen Fehler (101 "Task Scheduler failed to start the "%1" task for user "%2". The error value is: %3."), die durch die Batch Datei hervorgerufen werden. Die Beschreibungen für die FehlerIDs hab ich mal aus dem englischsprachigen Technet Artikeln rauskopiert.

Wenn ich das Ganze über die Aufgabenplanung manuell anstoße, läuft das Log ohne die ID-Einträge durch.

Da der Task beim geplanten stündlichen Start eigentlich nicht ein zweites Mal anläuft (es sind auch keine ssh.exe oder rsync.exe Einträge mehr im Taskmanager vorhanden bevor die komplierte .bat Datei startet) frage ich mich, warum die das Log der Aufgabenplanung sich in 90% aller Fälle mit den beiden IDs beschwert. Hat jemand ne Idee, wie man dem Fehler auf die Spur kommen könnte?

Ein Bild des Logverlaufs:
5c6c6bc29890974ed7f4593c298d0755

Das Script:

@ECHO OFF
setlocal enabledelayedexpansion

REM ########################################################
REM ### Declare Variables ##################################
REM ########################################################
REM ### Store Directory Paths ##############################
SET WorkingDrive=%~d0
SET WorkingDir=%~pd0
SET WorkingDir=%WorkingDir:~0,-1%

%WorkingDrive%
CD "%WorkingDir%"  

REM ### Store Tool Paths ###################################
SET SnapshotDir=.Snapshots
SET SnapshotCMD=~var_snapshot
SET KeyfilesDir=.Keyfiles
SET ScriptsDir=.Scripts
SET VssDir=.VSS
SET UserDir=Users
SET DriveToBackup=D
SET WinDrive=%SystemDrive:~0,-1%
SET rsync=rsync.exe

REM ### Check if old task is still running #################
tasklist /fi "IMAGENAME eq rsync.exe" | findstr /i /c:"rsync.exe" >NUL 2>NUL  
IF %errorlevel%==0 GOTO END

REM ### Check for 32 or 64 Bit OS ##########################
IF EXIST %windir%\SysWoW64\NUL ( SET vShadow=%WorkingDir%\%VssDir%\vshadow_x64.exe ) ELSE ( vShadow=%WorkingDir%\%VssDir%\vshadow_x86.exe )

REM ### Check for OS language ##############################
DIR /A-D %userprofile% | findstr /i /c:"Verzeichnis(se)" >NUL 2>NUL  
IF %errorlevel%==0 ( SET ClientLang=de_DE ) ELSE ( SET ClientLang=en_US )

REM ### Add Run As Admin ###################################
SET RegEnvPath=HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

REG QUERY "%RegEnvPath%" /v "%WorkingDir%\%username%.bat" >NUL 2>NUL  
IF %errorlevel%==1 (
REG ADD "%RegEnvPath%" /v "%WorkingDir%\%username%.bat" /t REG_SZ /d "RUNASADMIN" /f >NUL 2>NUL  
REG ADD "%RegEnvPath%" /v "%WorkingDir%\%username%.exe" /t REG_SZ /d "RUNASADMIN" /f >NUL 2>NUL  
)

REM ### Set firewall access rights #########################
netsh advfirewall firewall show rule name="RSync" | findstr /i /c:"Keine Regeln" >NUL 2>NUL  
IF %errorlevel%==0 (
netsh advfirewall firewall add rule name="RSync" program="%WorkingDir%\%rsync%" dir=in action=allow protocol=any  
netsh advfirewall firewall add rule name="RSync" program="%WorkingDir%\%rsync%" dir=out action=allow protocol=any  
)

REM ### Create task ########################################
CHCP 1252 >NUL 2>NUL
SET "ae=ä" & SET "oe=ö" & SET "ue=ü"  
CHCP 850 >NUL 2>NUL
schtasks /query | findstr /i /c:"Rsync" >NUL 2>NUL  
IF %errorlevel%==1 (
IF %ClientLang%==de_DE ( schtasks /create /tn "Rsync" /tr "%WorkingDir%\%username%.exe" /sc minute /mo 60 /st 08:00:00 /ru "%username%" /f /it /rl h%oe%chste >NUL 2>NUL )  
IF %ClientLang%==en_US ( schtasks /create /tn "Rsync" /tr "%WorkingDir%\%username%.exe" /sc minute /mo 60 /st 08:00:00 /ru "%username%" /f /it /rl highest >NUL 2>NUL )  
)

REM ### Set access rights on keyfile #######################
icacls "%WorkingDir%\%KeyfilesDir%\%username%\ssh2private_%username%.PPK" /findsid %username% | findstr /i /c:"keine Dateien" >NUL 2>NUL  
IF %errorlevel%==0 (
icacls "%WorkingDir%\%KeyfilesDir%\%username%\ssh2private_%username%.PPK" /inheritance:d >NUL 2>NUL  
icacls "%WorkingDir%\%KeyfilesDir%\%username%\ssh2private_%username%.PPK" /grant %username%:F >NUL 2>NUL  
icacls "%WorkingDir%\%KeyfilesDir%\%username%\ssh2private_%username%.PPK" /grant Administratoren:F >NUL 2>NUL  
icacls "%WorkingDir%\%KeyfilesDir%\%username%\ssh2private_%username%.PPK" /remove:g Jeder >NUL 2>NUL  
)

REM ### Convert %username% to lowercase ####################
FOR /F "delims=~" %%A IN ('ECHO %username%^> "%temp%\~%username%" ^& DIR /L /B "%temp%\~%username%"') DO (  
	SET "HiDriveUser=%%A"  
	DEL /Q "%temp%\~%username%"  
)

REM ### Admin Check ########################################
COPY /Y NUL "%windir%\.AdminTest" >NUL 2>NUL  
IF %errorlevel%==1 ( GOTO Rsync_AsUser ) ELSE ( SET IsAdmin=True )

REM ### Check and Start ####################################
IF EXIST %SystemDrive%\%SnapshotDir%\%DriveToBackup%\NUL ( GOTO CleanUpOnInitialize_AsAdmin ) ELSE ( GOTO Initialize_AsAdmin )

:CleanUpOnInitialize_AsAdmin
REM ### Clean up on Initialize #############################
CALL "%WorkingDir%\%SnapshotCMD%.cmd"  
mountvol %SystemDrive%\%SnapShotDir%\%DriveToBackup% /d
"%vShadow%" -ds=%SHADOW_ID_1%  
RMDIR "%SystemDrive%\%SnapShotDir%\%DriveToBackup%" /s /q  

:Initialize_AsAdmin
MKDIR "%SystemDrive%\%SnapShotDir%\%DriveToBackup%" >NUL 2>NUL  
ATTRIB +h "%SystemDrive%\%SnapShotDir%"  
"%vShadow%" -p -nw -script="%WorkingDir%\%SnapshotCMD%.cmd" %DriveToBackup%:  
CALL "%WorkingDir%\%SnapshotCMD%.cmd"  

REM ### Mounten des Snapshots  #############################
"%vShadow%" -el=%SHADOW_ID_1%,%SystemDrive%\%SnapShotDir%\%DriveToBackup%  

REM ### RSync highend ######################################
REM ### RSync highend - Upload All #########################
"%WorkingDir%\%rsync%" -v -P -h -rlt -z --chmod=a=rw,Da+x --modify-window=2 --delete --files-from "%ScriptsDir%/%username%/%username%_include.txt" --exclude-from "%ScriptsDir%/%username%/%username%_exclude.txt" -e "ssh -o StrictHostKeyChecking=no -l %HiDriveUser% -i %KeyfilesDir%/%HiDriveUser%/ssh2private_%HiDriveUser%.PPK" "/cygdrive/%WinDrive%/%SnapshotDir%/%DriveToBackup%/" "%HiDriveUser%@rsync.hidrive.strato.com:/users/%HiDriveUser%/"  

:CleanUpOnExit_AsAdmin
REM ### Clean up on exit ###################################
mountvol %SystemDrive%\%SnapShotDir%\%DriveToBackup% /d
"%vShadow%" -ds=%SHADOW_ID_1%  
DEL "%WorkingDir%\%SnapshotCMD%.cmd"  
RMDIR "%SystemDrive%\%SnapShotDir%" /s /q  
GOTO END

:Rsync_AsUser
REM ### RSync highend ######################################
REM ### RSync highend - Upload All #########################
"%WorkingDir%\%rsync%" -v -P -h -rlt -z --chmod=a=rw,Da+x --modify-window=2 --delete --files-from "%ScriptsDir%/%username%/%username%_include.txt" --exclude-from "%ScriptsDir%/%username%/%username%_exclude.txt" -e "ssh -o StrictHostKeyChecking=no -l %HiDriveUser% -i %KeyfilesDir%/%HiDriveUser%/ssh2private_%HiDriveUser%.PPK" "/cygdrive/%DriveToBackup%/" "%HiDriveUser%@rsync.hidrive.strato.com:/users/%HiDriveUser%/"  

:END

Content-ID: 162634

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

Ausgedruckt am: 26.11.2024 um 08:11 Uhr

neorcs
neorcs 15.03.2011 um 08:46:46 Uhr
Goto Top
Guten Morgen.

Meisten funktioniert wenn du hinter einmel Befehl, was du glaubst was der Fehler sein kann das dahinterschreibst:

Beispielt:

xcopy \\Pfad\java.txt C:\Programme\Java\ > \\Pfad\fehler.txt

das "> \\Pfad\fehler.txt" listet auf was für ein Fehler da ist.

Mfg.
marvin
Snowman25
Snowman25 15.03.2011 um 09:06:56 Uhr
Goto Top
Hallo @Highend01,

Unter welchem Account führt der Taskplaner dein Script denn aus?
Führe mal folgendes über den Taskplaner aus:
setlocal enabledelayedexpansion

SET WorkingDrive=%~d0
SET WorkingDir=%~pd0
SET WorkingDir=%WorkingDir:~0,-1%

SET WorkingD>C:\workdir.log
Und schau dir den Inhalt von C.\workdir.log an. Poste ihn auch hier.
Wenn das schon fehlschlägt (also wieder die Fehlermeldung vom Taskplaner), dann liegt dein Problem woanders.
Wäre praktisch, wenn du die Fehlermeldung MIT den Attributen posten könntest, anstatt bloß die Vorlage.

Gruß
Snow
Highend01
Highend01 15.03.2011 um 09:25:50 Uhr
Goto Top
Morgen zusammen.

Der Taskplaner führt das Script unter dem Namen des angemeldeten Benutzers aus (das Script trägt sich selber entsprechend ein). In meinem Fall also als user "Highend".

Wenn ich dein Script nehme und entsprechend eintrage:
D:\Users\Highend\Tools\Rsync>schtasks /create /tn "test" /tr "D:\users\highend\tools\rsync\.test.bat" /sc minute /mo 60 /st 08:00:00 /ru "Highend" /f /it /rl höchste

Dann steht nach dem Durchlauf im log folgendes drin:

WorkingDir=D:\Users\Highend\Tools\Rsync
WorkingDrive=D:

Das Ganze ohne Warnungen oder Fehler im Verlauf des Aufgabenplanungslogs.

Der echte Inhalt der beiden Fehlermeldungen lautet:

Protokollname: Microsoft-Windows-TaskScheduler/Operational
Quelle:        Microsoft-Windows-TaskScheduler
Datum:         15.03.2011 07:51:59
Ereignis-ID:   322
Aufgabenkategorie:Die Startanforderung wurde ignoriert. Die Instanz wird bereits ausgeführt.
Ebene:         Warnung
Schlüsselwörter:
Benutzer:      SYSTEM
Computer:      uk-dt-01
Beschreibung:
Die Aufgabenplanung hat die Aufgabe "\Rsync" nicht gestartet, weil die Instanz "{27be753e-b29c-4e54-a04d-1cca56214eb1}" de gleichen Aufgabe bereits ausgeführt wird.  
Ereignis-XML:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">  
  <System>
    <Provider Name="Microsoft-Windows-TaskScheduler" Guid="{DE7B24EA-73C8-4A09-985D-5BDADCFA9017}" />  
    <EventID>322</EventID>
    <Version>0</Version>
    <Level>3</Level>
    <Task>322</Task>
    <Opcode>0</Opcode>
    <Keywords>0x8000000000000000</Keywords>
    <TimeCreated SystemTime="2011-03-15T06:51:59.999600500Z" />  
    <EventRecordID>1475</EventRecordID>
    <Correlation ActivityID="{27BE753E-B29C-4E54-A04D-1CCA56214EB1}" />  
    <Execution ProcessID="432" ThreadID="1440" />  
    <Channel>Microsoft-Windows-TaskScheduler/Operational</Channel>
    <Computer>uk-dt-01</Computer>
    <Security UserID="S-1-5-18" />  
  </System>
  <EventData Name="NewInstanceIgnored">  
    <Data Name="TaskName">\Rsync</Data>  
    <Data Name="TaskInstanceId">{27BE753E-B29C-4E54-A04D-1CCA56214EB1}</Data>  
  </EventData>
</Event>

Protokollname: Microsoft-Windows-TaskScheduler/Operational
Quelle:        Microsoft-Windows-TaskScheduler
Datum:         15.03.2011 07:51:59
Ereignis-ID:   101
Aufgabenkategorie:Fehler beim Aufgabenstart
Ebene:         Fehler
Schlüsselwörter:(1)
Benutzer:      SYSTEM
Computer:      uk-dt-01
Beschreibung:
Die Aufgabenplanung konnte die Aufgabe "\Rsync" für den Benutzer "uk-dt-01\Highend" nicht starten. Zusätzliche Daten: Fehlerwert: 2147750687  
Ereignis-XML:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">  
  <System>
    <Provider Name="Microsoft-Windows-TaskScheduler" Guid="{DE7B24EA-73C8-4A09-985D-5BDADCFA9017}" />  
    <EventID>101</EventID>
    <Version>0</Version>
    <Level>2</Level>
    <Task>101</Task>
    <Opcode>101</Opcode>
    <Keywords>0x8000000000000001</Keywords>
    <TimeCreated SystemTime="2011-03-15T06:51:59.999600500Z" />  
    <EventRecordID>1476</EventRecordID>
    <Correlation />
    <Execution ProcessID="432" ThreadID="1440" />  
    <Channel>Microsoft-Windows-TaskScheduler/Operational</Channel>
    <Computer>uk-dt-01</Computer>
    <Security UserID="S-1-5-18" />  
  </System>
  <EventData Name="TaskStartFailedEvent">  
    <Data Name="TaskName">\Rsync</Data>  
    <Data Name="UserContext">uk-dt-01\Highend</Data>  
    <Data Name="ResultCode">2147750687</Data>  
  </EventData>
</Event>

Gruß,
Highend
Snowman25
Snowman25 15.03.2011 um 09:57:36 Uhr
Goto Top
Also laut der Fehlermeldung läuft ein entsprechender Task bereits unter dem SYSTEMkonto. Was natürlich nicht sein sollte.
Das Parameterpaar /sc minute /mo 60 lässt sich auch /sc hourly kürzen.
Der Parameter /st 08:00:00 ist laut Technet falsch. Hier wird ein HH:MM-Format erwartet. Also /st 08:00.
Laut /ru "Highend" (ohne Domäne?) und /it soll der Task bloß laufen, wenn du mit Highend eingeloggt bist.
Was etwas eigenartig ist:
Trotz /F kommt die Warnung, dass ein Task bereits läuft.

Kennst du den /V1-Switch?
Weiter Infos beim MSDN.

Gruß
Snow
Highend01
Highend01 15.03.2011 um 10:36:44 Uhr
Goto Top
Also laut der Fehlermeldung läuft ein entsprechender Task bereits unter dem SYSTEMkonto. Was natürlich nicht sein sollte.
Die Frage ist nur, warum denkt der Taskplaner, dass dem so wäre?
Im Script trägt er den Task ja selber ein.

IF %ClientLang%==de_DE ( schtasks /create /tn "Rsync" /tr "%WorkingDir%\%username%.exe" /sc minute /mo 60 /st 08:00:00 /ru "%username%" /f /it /rl h%oe%chste >NUL 2>NUL )
Da ist vom Systemkonto keine Rede^^

Das Parameterpaar /sc minute /mo 60 lässt sich auch /sc hourly kürzen.
Die Zeit wird später noch geändert. Vermutlich auf etwa 30 Minuten. Deshalb von vorneherein mit /mo xx

Der Parameter /st 08:00:00 ist laut Technet falsch. Hier wird ein HH:MM-Format erwartet. Also /st 08:00.
Früher konnte man ihn auch mit Sekundenangabe verwenden. Genauer gesagt, kann man es immer noch,
auch wenn es nicht dokumentiert wird. Eingetragen wird der Task ja nach wie vor korrekt.

Laut /ru "Highend" (ohne Domäne?) und /it soll der Task bloß laufen, wenn du mit Highend eingeloggt bist.  
Was etwas eigenartig ist:
Die Domäne ist lokal auf dem Rechner nicht nötig (es sind ausschließlich private PCs, die sich in keiner
Domäne befinden). Es ist von mir so gewünscht, dass eine rsync Synchronisation immer nur durchgeführt
wird, wenn der jeweilige Benutzer auch angemeldet ist (jeder Benutzer hat andere Einstellungen, welche
Verzeichnisse synchronisiert werden und um das generisch zu halten, werden rsync jeweils die nötigen
Dateien mit auf den Weg gegeben, die die Pfade, Ausschließungen, etc. enthalten).

Trotz /F kommt die Warnung, dass ein Task bereits läuft.
Mh, wie meinst du das? Das /f dient nur dazu, eine eventuell vorhandene Aufgabe gleichen Namens
zu "überschreiben", statt das Script mit einer Nachfrage anzuhalten. Es geht dabei nur um das Erstellen
der Aufgabe, nicht um die Ausführung. Die Erstellung wird ja auch nur dann ausgeführt, wenn noch kein Rsync
Task eingetragen ist (siehe Script: schtasks /query | findstr /i /c:"Rsync" ... IF %errorlevel%==1 ( ...)

Kennst du den /V1-Switch?

Ja, ich wüsste nur nicht, wozu ich ihn brauchen sollte *g*. Alle Rechner laufen unter Windows 7, keiner benutzt mehr
XP oder Win2k.

Es bleibt wohl bei der Frage, warum der Taskplaner denkt, er könnte den gleichen Task als eingeloggter Benutzer
und als SYSTEM ausführen, obwohl der Task nur einmal unter Benutzerprivilegien eingetragen wurde.

Ein schtasks /query | findstr /i /c:"Rsync"
liefert auch wirklich nur einen Task zurück:

Rsync 15.03.2011 10:52:00 Bereit

Gruß,
Highend
pieh-ejdsch
pieh-ejdsch 02.04.2012 um 20:02:39 Uhr
Goto Top
moin,

Es bleibt wohl bei der Frage, warum der Taskplaner denkt, er könnte den gleichen Task als eingeloggter Benutzer
und als SYSTEM ausführen, obwohl der Task nur einmal unter Benutzerprivilegien eingetragen wurde.

Zeile 57
schtasks /query | findstr /i /c:"Rsync" >NUL 2>NUL  
Ja und das ist genau der von Dir erstellte?

Dann lösche doch den alten "rsync" Task und schreib den danach komplett neu.

PS.
schtasks /create /?|more +130|find /v ""|more  

Gruß Phil
Snowman25
Snowman25 02.04.2012 um 23:04:36 Uhr
Goto Top
Ich glaube, dass sich das Thema nach über einem Jahr erledigt hat und der Themenersteller hierzu auch keine detailierten Angaben mehr machen kann, wo es gehakt hat.
Siehe auch >> Thread Necromancer

Gruß
Snow
pieh-ejdsch
pieh-ejdsch 03.04.2012 um 13:16:19 Uhr
Goto Top
moin Snow,

schi.. Tabbrowsing. Das war gar nicht so beabsichtigt. Irgendwie ist mir nur 15.03. ins Auge gefallen.
Ich gelobe Besserung.

wäre es mir direkt aufgefallen, hätte ich anders Eingeleitet (ist zwar schon ne weile her ...)
Ich kanns ja nicht mal auf die Sonneneinstrahlung schieben, das müsste sonst gegen 17 Uhr gewesen sein.

Gruß Phil