Ping nur als Administrator möglich?
Guten Morgen,
hab ein kleines Batch-Skript geschrieben, welches mir mehrere Hostnamen anpingt und überprüft, ob diese erreichbar sind:
@echo off
SET liste=C:\Temp\Pingi\Liste.txt
FOR /f %%i in (%liste%) do (
ping %%i
)
Starte ich das Skript als Administrator ("ausführen als Administrator") oder per PowerShell funktioniert es. Starte ich es nun aber als ganz normaler User, oder als angemeldeter Administrator, stürzt die CMD leider ab.
Ausgeführt als User
Ausgeführt als Admin
Befehle wie ECHO funktionieren.
Jemand eine Idee?
Danke!
4 Antworten
Alles klar, da hat dir die Aufrufhierarchie einen Streich gespielt.
Bei einem Aufruf eines Programms ohne Endung, wird erstmal im aktuellen Arbeitsverzeichnis nach Programmen mit den in %pathext% definierten Endungen gesucht, anschließend würde das gleiche für jeden in %path% definierten Ordner getan, bis zum ersten Auftreten eines Treffers.
Da Deine Batch ping.bat heißt, ist bereits mit ping.bat ein passendes Programm im Arbeitsverzeichnis vorhanden und wird gestartet.
...und das Verhängnis nimmt seinen Lauf. Wir haben eine selbstaufrufende Batch, welche sich bis zum maximalen Rekursionslimit der Console immerwieder startet. Da in jeder Rekursionsebene soviel Aufrufe wie Einträge in Liste erfolgen wird warscheinlich der Speicher schneller erschöpft als die Rekursion abgebrochen wird... dann erscheint die Fehlermeldung bzgl Cmdabsturtz. 🤮
Wenn du als Admin startest ist das Arbeitsverzeichnis ...System32... und nicht das Verzeichnis der Batch. Damit wird auch richtigerweise ping.exe als erstes ping gewählt. Und die Batch läuft durch.
Das ganze hat schon Generationen von Batchprogern zur Verzweiflung gebracht (bei 8.3-Namen war mögliche Wahl von Namen begrenzter als Heute.)
Theoretisch müsste man um derartigen "Verwechslungen" entgegenzuwirken immer den Pfad und vollen Namen.ext aufrufen.
Macht aber keiner... einfach keine gleichen Namen vergeben....
https://www.google.com/search?q=windows+ping+admin&ie=utf-8&oe=utf-8
liefert u. a.
Darin wird u. a. ein fehlerhafter Registry-Eintrag für den Benutzer erwähnt. (Hast du noch ein weiteres Nicht-Admin-Benutzerkonto auf dem Rechner? Geht es damit?)
Schau dir mal bei drn Kontoeinstellungen des Benutzers an, was dort unter "PATH" steht. Da könnten ungültige Zeichen drin sein, auch unsichtbare.
Es funktioniert nicht mal ein ping localhost in einem skript (egal ob .bat oder .cmd)
Starte ich einfach so eine cmd und pinge, funktioniert es.
Auch das Skript, geschrieben in der cmd funktioniert. Selbst mit Variablendeklaration. Er hat nur ein Problem bei der Ausführung von CMD/ Batch-Skripten als User. Führe ich das Skript als Administrator aus (über das Kontextmenü der rechten Maustaste (nicht als angemeldeter Administrator!)) funktioniert es.
Anbei mein ganzes SET (Username ersetzt durch xyz)
C:\Users\xyz>set | more
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\xyz\AppData\Roaming
CommonProgramFiles=C:\Program Files\Common Files
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
CommonProgramW6432=C:\Program Files\Common Files
COMPUTERNAME=HOSTNAME
ComSpec=C:\WINDOWS\system32\cmd.exe
DriverData=C:\Windows\System32\Drivers\DriverData
FPS_BROWSER_APP_PROFILE_STRING=Internet Explorer
FPS_BROWSER_USER_PROFILE_STRING=Default
HOMEDRIVE=C:
HOMEPATH=\Users\xyz
LOCALAPPDATA=C:\Users\xyz\AppData\Local
LOGONSERVER=\\HOSTNAME
NUMBER_OF_PROCESSORS=4
OS=Windows_NT
Path=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 69 Stepping 1, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=4501
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files
ProgramFiles(x86)=C:\Program Files (x86)
ProgramW6432=C:\Program Files
PROMPT=$P$G
PSModulePath=C:\Program Files\WindowsPowerShell\Modules;C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules
PUBLIC=C:\Users\Public
QT_DEVICE_PIXEL_RATIO=auto
SESSIONNAME=Console
SystemDrive=C:
SystemRoot=C:\WINDOWS
TEMP=C:\Users\xyz\AppData\Local\Temp
TMP=C:\Users\xyz\AppData\Local\Temp
USERDOMAIN=HOSTNAME
USERDOMAIN_ROAMINGPROFILE=HOSTNAME
USERNAME=xyz
USERPROFILE=C:\Users\xyz
windir=C:\WINDOWS
Das Skript heißt ping.bat.
Benne ich es um -> funktioniert es als User und Admin
Heißt es ping.bat -> funktioniert es nur als Admin
gebe ich anstelle von ping %%i -> C:\Windows\System32\ping.exe %%i an -> geht es.
Klar könnte ich es umbenennen und gut ist, aber ich würde dennoch gerne wissen, warum es als User nicht klappt und als Admin schon...
Gib doch statt ping einfach ping.exe an, damit sollte es auch schon funktionieren.
Dass das Script denselben Namen hat wie ein Systemtool ist schon merkwürdig und bestimmt nicht zu empfehlen sowie Ursache des Problems. Was jetzt beim Admin an %PATH% und %PATHEXT% anders ist, wäre vielleicht mal interessant, m. E. aber viel zu viel Aufwand verglichen mit dem Aufwand, Namenskonflikte von vornherein zu vermeiden.
(Ich habe auch ein paar Batch-Dateien mit ping in einem der %PATH%-Ordner, aber die heißen ping_local.bat etc.)
Jeder Benutzer kann seine eigenen Umgebungsvariablen haben. Möglicherweise hat der Administrator andere Einträge in %PATH% oder %PATHEXT% oder die Batch-Datei wird mit verschiedenen aktuellen Verzeichnissen gestartet.
Die verschiedenen Verzeichnisse scheinen mir die Ursache zu sein - soweit ich mich erinnere, startet cmd.exe für Administratoren in %WINDIR%\system32, wo auch ping.exe liegt.
Der Pfad: C:\Temp\ erscheint mir doch recht ungewöhnlich.
Standartmäßig befindet sich der Temp-Ordner in "C:\Users\DeinProfile\AppData\Local\Temp" und wird über die Variable %temp% angesprochen.
Immerhin ist es möglich das ein nichtadmin-Profil garnicht die Datei Liste.txt lesen darf. Immerhin kann der Ordner C:\Temp nur als Admin erstellt worden sein.
Da Du Deine Batch auch nicht mit "Pause" abgeschlossen hast kannst du natürlich auch nicht sehen warum die Batch abschmiert.
Klappt wunderbar mit oder ohne admin...
@echo off
set "liste=%temp%\liste.txt"
rem zur demo Liste im richtigen Temp-Ordner (auf dem Du auch jederzeit zugriff hast) erstellen.
echo localhost >"%liste%"
echo google.com >>"%liste%"
echo gutefrage.net >>"%liste%"
rem ordentlicher Dateizugriff der auch bei Leerzeichen im Namen nicht fehlschlägt.
rem die von dier verwendete Notation ist extrem feheleanfällig.
for /f "usebackq" %%i in ("%liste%") do (
ping %%i
)
pause
rem tempordner öffnen
start "" "%temp%"
Hi,
hab das Skript mit der Liste an verschiedenen Orten probiert -> leider kein Erfolg.
Habe Adminrechte als angemeldeter User -> kann überall zugreifen.
Habe bei dem Skript das Ping mal durch Echo ersetzt - > funktioniert dann.
Dann schau dir mal C:\Windows\System32\ping.exe an.
Unter Eigenschaften/Sicherheit findest du die Berechtigungen. Möglicherweise hat irgendein Schadprogramm dort die Berechtigung zum Ausführen für Benutzer entzogen. In diesem Fall musst Du diese wieder erteilen.
In diesem Kontext solltest Du gleich überprüfen, ob ping.exe und andere Programme noch die Rechte vom übergeordneten Verzeichnis erben.
Da das von Dir aufgezeigte Verhalten keineswegs normal ist, solltest Du evtl. eine Neuinstallation oder ein Inplaceupgrade ins Auge fassen.
Wenn das System derartige Fehlfunktionen aufweist dürfte löschen der Systempartition und eine Neuinstallation meines Erachtens der sauberste Weg sein.
Hi, bevor ich das Inplaceupgrade mache ist mir folgendes aufgefallen.
Das Skript heißt ping.bat.
Benne ich es um -> funktioniert es als User und Admin
Heißt es ping.bat -> funktioniert es nur als Admin
gebe ich anstelle von ping %%i -> C:\Windows\System32\ping.exe %%i an -> geht es.
Klar könnte ich es umbenennen und gut ist, aber ich würde dennoch gerne wissen, warum es als User nicht klappt und als Admin schon...
Also wenn ich cmd starte kann ich jeden befehl eingeben da stürzt mir gar nix ab.
du hast einen lapsus im batch nehme ich an
Path=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;
Das kommt bei mir heraus.
Bei den anderen Usern klappt es ebenfalls nicht.