我有一个在Tomcat 6.0.26(windows server 2008 r2 sp1)上运行的JSP,它有一个samba(jcifs-1.3.17.jar)连接到远程服务器上的列表文件。
在AD控制器更新到Windows 2012(完全修补)之前,这没有任何问题。
现在,我无法再列出Samba Share上的文件了。
SmbFile sfFile = new SmbFile("smb://myserver.com/share/", "subfolder", new NtlmPasswordAuthentication("MYDOM", session.getAttribute("UserID").toString(), session.getAttribute("UserCode").toString()));
SmbFile[] asfDirectoryList = sfFile.listFiles("webversion" + session.getAttribute("PLCode").toString().substring(0,3) + "*.xls");
第二行返回以下异常:
org.apache.jasper.JasperException: jcifs.smb.SmbException: The network name cannot be found.
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:491)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:407)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
root cause
jcifs.smb.SmbException: The network name cannot be found.
jcifs.smb.SmbTransport.checkStatus(SmbTransport.java:563)
jcifs.smb.SmbTransport.send(SmbTransport.java:663)
jcifs.smb.SmbSession.send(SmbSession.java:238)
jcifs.smb.SmbTree.treeConnect(SmbTree.java:176)
jcifs.smb.SmbFile.doConnect(SmbFile.java:911)
jcifs.smb.SmbFile.connect(SmbFile.java:954)
jcifs.smb.SmbFile.connect0(SmbFile.java:880)
jcifs.smb.SmbFile.resolveDfs(SmbFile.java:669)
jcifs.smb.SmbFile.send(SmbFile.java:773)
jcifs.smb.SmbFile.doFindFirstNext(SmbFile.java:1986)
jcifs.smb.SmbFile.doEnum(SmbFile.java:1738)
jcifs.smb.SmbFile.listFiles(SmbFile.java:1715)
jcifs.smb.SmbFile.listFiles(SmbFile.java:1681)
org.apache.jsp.financials.frFinancialsFileListing_jsp._jspService(frFinancialsFileListing_jsp.java:220)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
有谁知道为什么会发生这种情况以及如何解决这个问题?
[编辑] 谜团:将AD控制器更新到Windows 2012不应该影响访问文件服务器上共享的Web服务器(两者都运行Windows 2008 r2 sp1)。我只是无法理解。
答案 0 :(得分:2)
默认情况下, Windows Server 2012 R2已禁用SMB 1.0 。因此,您需要在Windows Server 2012 R2中再次激活SMB 1.0。
Add Roles and Features Wizard
并检查SMB 1.0/CIFS File Shareing Support
是否已激活:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer
并将DependOnService
的值从SamSS Srv2
更改为 SamSS Srv
您可以通过选中SMB 1.xxx也已激活的选项卡中的系统服务Server (LanmanServer)
的属性来验证是否已激活支持:
来源:http://woshub.com/smb-1-0-support-in-windows-server-2012-r2/#!prettyPhoto
答案 1 :(得分:1)
对于遇到此问题的其他人,以下是发生的事情。
看起来微软发布了一个补丁,结束了SMB2之外的向后兼容性。因此,JCIFS将不再起作用,因为它是SMB1。
在我的情况下,我无需验证对共享的访问权限,从而无需JCIFS。这些文件不包含国家机密,因此允许内部网络上的每个人都有读取权限。因此,现在可以使用java.io中的标准文件对象来访问共享。该对象将文件处理传递给OS(2008 r2 sp1),这意味着根本不需要使用JCIFS库。
答案 2 :(得分:0)
Windows Server 2012包含最新版本的SMB协议3.0,它充满了非常有趣的更新和改进(详情和一些相关讨论here)。与任何重大改进一样,在传统客户支持方面存在折衷。
可能在Samba客户端不支持SMB 3.0,或者在Server 2012端应该启用一些向后兼容性。