6

smb URL を使用して、ローカル コンピューター上のフォルダーにアクセスしようとしています。私のプロジェクトは jar を使用しています: commons-vfs2-2.0.jar と jcifs-1.3.17.jar (および他のすべての必要な jar)。コード全体は次のとおりです。

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) で org.apache.commons.vfs2.provider.AbstractFileObject.exists(AbstractFileObject.java:477) で com.newsway.tests.VfsTest .main(VfsTest.java:23) 原因: jcifs.smb.SmbAuthException: ログオン失敗: アカウントは現在無効になっています。jcifs.smb.SmbTransport.checkStatus(SmbTransport.java:546) で jcifs.smb.SmbTransport.send(SmbTransport.java:663) で jcifs.smb.SmbSession.sessionSetup(SmbSession.java:390) で jcifs.smb で。 SmbSession.send(SmbSession.java:218) で jcifs.smb.SmbTree.treeConnect(SmbTree.java:176) で jcifs.smb.SmbFile.doConnect(SmbFile.java:911) で jcifs.

関連する部分は次のとおりであることがわかりました。ログオン失敗:アカウントは現在無効になっています。

これは、ユーザー/パスワード/ドメインに問題がなく、VFS ドキュメント ページで定義されていることを正確に実行しているにもかかわらずです。

私は何が欠けていますか?

4

2 に答える 2

3

私はあなたの問題が何であるかを知っていると思います.サンドボックスプロバイダーは2.0で自動的に登録されません. また、解決呼び出しで構成された認証プロパティを実際に使用する必要があります (以下の変更されたソースを参照)。

通常、デフォルトのファイルシステム マネージャーは使用せず、プロバイダーを動的に登録しますが、自動検出を使用する場合は、vfs-providers.xml をサンドボックス JAR に追加する必要があります。

これは、2.0 で完全に機能する JAR を構築する方法です。

> 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/pom.xml を編集するときは、必ず <version> および <parent><version> タグから -SANDBOX を削除する必要があります。次に、次を追加する必要があります。

  <resource>
    <directory>src/main/resources</directory>
  </resource>

既存の <resources> タグに (最初の LICENSE+NOTICE インクルード 88 行の直後)

使用したテスト コードは次のとおりです。

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());
    }
}

そして、これは実行です:

> 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
于 2015-01-05T13:46:40.077 に答える
-1

私は別の認証方法を使用していますが、うまくいきます。試してみてください。

String url = "smb://10.0.2.2/TimeOut/";   
NtlmPasswordAuthentication authen = new NtlmPasswordAuthentication(<domain>,<username>,<password>); 
SmbFile smbFile = new SmbFile(url,authen);
于 2013-02-26T06:51:50.243 に答える