当前位置: 首页 > 知识库问答 >
问题:

从Java访问SMB2.1或SMB3共享?

沈飞翼
2023-03-14

由于Windows 2012R2不再支持SMB 1协议,没有一些注册表黑客攻击,有没有人在只支持SMB 2.1或SMB 3的Java中成功使用SMB共享?

JCIFS库显然只是SMB 1,所以它已经过时了。我看到微软有一个针对Azure的Java库,但这似乎是在利用服务,而不是SMB。

共有3个答案

寿卜鹰
2023-03-14

Visual Systems目前正在开发JNQ,它是基于Java的SMB,最多支持3.1.1。由于该需求包含对Java1.4的向后支持,因此开发进展缓慢。SMB客户端将在明年夏天推出,服务器将稍后推出。

闻人业
2023-03-14

扩展@Breakidi answer,我刚刚使用了hierynomus/smbjv0。Android上的2.0,并添加了SMB2支持。它声称同时支持SMB2和SMB3,尽管类只引用SMB2版本,但不确定,可能与此无关。

我已经在一个案例中对运行SMB2 open的box进行了测试,然后在另一个案例中同时运行SMB2和SMB3 open。但我无法单独禁用SMB2和测试SMB3。

在我的例子中,需要使用Spongycastle(很可能是因为Android),因为类路径中缺少所需的MD4依赖项。我在连接SMB的类中使用了它:

import org.spongycastle.jce.provider.BouncyCastleProvider;
import java.security.Security;
<...>
static {
    Security.addProvider(new BouncyCastleProvider());
}

DiskShare上调用openFile时,确保设置了正确的标志(通过查看源代码):

// required imports
import com.hierynomus.msdtyp.AccessMask;
import com.hierynomus.msfscc.FileAttributes;
import com.hierynomus.mssmb2.SMB2CreateDisposition;
import com.hierynomus.mssmb2.SMB2CreateOptions;
import com.hierynomus.mssmb2.SMB2ShareAccess;
import com.hierynomus.smbj.SMBClient;
import com.hierynomus.smbj.SmbConfig;
import com.hierynomus.smbj.auth.AuthenticationContext;
import com.hierynomus.smbj.common.SMBApiException;
import com.hierynomus.smbj.connection.Connection;
import com.hierynomus.smbj.session.Session;
import com.hierynomus.smbj.share.DiskShare;
import com.hierynomus.smbj.share.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.HashSet;
...
// connection params
String sambaDomain = null; // can be null
String sambaUsername = "iamuploader";
String sambaPass = "mysecret";
String sambaIP = "192.168.1.236";
String sambaSharedPath = "sharedfolder";

...
// upload method
// usage: upload("file/whithin/folder.txt", fileBytes);
public void upload(String filename, byte[] bytes) throws IOException {

    SmbConfig cfg = SmbConfig.builder().build();
    SMBClient client = new SMBClient(cfg);
    Connection connection = client.connect(sambaIP);
    Session session = connection.authenticate(new AuthenticationContext(sambaUsername, sambaPass.toCharArray(), sambaDomain));
    DiskShare share = (DiskShare) session.connectShare(sambaSharedPath);

    // this is com.hierynomus.smbj.share.File !
    File f = null;
    int idx = filename.lastIndexOf("/");

    // if file is in folder(s), create them first
    if(idx > -1) {
        String folder = filename.substring(0, idx);
        try {
            if(!share.folderExists(folder)) share.mkdir(folder);
        } catch (SMBApiException ex) {
            throw new IOException(ex);
        }

    }

    // I am creating file with flag FILE_CREATE, which will throw if file exists already
    if(!share.fileExists(filename)){
        f = share.openFile(filename,
                new HashSet<>(Arrays.asList(AccessMask.GENERIC_ALL)),
                new HashSet<>(Arrays.asList(FileAttributes.FILE_ATTRIBUTE_NORMAL)),
                SMB2ShareAccess.ALL,
                SMB2CreateDisposition.FILE_CREATE,
                new HashSet<>(Arrays.asList(SMB2CreateOptions.FILE_DIRECTORY_FILE))
        );
    }

    if(f == null) return null;

    OutputStream os = f.getOutputStream();
    os.write(bytes);
    os.close();
}
曹涵润
2023-03-14

我找到了这个可以与SMB2和SMB3一起工作的包,名为smbj看看这个:https://github.com/hierynomus/smbj

 类似资料:
  • 我正在尝试从Java切换到Kotlin。但我有很多遗留代码和第三方库。我看到,Java类中经常存在没有getter和setter的公共字段,这些字段必须从其他类访问。如果没有Kotlin代码中的getter,我如何访问Java类的公共字段?

  • 问题内容: 我需要一个允许我使用Java在Gmail中进行电子邮件操作(例如,发送/接收邮件)的库。 问题答案: 您是否看到过Java的g4j-GMail API? GMailer Java版API(g4j)是一组API,允许Java程序员与GMail进行通信。借助G4J,程序员可以制作基于GMail大量存储的基于Java的应用程序。

  • 问题内容: 您如何从Java 访问? 最后一行使编译器死于“ scala类型。None不带参数”。 由于“找不到符号构造函数None()”而失败: 由于“找不到符号变量无”而失败: 在2007年,这曾经奏效,但后来Scala改变了。Java编译器提供: 问题答案: 这可能起作用: def apply [A](x:A):Option [A] 一个Option工厂,如果参数不为null,则创建Some

  • 目前正在尝试从JAVA访问类型库文件,我尝试了以下操作并出现了相应的错误: 1- Com2Java:每次尝试连接到我的应用程序时,我都会收到此错误: 默认情况下,在客户端版本的Windows上不启用小型转储 2- Com4j:它只产生接口,无法理解如何使用它们(我找不到任何类,只有接口) 3-经过小搜索,发现了Visual J,但无法下载它,因为它被剥夺了。 任何人都可以提供建议吗? 非常感谢。

  • 问题内容: 我正在尝试编写一个Java应用程序,该应用程序将访问其他 共享 邮箱以阅读电子邮件并执行其他活动。我阅读自己的INBOX(或其文件夹和内容)没有问题,但是很难找到有关如何访问(并最终解析/读取)共享邮箱的信息。 问题答案: 在其他答案的帮助下,我找到了以下解决方案,该解决方案适用于com.sun.mail:javax.mail:1.6.2 使用javax.mail:mail:1.4.7

  • 问题内容: 我正在制作一个打算在PC上本地运行的html页面,最好不要在本地服务器上运行(file://)。我还使用jQuery使操作/ AJAX更加容易。 我正在尝试从twitter API加载2个结果,但出现错误。代码如下: 我也尝试了以下代码,但没有改变结果。 我在chrome中(在本地服务器上)收到以下错误: 或(带有file://链接) 有谁知道我该如何解决? 问题答案: 您遇到了同源策