是否可以配置 Windows,使其在具有完全权限的用户通过共享删除共享文件时自动关闭共享文件读取锁定?我知道有手动执行此操作的方法但我希望它自动发生。
为了添加更多详细信息,我有一台运行 Windows Server 2012 R2 的主机。主机在 Hyper-V 中运行 Windows 10 VM。主机还共享一个文件夹,该文件夹具有权限,使得“每个人”都具有读取执行访问权限,而 VM 上的一个用户具有完全访问权限。当我从第二台计算机(作为“每个人”用户)连接到共享时,我可以按预期访问文件(只读),在 shell、记事本等中打开它们。但是,如果我在打开文件时尝试使用 VM 用户从共享中删除它们,系统会挂起,因为文件上有读锁。但是,如果我从主机服务器中删除它们,读锁通常(但并非总是)强制删除。有没有办法在主机上或通过 VM 用户删除它们时始终获得此行为,例如“写访问覆盖读锁”共享标志?
编辑:
我真的想要做的是,从主机服务器和 VM,通过 shell 和命令提示符,重命名和删除文件,并使操作始终成功,即使其他用户通过共享打开文件进行读取。
编辑2:
为了澄清我的意思自动的rmdir
,我需要在使用标准命令(例如、等)以及 shell 接口时忽略读锁erase
,理想情况下甚至使用 Win32 API(尽管后者不是必需的)。使用脚本或其他自定义命令,即使使用完全相同的语法,也不会起作用,除非有办法挂接标准命令以使用自定义命令。原因是因为我正在运行修改共享文件的第三方批处理文件和可执行文件,如果它们无法修改目标文件,这些脚本和程序就会失败。修改第三方文件以使用自定义的破锁命令不是一个选择。
我知道作为所有这些的替代方案,我可以使用内部暂存目录运行第三方程序,然后在完成它们的输出时移动它们的各个部分,但我的目标是让输出逐步在共享上可用,而不仅仅是在每部分完成后才可用。
答案1
我们可以非常接近执行程序以及一些批量工作。
在你的服务器/虚拟机上,我们需要紧密结合,不要复杂化,释放命令到现存的在命令提示符中重命名和删除命令。隐含的优先级是尽可能无缝。
首先,为了在客户端上启用 PsExec 网络执行,请创建一个 reg 文件:
客户端启用-psexec.reg:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System]
"LocalAccountTokenFilterPolicy"=dword:00000001
这将确保客户端运行服务器/虚拟机发送的命令。
在服务器端,下载执行程序从 TechNet 网站安装到您的服务器 VM。
然后,将这些 .bat 文件放入系统环境目录,因此可以从服务器/虚拟机上的任何位置调用它们:
x-del.bat(参数:文件;替代del
命令)
psexec \\* c:\client-release.bat %~n1 :: \\* = all network clients, %~n1 = filename
timeout /t 3
del %1
x-ren.bat(参数:文件,名称)
psexec \\* c:\client-release.bat %~n1
timeout /t 3
ren %1 %2
将此.bat 文件放在所有客户端上:
client-release.bat(参数:要关闭的文件共享)
setlocal enabledelayedexpansion
net file > c:\temp.txt
for /F "tokens=*" %%A in (c:\temp.txt) do ( :: Loop through net file output line by line
echo.%%A | findstr /I /C:"%1">nul && ( :: Check if entry contains file in question
set vara=%%A
set varb=!vara:~0,1! :: First char of line output is PID of of file
net file !varb! /close
) || (
rem not found, move on
)
)
del c:\temp.txt
命令用法:
c:\> del Z:\ServerFolders\file.doc
File could not be deleted: in use
c:\> ren Z:\ServerFolders\file.doc newfile.doc
Access Denied
c:\> x-del Z:\ServerFolders\file.doc
File Deleted Sucessfully
c:\> x-ren Z:\ServerFolders\file.doc newfile.doc
Renamed
c:\>
真正的覆盖:
如果您想要覆盖实际del
命令以及用于具有版本控制等的批处理文件的其他内部命令,则可以使用这个魔法:
setdos /i-del
alias del=c:\windows\system32\x-del.bat
setdos /i-ren
alias ren=c:\windows\system32\x-ren.bat
有什么收获吗?
您需要与 Windows 默认 cmd 一起安装第三方命令提示符:JPSoft 掌控全局
以上命令取自此处:覆盖 TCC 内部命令 - JPSoft