首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在apache中使用JCIFS访问SMB?

如何在apache中使用JCIFS访问SMB?
EN

Stack Overflow用户
提问于 2012-07-23 12:37:02
回答 2查看 5.8K关注 0票数 6

我试图使用smb URL访问本地计算机上的文件夹。我的项目是使用jars: commons-vfs2-2.0.jar和jcifs-1.3.17.jar (以及所有其他必需的jars)。完整的代码是:

代码语言:javascript
复制
public static void main(String[] args) throws FileSystemException {
    jcifs.Config.registerSmbURLHandler();
    StaticUserAuthenticator auth = new StaticUserAuthenticator(<domain>,<user>,<password>);
    FileSystemOptions opts = new FileSystemOptions(); 
    DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts, auth);
    FileSystemManager fs = VFS.getManager();
    FileObject smbFile = fs.resolveFile("smb://10.0.2.2/TimeOut/");
    System.out.println(smbFile.exists() + " " + smbFile.getContent().getLastModifiedTime());
}

我收到了例外情况:

线程"main“中的异常,org.apache.commons.vfs2.FileSystemException:无法确定文件"smb://10.0.2.2/TimeOut”的类型。在org.apache.commons.vfs2.provider.AbstractFileObject.getType(AbstractFileObject.java:505) at org.apache.commons.vfs2.provider.AbstractFileObject.exists(AbstractFileObject.java:477) at com.newsway.tests.VfsTest.main(VfsTest.java:23)引起的: jcifs.smb.SmbAuthException:登录失败:帐户当前已禁用。在jcifs.smb.SmbTransport.checkStatus(SmbTransport.java:546) at jcifs.smb.SmbTransport.send(SmbTransport.java:663) at jcifs.smb.SmbSession.sessionSetup(SmbSession.java:390) at jcifs.smb.SmbSession.send(SmbSession.java:218) at jcifs.smb.SmbTree.treeConnect(SmbTree.java:176) at jcifs.smb.SmbFile.doConnect(SmbFile.java:911) at jcifs.smb.SmbFile.connect(SmbFile.java:( jcifs.smb.SmbFileInputStream.(SmbFileInputStream.java:73) at jcifs.smb.SmbFileInputStream.(SmbFileInputStream.java:65) at jcifs.smb.SmbFile.getInputStream(SmbFile.java:2844) at org.apache.commons.vfs2.provider.url.UrlFileObject ) jcifs.smb.SmbFile.connect0(SmbFile.java:880) at jcifs.smb.SmbFile.open0(SmbFile.java:972) at jcifs.smb.SmbFile.open(SmbFile.java:1006)org.apache.commons.vfs2.provider.AbstractFileObject.getType(AbstractFileObject.java:496) .doGetType(UrlFileObject.java:89)

从中我了解到相关的部分是:登录失败:帐户当前已禁用。

尽管我的用户/密码/域很好,而且我正在执行VFS文档页面中定义的内容,但这仍然是事实。

我遗漏了什么?

EN

回答 2

Stack Overflow用户

发布于 2015-01-05 13:46:40

我想我知道你的问题是什么,沙箱提供商不会在2.0中自动注册。此外,您还需要在解析调用中实际使用配置的身份验证属性(请参阅下面修改的源代码)。

我通常不使用默认的文件系统管理器,而是动态注册我的提供程序,但是如果要使用自动检测,则需要将vfs-providers.xml添加到沙箱JAR中。

这就是如何使用2.0构建一个完整的工作JAR:

代码语言:javascript
复制
> git clone https://github.com/apache/commons-vfs.git -b commons-vfs2-project-2.0 vfs2.0
> cd vfs2.0
> notepad sandbox\pom.xml
> notepad sandbox\src\test\java\org\apache\commons\vfs2\provider\smb\test\StandaloneMain.java
> mvn -Pinclude-sandbox -DskipTests=true clean package dependency:tree

在编辑sandbox/put.xml时,需要确保从和标记中删除-SANDBOX。然后,您需要添加:

代码语言:javascript
复制
  <resource>
    <directory>src/main/resources</directory>
  </resource>

到已经存在的标记(在第一个LICENSE+NOTICE包含第88行之后)

这是使用的测试代码:

代码语言:javascript
复制
package org.apache.commons.vfs2.provider.smb.test;

import org.apache.commons.vfs2.FileObject;
import org.apache.commons.vfs2.FileSystemException;
import org.apache.commons.vfs2.FileSystemManager;
import org.apache.commons.vfs2.FileSystemOptions;
import org.apache.commons.vfs2.VFS;
import org.apache.commons.vfs2.auth.StaticUserAuthenticator;
import org.apache.commons.vfs2.impl.DefaultFileSystemConfigBuilder;


public class StandaloneMain
{
    public static void main(String[] args) throws FileSystemException {
        //jcifs.Config.registerSmbURLHandler();
        StaticUserAuthenticator auth = 
              new StaticUserAuthenticator("DOMAIN", "user", "SECRET");
        FileSystemOptions opts = new FileSystemOptions();
        DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts, auth);
        FileSystemManager fs = VFS.getManager();
        if (!fs.hasProvider("smb")) throw new RuntimeException("Provider missing");
        System.out.println("Connecting " + args[0] + " with " + opts);
        FileObject smbFile = fs.resolveFile(args[0], opts); // added opts!
        System.out.println(smbFile.exists() + " " + smbFile.getContent().getLastModifiedTime());
    }
}

这就是行刑:

代码语言:javascript
复制
> set REP=C:\Users\USERNAME\.m2\repository
> java -cp sandbox\target\commons-vfs2-sandbox-2.0.jar;^
           core\target\commons-vfs2-2.0.jar;^
           %REP%\commons-logging\commons-logging\1.1.1\commons-logging-1.1.1.jar;^
           %REP%\jcifs\jcifs\0.8.3\jcifs-0.8.3.jar;^
           sandbox\target\test-classes
       org.apache.commons.vfs2.provider.smb.test.StandaloneMain smb://HOST/Users
Jan 05, 2015 2:40:19 PM org.apache.commons.vfs2.VfsLog info
INFORMATION: Using "C:\Users\USERNAME\AppData\Local\Temp\vfs_cache" as temporary files store.
Connecting smb://eckenfels02/Users with org.apache.commons.vfs2.FileSystemOptions@27dd2ec5
true 0
票数 3
EN

Stack Overflow用户

发布于 2013-02-26 06:51:50

我使用了不同的身份验证方法,而且效果很好,您可以尝试一下。

代码语言:javascript
复制
String url = "smb://10.0.2.2/TimeOut/";   
NtlmPasswordAuthentication authen = new NtlmPasswordAuthentication(<domain>,<username>,<password>); 
SmbFile smbFile = new SmbFile(url,authen);
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11612690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档