java - SmbException 无法使用 Java 中的正确凭据连接主机名/IP 地址抛出异常

标签 java maven authentication smb jcifs

我需要使用正确的用户凭据(用户名、密码、域)连接到共享文件夹。 然后,当我有权访问该文件夹时,我需要列出其中的子文件夹和文件。

我正在尝试使用 jcifs.smb.SmbFile 类和 jcifs.smb.NtlmPasswordAuthentication 进行身份验证。

我的代码如下:

NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("domainName", "userName", "password");
SmbFile smbFile = new SmbFile("smb://servername/someFolder", auth);
for (String fileName : smbFile.list()) {
   System.out.println(fileName);
}

我可以使用这些凭据连接到服务器,但收到此错误:

Exception in thread "main" jcifs.smb.SmbException: Failed to connect: servername/IP_ADDR
jcifs.util.transport.TransportException
java.net.SocketException: Connection reset
    at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:323)
    at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
    at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
    at java.base/java.net.Socket$SocketInputStream.read(Socket.java:981)
...

有人知道为什么我无法连接吗?

SmbFile - https://www.jcifs.org/src/docs/api/jcifs/smb/SmbFile.html

NtlmPasswordAuthentication - https://javadoc.io/static/eu.agno3.jcifs/jcifs-ng/2.1.3/jcifs/smb/NtlmPasswordAuthentication.html

最佳答案

我找到了解决方案!

由于我的操作系统 (Windows 10),我需要使用 SMB2 而不是 SMB1(这是默认设置)。

解决方案:

  1. 以管理员身份打开 powershell
  2. 您需要设置一个属性:Set -SmbServerConfiguration -EnableSMB2Protocol $true 可选:我认为没有必要,但我关闭了 SMB1 协议(protocol)

设置 -SmbServerConfiguration -EnableSMB1Protocol $false 命令。

然后您可以使用:Get -SmbServerConfiguration 命令检查属性,并确保所有属性都具有正确的值。

  • 将正确的依赖项导入到 pom.xml:
  • <dependency>
        <groupId>eu.agno3.jcifs</groupId>
        <artifactId>jcifs-ng</artifactId>
        <version>2.1.6</version>
    </dependency>
    

    https://github.com/AgNO3/jcifs-ng

  • 最后是代码:
  • public static void sendRequest() throws Exception {
            CIFSContext base = SingletonContext.getInstance();
            CIFSContext authed1 = base.withCredentials(new NtlmPasswordAuthentication(base, "domainName",
                    "userName", "password"));
            try (SmbFile f = new SmbFile("smb:\\serverName\folder", authed1)) {
                if (f.exists()) {
                    for (SmbFile file : f.listFiles()) {
                        System.out.println(file.getName());
                    }
                }
            }
        }
    

    关于java - SmbException 无法使用 Java 中的正确凭据连接主机名/IP 地址抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68529198/

    相关文章:

    JavaFX 应用程序 - 架构问题 - 继承类的不同列表

    java - 我无法连接 Heroku 上的数据库

    java - 如何在通常的 Maven clean 阶段之外删除项目文件夹

    android - maven部署到nexus

    security - 如何获取 Asp.Net Core 加密 key 的访问权限?

    java - 具有 JPA 实体的 RESTful 客户端

    maven - Nuget 版本和发布管理,如 maven 发布插件

    javascript - Azure 事件中心 : How to grant SAS tokens to Javascript publishers (running in browser)?

    ios - AWS Cognito Swift SDK 如何检查用户是否已确认?

    java - hibernate 异常 "PropertyValueException: not-null property references a > null or transient value"。我被困住了,不知道该怎么办