eccos01
Goto Top

Batchausführung als System bricht ab - Win2k8 Server

Hallo,

ich habe eine Batchdatei, die etliche Aktionen ausführt. Eine der Aktionen ist der Aufruf eines Hilfsprogramms eines DB-Herstellers um die DSN-Einträge auszulesen bzw. zu modifizieren.
Das Kommando liesst im ersten Schritt nur die DSN-Einträge und wertet dann mittels findstr aus, ob ein bestimmter Eintrag existiert.

Bisher gab es mit dem Skript keine Probleme... schon zig Kunden (auch mit Win2k8 64bit) arbeiten problemlos damit.

Bei dem einen Kunden läuft das Skript und das Hilfsprogramm auch völlig problemlos, wenn ich es als Benutzer mit Administrationsrechten ausführe.
Wird es aber - so wie es immer genutzt wird - aus einem Java-programm aufgerufen, welches als Dienst ausgeführt wird - gibt es Probleme.
Das heißt... sobald das Skript mit dem User "System" ausgeführt wird, wird die gesamte Skriptausführung sofort beim Aufruf des Hilfsprogramms ohne irgendwelche Ausgaben / Meldungen abgebrochen.

So einfach Dinge wie die Sicherheitseinstellungen der betroffenen Dateien (also Dateieigenschaften) habe ich schon kontrolliert. Alle verwendeten Umgebungsvariablen sind System-Variablen.

Jemand noch eine Idee?

Content-ID: 171403

Url: https://administrator.de/forum/batchausfuehrung-als-system-bricht-ab-win2k8-server-171403.html

Ausgedruckt am: 25.12.2024 um 16:12 Uhr

mischn1980
mischn1980 12.08.2011 um 13:05:23 Uhr
Goto Top
Hi,

hab das gleiche Problem. Bei der Suche nach einer Lösung habe ich folgendes gefunden.

Beim Erstellen muss man in das Feld "Programm/Script:" C:\Windows\SysWOW64\cmd.exe reinschreiben und dann in das Feld "Argumente (optional):"/c" und die die Batchdatei mit dem Pfad.
Beispiel:
/c"c:\Programme\Batch\backup.bat"


Hier mal noch der Link

Pobiert habe ich die Lösung noch nicht aber vielleicht hilft es dir ja.

Gruss

Michael
eccos01
eccos01 12.08.2011 um 13:24:17 Uhr
Goto Top
Zitat von @mischn1980:
Hi,

hab das gleiche Problem. Bei der Suche nach einer Lösung habe ich folgendes gefunden.

Beim Erstellen muss man in das Feld "Programm/Script:" C:\Windows\SysWOW64\cmd.exe reinschreiben und dann in das Feld
"Argumente (optional):"/c" und die die Batchdatei mit dem Pfad.
Beispiel:
/c"c:\Programme\Batch\backup.bat"


Hier mal noch der Link

Pobiert habe ich die Lösung noch nicht aber vielleicht hilft es dir ja.

Gruss

Michael


Hallo Micha,

erstens wüßte ich nicht, wie ich beim Aufruf aus JAVA das berücksichtigen kann... und innerhalb des Batch-Skriptes... beim Aufruf von dbdsn.exe (Aufruf erfolg mit Pfad-Angabe) ... seh ich nicht ganz den Sinn.
Meines Wissens wird eine EXE-Datei nicht mit vorangestelltem CMD aufgerufen, oder?

Hier der relevante Auszug aus der Batch-Datei:
if /I NOT "%ASANYBIN%."=="%ASANY32BIN%." (  
   "%ASANY32BIN%\dbdsn.exe" -ls | FINDSTR /I /c:"myapp_32bit" > NUL  
  IF ERRORLEVEL 1 (
      "%ASANY32BIN%\dbdsn.exe" -y -ws myapp_32bit -c "eng=myapp;LINKS=TCPIP;Description=MyApp - 32bit" >> NUL 2>> NUL  
   )   
)
(Wie gesagt... die Umgebnungsvariablen sind gesetzt... das wurde auch nochmal mit Hilfsausgaben überprüft)
Outface
Outface 12.08.2011 um 13:56:22 Uhr
Goto Top
Hallo,

als Erstes schaust Du Dir vielleicht erstmal die Ausgaben der einzelnen Kommandos an:

Hier ein Beispiel, wie Du eine Log-Datei erzeugen kannst:

ECHO %date% %time% > "%~dpn0.log"  
ECHO ASANYBIN: %ASANYBIN% >> "%~dpn0.log"  
ECHO ASANY32BIN: %ASANY32BIN% >> "%~dpn0.log"  
if /I NOT "%ASANYBIN%."=="%ASANY32BIN%." (  
   "%ASANY32BIN%\dbdsn.exe" -ls >> "%~dpn0.log"  
   "%ASANY32BIN%\dbdsn.exe" -ls | FINDSTR /I /c:"myapp_32bit" >> "%~dpn0.log"  
  ECHO ERRORLEVEL: %ERRORLEVEL% >> "%~dpn0.log"  
  IF ERRORLEVEL 1 (
      "%ASANY32BIN%\dbdsn.exe" -y -ws myapp_32bit -c "eng=myapp;LINKS=TCPIP;Description=MyApp - 32bit" >> "%~dpn0.log" 2>> "%~dpn0.log"  
   )   
)
ECHO *-------------- >> "%~dpn0.log"  

1. Es ist nicht immer gut, alles in's NUL-Nirwana zu senden, was Aufschluss über den Verlauf geben könnte.

2. Und was soll in dem Fall passieren, wenn "%ASANYBIN%." == "%ASANY32BIN%." ???

Die Log-Datei entsteht im Verzeichnis der Cmd-Datei. Poste die Log-Datei hier. Vielleicht steht ja ein Hinweis auf das Problem darin.

Ein möglicher Grund wäre z.B., daß der Benutzer "System" schlicht keinen Zugriff auf den DB-Server hat, bei der Erzeugung des DSN das Programm dbdsn.exe aber eine funktionierende Verbindung aufzubauen versucht... aber das ist lediglich eine Mutmaßung von mir.

Outface
eccos01
eccos01 12.08.2011 um 14:11:12 Uhr
Goto Top
Zitat von @Outface:
Hallo,

als Erstes schaust Du Dir vielleicht erstmal die Ausgaben der einzelnen Kommandos an:

Hier ein Beispiel, wie Du eine Log-Datei erzeugen kannst:

> ECHO %date% %time% > "%~dpn0.log"  
> ECHO ASANYBIN: %ASANYBIN% >> "%~dpn0.log"  
> ECHO ASANY32BIN: %ASANY32BIN% >> "%~dpn0.log"  
> if /I NOT "%ASANYBIN%."=="%ASANY32BIN%." (  
>    "%ASANY32BIN%\dbdsn.exe" -ls >> "%~dpn0.log"  
>    "%ASANY32BIN%\dbdsn.exe" -ls | FINDSTR /I /c:"myapp_32bit" >> "%~dpn0.log"  
>   ECHO ERRORLEVEL: %ERRORLEVEL% >> "%~dpn0.log"  
>   IF ERRORLEVEL 1 (
>       "%ASANY32BIN%\dbdsn.exe" -y -ws myapp_32bit -c "eng=myapp;LINKS=TCPIP;Description=MyApp - 32bit"  
> >> "%~dpn0.log" 2>> "%~dpn0.log"  
>    )   
> )
> ECHO *-------------- >> "%~dpn0.log"  
> 

1. Es ist nicht immer gut, alles in's NUL-Nirwana zu senden, was Aufschluss über den Verlauf geben könnte.
Oben gezeigter Code ist ein Ausschnitt und nur die Originalfassung. Um die fehlerstelle einzuschränken hatte ich diverse Hilfsausgaben eingebaut.
Ergebnis ist, dass die Zeile ["%ASANY32BIN%\dbdsn.exe" -ls | FINDSTR /I /c:"myapp_32bit"] den Fehler verursacht und danach nichts mehr vom Skript ausgeführt wird.
Die verwendeten Umgebungsvariablen werden vorher in eine Protokolldatei ausgegeben und sind korrekt.

2. Und was soll in dem Fall passieren, wenn "%ASANYBIN%." == "%ASANY32BIN%." ???
da soll nichts passieren.

Die Log-Datei entsteht im Verzeichnis der Cmd-Datei. Poste die Log-Datei hier. Vielleicht steht ja ein Hinweis auf das Problem
darin.

Ein möglicher Grund wäre z.B., daß der Benutzer "System" schlicht keinen Zugriff auf den DB-Server hat,
bei der Erzeugung des DSN das Programm dbdsn.exe aber eine funktionierende Verbindung aufzubauen versucht... aber das ist
lediglich eine Mutmaßung von mir.
Das Programm (dbdsn.exe) muss keinen Zugriff auf den DB-Server haben... es ließt die ODBC-Einträge von Windows aus. Bzw. im zweiten Kommando wird ein ODBC-Eintrag erzeugt... aber soweit kommt das Skripte bei dem Kunden nicht.

Gibt es eine Möglichkeit ein Batch-Skript als Benutzer=SYSTEM auszuführen? der Test Vorort im Produktivsystem ist aufwendig und ist nur nachts machbar.
pieh-ejdsch
pieh-ejdsch 12.08.2011 um 14:20:55 Uhr
Goto Top
moin,

eventuell erscheint beim Kunden im Eigenschaftendialog der Fraglichen "Exe" oder "bat" bzw eher "cmd":
Die Datei stammt von einem Anderen Computer ... Zugriff erlauben -> Haken setzen.

Wird denn der Errorlevel in der if-Schleife auch dementsprechend gesetzt?
sonst die Klammer weglassen und mit einer Sprungmarke Arbeiten.

Gruß Phil
eccos01
eccos01 12.08.2011 um 14:32:45 Uhr
Goto Top
Zitat von @pieh-ejdsch:
moin,

eventuell erscheint beim Kunden im Eigenschaftendialog der Fraglichen "Exe" oder "bat" bzw eher
"cmd":
> Die Datei stammt von einem Anderen Computer ... Zugriff erlauben -> Haken setzen.

Wird denn der Errorlevel in der if-Schleife auch dementsprechend gesetzt?
sonst die Klammer weglassen und mit einer Sprungmarke Arbeiten.

Gruß Phil
Hallo Phil,

alle Programme liegen lokal auf dem ausführenden System.
Bzgl. Errorlevel... dbdsn.exe würde normalerweise einen Errorlevel zurückgeben... aber auswerten kann man es nicht mehr... die Skriptausführung wird abgebrochen.

Und ich muß noch einmal draufhinweisen... das Skript mit dem programm und allen Variablen läuft auf zig Systemen. Auch auf Systemen mit demselben Betriebssystem.
Es muß also irgendeine Systemeinstellung / Richtlinie oder ähnliches sein, die dieses Problem verursacht.
bastla
bastla 12.08.2011 um 14:50:43 Uhr
Goto Top
@ph
Wird denn der Errorlevel in der if-Schleife auch dementsprechend gesetzt?
Zu dieser Frage hat der TE ja schon geantwortet - an der Abfrage (es wird ja nicht %errorlevel% verwendet) sollte es aber jedenfalls auch innerhalb der Schleife nicht scheitern ...

Grüße
bastla