thecaptain
Goto Top

Batch unter Windows 7 - generelles Problem

Hallo,

ich versuche grade eine kleine Batch zu schreiben, die, unter anderem, eine Datei in den allusers-Autostart unter Win7 ablegen soll. Da die Benutzerkontensteuerung den Zugriff einschränkt, soll er prüfen, ob die Batch als Admin ausgeführt wurde (sprich das Kopieren überhaupt klappen kann). Ich habe mir eine Batch gebaut um den Ablauf zu simulieren. Leider verhält sich das Ding wirklich merkwürdig. Ich teste das hier unter Window 7 Professional x64, eigentlich dürfte es daran aber nicht liegen (korrigiert mich bitte, sollte ich falsch liegen).

@echo off

SET autostart=%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\Startup

XCOPY /C /F /R /Y TEST.cmd "%autostart%"  
IF %ERRORLEVEL% NEQ 0 (ECHO ACHTUNG - %ERRORLEVEL%) 
IF %ERRORLEVEL% EQU 0 (ECHO Sollte geklappt haben - %ERRORLEVEL%)

ECHO.
ECHO.
PAUSE

Ausführen mit normalen Rechten:
Zugriff verweigert
0 Datei(en) kopiert
Sollte geklappt haben - 0
Zugriff verweigert habe ich erwartet, ist also OK. Der Errorlevel sollte aber doch grade ungleich 0 sein wenn es einen Fehler gab, oder???

Ausführen als Administrator:
Datei TEST.cmd nicht gefunden
0 Datei(en) kopiert
ACHTUNG - 4
DAS verstehe ich ja nun gar nicht. Die Datei ist absolut 100%ig vorhanden, Zugriffsrechte sind gegeben, Speicherplatz ist massig da, etc.

Leider muss es eine Batch sein, da das Ding auch auf unseren alten Möhren laufen muss. Daher, und weil ich mich damit nicht auskenne, kommt Powershell nicht in Frage.

Content-Key: 135659

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

Printed on: June 24, 2024 at 17:06 o'clock

Member: Pjordorf
Pjordorf Feb 10, 2010 at 14:46:39 (UTC)
Goto Top
Hallo thecaptain,

rem @echo off
dir
pause
Fehler. Mach das "Echo aus" ertsmal aus, dann siesht du auch etwas.

dann wirst du feststellen, das dein Verzeichniss jeweils ein anderes ist.

Ausführen mit normalen Rechten:
> Zugriff verweigert
> 0 Datei(en) kopiert
Richtig so

Ausführen als Administrator:
> Datei TEST.cmd nicht gefunden
Richtig

DAS verstehe ich ja nun gar nicht. Die Datei ist absolut 100%ig vorhanden, Zugriffsrechte sind gegeben, Speicherplatz ist massig
da, etc.
Nur leider an der falschen Stelle, von deiner Batchdate aus betrachtet.

Peter
Member: DerWoWusste
DerWoWusste Feb 10, 2010 at 14:56:14 (UTC)
Goto Top
Hi.

Wann soll denn die Batch laufen? In Startskripten stört die UAC nicht. Startest Du sie manuell oder aus einem anderen Programm heraus, muss sie nicht nur als Admin, sondern auch hochgestuft (=elevated) gestartet werden.
Member: thecaptain
thecaptain Feb 10, 2010 at 15:22:01 (UTC)
Goto Top
Zitat von @DerWoWusste:
Wann soll denn die Batch laufen? In Startskripten stört die UAC nicht. Startest Du sie manuell oder aus einem anderen
Programm heraus, muss sie nicht nur als Admin, sondern auch hochgestuft (=elevated) gestartet werden.

Bei einigen speziellen Rechnern wird es manuell ausgelöst, ansonsten wollte ich die Batch später in unser Kixstart-Skript mit einbinden, das läuft aber erst nach der Benutzeranmeldung durch, also dürfte die UAC Probleme machen.

Zitat von @Pjordorf:
>
rem @echo off
> dir
> pause
> 
Fehler. Mach das "Echo aus" ertsmal aus, dann siesht du auch etwas.
dann wirst du feststellen, das dein Verzeichniss jeweils ein anderes ist.

> Ausführen als Administrator:
> > Datei TEST.cmd nicht gefunden
Richtig
Ok, Ok, I see. Als Administrator ausgeführt geht das Ding von dem Pfad %SYSTEMROOT%\system32 aus. Das erklärt den Fehler natürlich - GUTER Hinweis. Allerdings verstehe ich nicht ganz, was das "dir" an der Stelle bringen sollte, aber egal. Schon mal ein wichtiger Ansatzpunkt. Gleich mal ausprobieren...

Aber den merkwürdigen "Errorlevel" mit normalen Rechten kann ich mir immer noch nicht erklären.
Mitglied: 60730
60730 Feb 10, 2010 at 15:32:50 (UTC)
Goto Top
Moin,

Allerdings verstehe ich nicht ganz, was das "dir" an der Stelle bringen sollte

naja - bei Ordnern - die nicht 80+ Dateien/Unterordner haben - hätte das was gebracht - um genauer zu sein...
rem @echo off
dir /p
pause
rem usw.
wäre dann der Zaunpfahl, an den Du dich anlehnen kannst.

Aber den merkwürdigen "Errorlevel"...

naja der ist wie immer - würdig um Ihn sich zu merken...

XCOPY /C /F /R /Y TEST.cmd "%autostart%"   
if not exist "%autostart%\TEST.cmd" echo hier stimmt was nicht  
... oder so ähnlich passt viel besser.
Member: Pjordorf
Pjordorf Feb 10, 2010 at 15:55:38 (UTC)
Goto Top
hallo thecaptain,

> Aber den merkwürdigen "Errorlevel"...

> XCOPY /C /F /R /Y TEST.cmd "%autostart%"   
> 
Du verwendest den Parameter /C (Ignore errors laut technet). Ohne diesen sollte es dann gehen. Also

XCOPY /F /R /Y TEST.cmd "%autostart%"  
IF %ERRORLEVEL% NEQ 0 (ECHO ACHTUNG - %ERRORLEVEL%)
IF %ERRORLEVEL% EQU 0 (ECHO Sollte geklappt haben - %ERRORLEVEL%) 

Peter
Member: Biber
Biber Feb 10, 2010 at 17:35:27 (UTC)
Goto Top
@Pjordorf

Zitat von @Pjordorf:
Du verwendest den Parameter /C (Ignore errors laut technet).
Ohne diesen sollte es dann gehen. Also

Ja schon, wenn irgendein Delmenhorster Volkshochschulkurs die XCopy.exe implementiert hätte, dann ja.
Für die Redmonder XCopy-Variante und speziell die zurückgegebenen Errorlevel ist keinerlei Logik erkennbar.

Eher eine gewisse Gelassenheit..

Beispiel:
>xcopy d:\temp\Jibbet.Nich e:\  
Datei Jibbet.Nich nicht gefunden.
0 Datei(en) kopiert

>echo %errorlevel%
4

>xcopy d:\temp\Jibbet.Nich? e:\
Datei Jibbet.Nich? nicht gefunden.
0 Datei(en) kopiert

>echo %errorlevel%
0

>xcopy d:\temp\Jibbet.Nich e:\  /C
Datei Jibbet.Nich nicht gefunden.
0 Datei(en) kopiert

>echo %errorlevel%
4

Anmerkung:
- der Errorlevel 4 im Fall "Eine konkret angegebene Quell Datei" wie auch der Errorlevel 0 im zweiten Wildcard-Fall korrespondieren in keinster Weise mit der technet und/oder Windows-Dokumentation.

... Setzen von /C bedeutet wirklich nur /Continue, aber die Fehlercodes werden dennoch gesetzt.
Natürlich auch die, die immer falsch gesetzt werden

Grüße
Biber
Member: Pjordorf
Pjordorf Feb 10, 2010 at 18:55:58 (UTC)
Goto Top
@Biber,

ich kann dir da nicht widersprechen. Ich habe das auch so gesehen. Es geht hier aber noch um den fall, das die zu kopierende Datei im Pfad existiert, aber wegen fehlender Schreibrechte nicht angelegt werden kann. Da ist das Ergebniss bei xcopy dann ohne /C wieder richtig.

Die zu kopierende Datei ist nicht vorhanden, keine Schreibrechte im Zielordner
>XCOPY /C /F /R /Y D:\Temp\Jibbet.nich D:\Testing
Datei Jibbet.nich nicht gefunden.
0 Datei(en) kopiert
>Errorlog = 4

>XCOPY /F /R /Y D:\Temp\Jibbet.nich D:\Testing
Datei Jibbet.nich nicht gefunden.
0 Datei(en) kopiert
>Errorlog = 4

Die zu kopierende Datei ist vorhanden, keine Schreibrechte im Zielordner
>XCOPY /C /F /R /Y D:\Temp\Jibbet.nich D:\Testing
D:\Temp\Jibbet.Nich -> D:\Testing\Jibbet.Nich
Zugriff verweigert
0 Datei(en) kopiert
>Errorlog = 0

Hier das auszuwertende Ergebniss (keine Schreibrechte)
>XCOPY /F /R /Y D:\Temp\Jibbet.nich D:\Testing
D:\Temp\Jibbet.Nich -> D:\Testing\Jibbet.Nich
Zugriff verweigert
>Errorlog = 4

Zu kopierende Datei ist vorhanden, Schreibrechte im Zielordner vorhanden
>XCOPY /C /F /R /Y D:\Temp\Jibbet.nich D:\Testing
D:\Temp\Jibbet.Nich -> D:\Testing\Jibbet.Nich
1 Datei(en) kopiert
Errorlog = 0

>XCOPY /F /R /Y D:\Temp\Jibbet.nich D:\Testing
D:\Temp\Jibbet.Nich -> D:\Testing\Jibbet.Nich
1 Datei(en) kopiert
Errorlog = 0

Somit wird das fehlen der Schreibrechte bei xcop nur ohne /C im ERRORLEVEL auswertbar übergeben.

Peter
Member: Biber
Biber Feb 10, 2010 at 19:46:58 (UTC)
Goto Top
Moin Pjordorf,

watt sind die tricky, diese RedmonderInnen.... *staun*

Punktuell coden die ja wie die Profis.... da kann ich gar nicht schnell genug hinterbatchen.

Du hast natürlich Recht... in dem Fall "Zieldatei kann nicht geschrieben werden" wirkt der Schalter /C auf das Errorlevel bzw. setzt es auf 0.

Viellecht sollten wir mal die TechNet-Doku ein bisschen ergänzen.

Grüße
Biber
Member: thecaptain
thecaptain Feb 11, 2010 at 08:02:03 (UTC)
Goto Top
Hallo nochmal,

vielen Dank für die Hinweise. Ich habe die Batch jetzt ein wenig umgeschrieben, um mich nicht mehr auf diese *tollen* Errorlevel verlassen zu müssen.

Ist zwar nicht hübsch, aber funktioniert jetzt wenigstens:
::@echo off
SET autostart=%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\Startup
SET quelle=D:\Softwaretests\Batch-Installer\2010-02-10

XCOPY /C /F /R /Y "%quelle%"\TEST.cmd "%autostart%"  
IF EXIST "%autostart%"\TEST.cmd (ECHO Hat geklappt)  
IF NOT EXIST "%autostart%"\TEST.cmd (ECHO ACHTUNG - Kein Admin!)  

ECHO.
ECHO.
PAUSE
Man glaubt gar nicht, wie viel Zeit man mit einer so banalen Batch verplempern kann...
Member: DerWoWusste
DerWoWusste Feb 11, 2010 at 17:56:42 (UTC)
Goto Top
Man glaubt gar nicht, wie viel Zeit man mit einer so banalen Batch verplempern kann...
... und dann stimmt's immer noch nicht ; )
Deine Adminprüfung berücksichtigt die Elevation doch gar nicht. Ein Admin ist erst elevated "richtig" Admin. Dein Test wird also auch bei allen Admins zurückgeben "Achtung - kein Admin", solange die UAC an ist.

Also lass die Prüfung sein und mach ein Startskript daraus - geht immer. Wenn es manuell ausgeführt werden soll, musst man es elevated starten (per Rechtsklick -> "als Administrator ausführen"). Kommt eine Kennwortabfrage, ist man nicht in der Admingruppe - ganz einfach.