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-Key: 385646

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

Printed on: April 26, 2024 at 20:04 o'clock

Mitglied: 137084
137084 Sep 06, 2018 updated at 09:55:32 (UTC)
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)
Member: Penny.Cilin
Penny.Cilin Sep 06, 2018 at 10:30:33 (UTC)
Goto Top
Hallo,

und seit Windows 7 tut es auch ein
openfiles
.

Gruss Penny
Member: cced-de
cced-de Sep 06, 2018 at 10:45:31 (UTC)
Goto Top
Passwnd für locale files.. aber nicht auf einem Server (Remotezugriff.)
Member: WeltbesterITler
WeltbesterITler Sep 06, 2018 at 11:23:44 (UTC)
Goto Top
Man kann sich mit AutoIT ein Programm schreiben, dass das automatisch macht.
Member: cced-de
cced-de Sep 06, 2018 at 11:57:44 (UTC)
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
Member: BassFishFox
BassFishFox Sep 06, 2018 at 11:58:28 (UTC)
Goto Top
Hi,

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

BFF
Member: cced-de
cced-de Sep 06, 2018 at 12:10:14 (UTC)
Goto Top
Guck mal oben...
Member: BassFishFox
BassFishFox Sep 06, 2018 at 12:35:52 (UTC)
Goto Top
Ich meine Dich doch garnicht, @cced-de face-smile

BFF
Member: Friemler
Friemler Sep 06, 2018 updated at 12:42:19 (UTC)
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
Member: cced-de
cced-de Sep 07, 2018 at 05:52:23 (UTC)
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
Member: Friemler
Solution Friemler Sep 07, 2018 at 08:18:27 (UTC)
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
Member: cced-de
cced-de Sep 07, 2018 at 08:24:44 (UTC)
Goto Top
Super i fos. Vielen Dank nochmal.