Fileserver 2019如何批量关闭除指定用户外的已打开文件
Windows Server 2019 文件服务器定向关闭打开文件方案
运行环境为Fileserver 2019,需求为批量关闭除某一指定用户外所有用户已打开的文件。
原有全量关闭脚本逻辑是遍历net files返回的文件ID逐个执行关闭操作,无法实现用户过滤:
for /f "skip=4 tokens=1" %%a in ('net files') do net files %%a /close
之前尝试单独提取用户名匹配时,因为只取了用户名字段,丢失了同条记录对应的文件ID,无法关联到需要跳过的文件条目;而net session \\<ip> /delete是基于来源IP踢整个会话,同IP多用户场景下会误操作,完全不适用。
注意:所有脚本都需要使用管理员权限运行,否则会因为权限不足无法枚举、关闭打开的文件;不要通过远程PS会话、远程C$共享挂载的方式执行脚本,避免脚本误关闭自身的远程连接导致执行中断。
方案1:原生批处理实现(无额外依赖,直接可用)
net files跳过4行表头后的有效输出行中,第1个token为打开文件的数字ID,第3个token为打开该文件的关联用户名,遍历输出时同时提取两个字段即可直接建立ID和用户名的对应关系,不需要额外做反向关联。
将脚本中KEEP_USER变量的值替换为需要保留的用户名,直接运行即可:
@echo off set "KEEP_USER=Andrew" for /f "skip=4 tokens=1,3" %%i in ('net files') do ( echo %%i| findstr /r "^[0-9]*$" >nul if %errorlevel% equ 0 ( if /i not "%%j"=="%KEEP_USER%" ( echo 正在关闭文件ID: %%i,对应用户: %%j net files %%i /close >nul ) else ( echo 跳过保留用户的打开文件,ID: %%i,用户: %%j ) ) ) echo 操作完成 pause
脚本逻辑说明:
tokens=1,3参数同时提取每行的文件ID(存入变量%%i)和用户名(存入变量%%j),同一次遍历直接拿到对应关系- 数字ID校验逻辑会自动跳过
net files输出末尾的“命令执行成功”这类非文件条目,避免无效ID导致的执行报错 /i参数实现用户名大小写不敏感匹配,适配域账号大小写输入不一致的场景- 执行过程打印全量操作日志,方便事后核对操作结果
方案2:PowerShell实现(输出更稳定,适合扩展规则)
Windows Server 2019自带PowerShell 5.1环境,可直接调用系统CIM类枚举打开的文件列表,不需要解析命令行文本输出,稳定性更高:
# 配置需要保留的用户名 $keepUser = "Andrew" # 枚举服务器上所有打开的文件连接 $openFileList = Get-CimInstance -ClassName Win32_ServerConnection -ErrorAction SilentlyContinue foreach ($fileConn in $openFileList) { # 域账号格式为「域名\用户名」,截取反斜杠后的用户名部分做匹配 $currentUser = $fileConn.UserName.Split('\')[-1] if ($currentUser -ine $keepUser) { Write-Host "关闭文件ID: $($fileConn.Id),对应用户: $currentUser" $fileConn | Remove-CimInstance } else { Write-Host "跳过保留用户的文件,ID: $($fileConn.Id),用户: $currentUser" } } Write-Host "操作完成"
内容的提问来源于stack exchange,提问作者AndreaTaroni86
相关产品推荐
相关产品推荐

