2010-07-29 228 views
2

背景:如何在用户运行EXE文件时覆盖EXE文件?

我们公司内部用户的运行我们在10-20 Windows终端服务器的.Net程序。该 可执行文件都存储在运行Windows 2003的一些终端服务器的中央文件服务器上运行的是Windows 2003和一些正在运行2008

问题:

当我们发布一个新版本的程序中,我们重命名了可能被锁定的文件(EXE,DLL's等),然后我们将文件的较新版本复制到适当的位置。直到我们开始引入windows 2008终端服务器之前,这工作完美无缺。现在,如果2008年WTS之一的用户正在运行该程序,那么文件被锁定的方式甚至不能重命名。

问题

  • 有没有办法重命名锁定 文件?

  • 有没有一种方法可以禁用2008年的这个新功能,它们在运行时锁定EXE文件?

  • 有没有更好的解决方案?

回答

3

我们的问题原来是因为Windows文件共享中一个名为“Opportunistic Locking”的新功能。当两台服务器都是2008年时,目前不可能关闭此功能。

我们目前有一个案例随微软寻找其他解决方案并工作一轮。目前倾向于使用DFS。

+1

Microsoft为Windows 7和Windows 2008 R2发布了[修补程序](http://support.microsoft.com/kb/2622136),以防止共享中使用的文件被锁定。我不确定此更新是否已集成到任何Service Pack中。 – Frankenstein 2015-01-27 18:26:32

3

不是。如果某个文件被锁定,则该文件被锁定,除非持有该锁的进程释放该文件或该用户的网络共享连接断开连接,否则无法对该文件做太多处理。

您应该切换到ClickOnce部署,而不是从网络共享运行可执行文件。除了描述的更新问题之外,从网络共享运行对代码访问安全性有影响,并且会对应用程序的初始负载产生性能影响。

+1

对文件进行重命名并不总是包含文件的操作,而只是对应的目录。只有打开文件才能进行独占访问时,重命名是不可能的。 – Oleg 2010-07-29 17:39:00

+0

这是正确的。在你的情况下,它似乎也是这种情况。 :-) – 2010-07-29 17:55:15

+1

我们之前在我们的终端服务上尝试过ClickOnce,不幸的是,ClickOnce在终端服务环境中并不是非常可靠。 – jColeson 2010-08-17 16:14:18

1

一般来说,在Windows 2008终端服务器上重新命名锁定文件与从第一个Windows NT 3.1开始的Windows NT的所有先前版本完全相同。

也许你有用于文件重命名的程序有问题。您可以直接在资源管理器中直接在旧操作系统中执行此操作但可以重命名文件CMD.EXE。刚开始cmd.exe并尝试rename命令。

+0

我们在TFS构建定义中使用Exec命令来执行重命名命令。我的理解是,Exec命令将我们的命令直接传递给cmd.exe。 – jColeson 2010-07-29 17:48:42

+0

我不知道你使用哪个Exec命令或Exec.exe程序。只需启动“cmd.exe”并输入“rename”\\ Server \ share \ Dir \ my.exe“Old.exe”即可。你可以通过网络来做到这一点。 – Oleg 2010-07-29 18:30:47

+0

我们的团队基础服务器中有一个脚本,可以使我们的构建自动化。执行任务是其中的一部分。不幸的是,手动启动cmd.exe和调用重命名也不起作用。 我同意大部分意见,它*应该*工作,但事实并非如此。也许我应该打电话给微软支持。 – jColeson 2010-07-29 20:07:58