【问题标题】:Java SMB file share without SMB 1.0/CIFS compatibility enabled未启用 SMB 1.0/CIFS 兼容性的 Java SMB 文件共享
【发布时间】:2017-11-21 22:12:37
【问题描述】:

我必须为 Windows Server 2012 更新使用 JCIFS 的旧文件共享软件。出于安全目的,我们必须禁用 SMB 1.0/CIFS 兼容性。有谁知道可以在 Java 中使用的 JCIFS 的解决方法或修复方法或替代方法?

【问题讨论】:

    标签: java smb jcifs


    【解决方案1】:

    我刚刚发布了一个类似问题的答案:

    Accessing SMB2.1 or SMB3 share from java?

    <...> 我刚刚在 Android 上使用了 hierynomus/smbj v0.2.0 并添加了 SMB2 支持。 <...> 需要 Bouncycastle/Spongycastle <...>

    上传文件

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

    【讨论】:

    • 感谢您的回答,我是SMBJ的维护者。
    【解决方案2】:

    Visuality Systems 正在用 Java 开发一个商业 smb 堆栈,并向后支持 SMB1。测试版将很快推出。 VS 还通过 JNI 在其现有的 NQE 堆栈上提供完整的 SMB。

    【讨论】:

    • 感谢您的信息。我给他们看看。
    猜你喜欢
    • 2020-02-26
    • 2015-03-15
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 2016-05-09
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多