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).
Ausführen mit normalen Rechten:
Ausführen als Administrator:
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.
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???0 Datei(en) kopiert
Sollte geklappt haben - 0
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.0 Datei(en) kopiert
ACHTUNG - 4
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 135659
Url: https://administrator.de/contentid/135659
Ausgedruckt am: 22.11.2024 um 12:11 Uhr
10 Kommentare
Neuester Kommentar
Hallo thecaptain,
Fehler. Mach das "Echo aus" ertsmal aus, dann siesht du auch etwas.
dann wirst du feststellen, das dein Verzeichniss jeweils ein anderes ist.
Peter
rem @echo off
dir
pause
dann wirst du feststellen, das dein Verzeichniss jeweils ein anderes ist.
Ausführen mit normalen Rechten:
> Zugriff verweigert
> 0 Datei(en) kopiert
Richtig so> Zugriff verweigert
> 0 Datei(en) kopiert
Ausführen als Administrator:
> Datei TEST.cmd nicht gefunden
Richtig> Datei TEST.cmd nicht gefunden
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.da, etc.
Peter
Moin,
naja - bei Ordnern - die nicht 80+ Dateien/Unterordner haben - hätte das was gebracht - um genauer zu sein...
wäre dann der Zaunpfahl, an den Du dich anlehnen kannst.
naja der ist wie immer - würdig um Ihn sich zu merken...
... oder so ähnlich passt viel besser.
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.
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
hallo thecaptain,
Du verwendest den Parameter /C (Ignore errors laut technet). Ohne diesen sollte es dann gehen. Also
Peter
> Aber den merkwürdigen "Errorlevel"...
> XCOPY /C /F /R /Y TEST.cmd "%autostart%"
>
XCOPY /F /R /Y TEST.cmd "%autostart%"
IF %ERRORLEVEL% NEQ 0 (ECHO ACHTUNG - %ERRORLEVEL%)
IF %ERRORLEVEL% EQU 0 (ECHO Sollte geklappt haben - %ERRORLEVEL%)
Peter
@Pjordorf
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:
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
Zitat von @Pjordorf:
Du verwendest den Parameter /C (Ignore errors laut technet).
Ohne diesen sollte es dann gehen. Also
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
@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
Die zu kopierende Datei ist vorhanden, keine Schreibrechte im Zielordner
Hier das auszuwertende Ergebniss (keine Schreibrechte)
Zu kopierende Datei ist vorhanden, Schreibrechte im Zielordner vorhanden
Somit wird das fehlen der Schreibrechte bei xcop nur ohne /C im ERRORLEVEL auswertbar übergeben.
Peter
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
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
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
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.