cced-de
Goto Top

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

@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

Content-ID: 385646

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

Ausgedruckt am: 25.11.2024 um 20:11 Uhr

137084
137084 06.09.2018 aktualisiert um 11:55:32 Uhr
Goto Top
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)
Penny.Cilin
Penny.Cilin 06.09.2018 um 12:30:33 Uhr
Goto Top
Hallo,

und seit Windows 7 tut es auch ein
openfiles
.

Gruss Penny
cced-de
cced-de 06.09.2018 um 12:45:31 Uhr
Goto Top
Passwnd für locale files.. aber nicht auf einem Server (Remotezugriff.)
WeltbesterITler
WeltbesterITler 06.09.2018 um 13:23:44 Uhr
Goto Top
Man kann sich mit AutoIT ein Programm schreiben, dass das automatisch macht.
cced-de
cced-de 06.09.2018 um 13:57:44 Uhr
Goto Top
Ja, danke, habe ich schon von gehört, aber ich kann kein Basic, ich kann nur Batch und selbst da Hakt es face-smile
BassFishFox
BassFishFox 06.09.2018 um 13:58:28 Uhr
Goto Top
Hi,

Na dann zeig mal den Code fuer das Programm. face-wink

BFF
cced-de
cced-de 06.09.2018 um 14:10:14 Uhr
Goto Top
Guck mal oben...
BassFishFox
BassFishFox 06.09.2018 um 14:35:52 Uhr
Goto Top
Ich meine Dich doch garnicht, @cced-de face-smile

BFF
Friemler
Friemler 06.09.2018 aktualisiert um 14:42:19 Uhr
Goto Top
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:

@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
cced-de
cced-de 07.09.2018 um 07:52:23 Uhr
Goto Top
Zitat von @Friemler:

Hallo @cced-de,
Hi 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:
Das hast du recht, habe ja schon unter deinen Original Beitrag gepostet.
Es hat geholfen und funktioniert wie gewünscht.
Aber jetzt das Wichtigste, wo habe ich den Fehler gehabt?
Sehe wohl den Wald vor lauter Bäumen nicht...

LG CCED-DE
Friemler
Lösung Friemler 07.09.2018 um 10:18:27 Uhr
Goto Top
Moin

Zitat von @cced-de:

... wo habe ich den Fehler gehabt?

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 einem FINDSTR-Aufruf.
  • Der Befehl ECHO. führt zu einem Festplattenzugriff, es wird eine Datei mit dem Namen ECHO gesucht, deshalb habe ich stattdessen ECHO( verwendet.

Grüße
Friemler
cced-de
cced-de 07.09.2018 um 10:24:44 Uhr
Goto Top
Super i fos. Vielen Dank nochmal.