Batch - Geöffnete Files auf einem Server Ermitteln und ggf. schließen
Hallo,
Ich möchte per Batch und mit externen Tools ( PSFile )und (WInput) 1. feststellen welcher User welche Files auf einem bestimmten Server geöffnet hat, und 2. diese Sessions ggf.schließen. Allerdings bekomme ich bei meinem Script leider nicht nur die Files des gesuchten Users, sondern auch noch einige andere (oder manchmal auch KEINE , obwol es geöffnete Dateien gibt). Das darf natürlich nicht passieren... Es soll sowohl das geöffnete File, als auch die "Locks" angezeigt werden.
Bin sehr auf eure Tips gespannt und bedanke mich schon hetzt für eure Hilfe.
Hier mein Script
Ich möchte per Batch und mit externen Tools ( PSFile )und (WInput) 1. feststellen welcher User welche Files auf einem bestimmten Server geöffnet hat, und 2. diese Sessions ggf.schließen. Allerdings bekomme ich bei meinem Script leider nicht nur die Files des gesuchten Users, sondern auch noch einige andere (oder manchmal auch KEINE , obwol es geöffnete Dateien gibt). Das darf natürlich nicht passieren... Es soll sowohl das geöffnete File, als auch die "Locks" angezeigt werden.
Bin sehr auf eure Tips gespannt und bedanke mich schon hetzt für eure Hilfe.
Hier mein Script
@echo off
setlocal enabledelayedexpansion
:start
cls
REM ----------- Variablen setzen --------------
Set "fname=%temp%\openfiles.txt"
Set "destfile=con"
Set /P "Servername=Servername: "
Set /P "Username=Username: "
del %destfile% 2>NUL
REM ----------- PSFile starten und Ausgabe in Txtdatei schreiben --------------
psfile \\%Servername% -nobanner >%fname%
REM ----------- Txtdatei auslesen, Usernamen suchen und geöffnete Files anzeigen --------------
for %%a in ("%fname%") do (
for /f "delims=:" %%b in ('findstr /i /n /r /c:"\<%Username%\>" "%%a"') do (
set /a theNextline=%%b-1 > NUL
for /f "delims=: tokens=1,*" %%i in ('findstr /n $ "%%a" ^| findstr /b "!theNextLine!"') do (
if "%%j" neq "" echo %%j>>"%destfile%"
set /a theNextline=%%b+1 > NUL
for /f "delims=: tokens=1,*" %%i in ('findstr /n $ "%%a" ^| findstr /b "!theNextLine!"') do (
if "%%j" neq "" echo %%j>>"%destfile%"
)
)
)
)
echo.
REM ----------- Auswähren ob File geschlossen werden soll --------------
CHOICE /C JNX /M "Soll der Zugriff beendet werden? [J]a | [N]ein [X] - Abbruch"
echo.
if errorlevel = 3 goto end
if errorlevel = 2 goto start
if errorlevel = 1 goto close
:close
REM ----------- File soll geschlossen werden --------------
REM ----------- Adminname & Passwort abfragebn --------------
winput "set admin=$input" "Admin Name" >NUL
winput "set pw=$input" "Admin PW" /pass >NUL
REM ----------- FileID angeben --------------
Set /P fid=File id :
REM ----------- File schließen --------------
psfile \\%Servername% -u %admin% -p %pw% %fid% -c -nobanner
:noname
cls
Echo FEHLER: Kein Adminname angegeben
Timeout 10
goto start
:nopw
cls
Echo FEHLER: Kein Passwort angegeben
Timeout 10
goto start
:end
:eof
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 385646
Url: https://administrator.de/contentid/385646
Ausgedruckt am: 25.11.2024 um 20:11 Uhr
12 Kommentare
Neuester Kommentar
Gibt's doch schon viel Futter auch mit Bordmitteln ...z.B hier gefunden
Powershell - GUI für offene Netzwerk-Sessions (net session) und offene Dateihandles (net file)
Powershell - GUI für offene Netzwerk-Sessions (net session) und offene Dateihandles (net file)
Hallo @cced-de,
in Anbetracht dessen, dass Du ein Script von mir modifiziert hast, hier mal eine funktionierende Version des Codes, evtl. hilft Dir das ja schon weiter:
Grüße
Friemler
in Anbetracht dessen, dass Du ein Script von mir modifiziert hast, hier mal eine funktionierende Version des Codes, evtl. hilft Dir das ja schon weiter:
@echo off & setlocal enabledelayedexpansion
REM ----------- Hauptschleife --------------
:start
cls
REM ----------- Variablen setzen --------------
set "fname=%TEMP%\OpenFiles.txt"
set "destfile=CON"
set /p "Servername=Servername: "
set /p "Username=Username: "
echo(
echo(
REM ----------- PSFile starten und Ausgabe in Textdatei schreiben --------------
psfile "\\%Servername%" -nobanner > "%fname%"
REM ----------- Textdatei auslesen, Usernamen suchen und geöffnete Files anzeigen --------------
del "%destfile%" 2>NUL
for /f "delims=:" %%a in ('findstr /inr /c:"\<%Username%\>" "%fname%"') do (
set /a theNextline=%%a-1 > NUL
for /f "tokens=1* delims=: " %%i in ('findstr /n "^" "%fname%"') do (
if "%%i" equ "!theNextline!" if "%%j" neq "" >>"%destfile%" echo %%j
)
set /a theNextline=%%a+1 > NUL
for /f "tokens=1* delims=: " %%i in ('findstr /n "^" "%fname%"') do (
if "%%i" equ "!theNextline!" if "%%j" neq "" >>"%destfile%" echo %%j
)
echo(
)
echo(
echo(
REM ----------- Auswählen ob File geschlossen werden soll --------------
choice /c JNX /n /m "Soll der Zugriff beendet werden? [J]a | [N]ein [X] - Abbruch "
echo(
if errorlevel 3 goto end
if errorlevel 2 goto start
if errorlevel 1 goto close
REM ----------- Adminname & Passwort abfragen --------------
:close
set /p "admin=Admin Name: "
winput "set pw=$input" "Admin PW: " /pass >NUL
set /p "fid=File ID: "
echo(
echo(
REM ----------- File schließen --------------
psfile "\\%Servername%" -nobanner -u "%admin%" -p "%pw%" %fid% -c
goto end
REM ----------- Fehlerbehandlung --------------
:noname
cls
echo FEHLER: Kein Adminname angegeben
timeout 10
goto start
:nopw
cls
echo FEHLER: Kein Passwort angegeben
timeout 10
goto start
REM ----------- Aufräumen und beenden --------------
:end
del "%destfile%" 2>NUL
del "%fname%" 2>NUL
exit /b 0
Grüße
Friemler
Moin
Da gab es gleich mehrere:
Außerdem gab es noch ein paar Stellen, die unter bestimmten Bedingungen zu Fehlfunktionen hätten führen können, weil Anführungszeichen gefehlt haben.
Nicht zuletzt habe ich noch einige Optimierungen eingebaut:
Grüße
Friemler
Da gab es gleich mehrere:
- In der
FOR
-Schleife wurden Klammern an der falschen Stelle geschlossen. - Die Syntax um den
ERRORLEVEL
abzufragen war falsch (überflüssiges Gleichheitszeichen). - Nach erfolgreicher Ausführung des Scripts wurde trotzdem auch der Code zur Fehlerbehandlung ausgeführt.
Außerdem gab es noch ein paar Stellen, die unter bestimmten Bedingungen zu Fehlfunktionen hätten führen können, weil Anführungszeichen gefehlt haben.
Nicht zuletzt habe ich noch einige Optimierungen eingebaut:
- Die äußere
FOR
-Schleife in Deinem Script konnte komplett entfallen, da für die Problemstellung nur eine Datei verarbeitet werden muss. - Die Prüfung auf die richtige Zeilennummer kann mit einer
IF
-Abfrage performanter ausgeführt werden, als mit einemFINDSTR
-Aufruf. - Der Befehl
ECHO.
führt zu einem Festplattenzugriff, es wird eine Datei mit dem NamenECHO
gesucht, deshalb habe ich stattdessenECHO(
verwendet.
Grüße
Friemler