• Stars
    star
    708
  • Rank 63,953 (Top 2 %)
  • Language
    Java
  • License
    Other
  • Created almost 9 years ago
  • Updated 5 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Server Message Block (SMB2, SMB3) implementation in Java

smbj - SMB2/SMB3 client library for Java

To get started, have a look at one of the examples. Hopefully you will find the API pleasant to work with :)

Build SMBJ Codacy Grade codecov JavaDocs Maven Central

Getting SMBJ

To get SMBJ, you have two options:

  1. Add a dependency to SMBJ to your project.

  2. Build SMBJ yourself.

And, if you want, you can also run the SMBJ examples.

Binary releases of SMBJ are not provided here, but you can download it straight from the Maven Central repository if you want to.

Examples

A - Listing Files on a Share/Folder

    SMBClient client = new SMBClient();

    try (Connection connection = client.connect("SERVERNAME")) {
        AuthenticationContext ac = new AuthenticationContext("USERNAME", "PASSWORD".toCharArray(), "DOMAIN");
        Session session = connection.authenticate(ac);

        // Connect to Share
        try (DiskShare share = (DiskShare) session.connectShare("SHARENAME")) {
            for (FileIdBothDirectoryInformation f : share.list("FOLDER", "*.TXT")) {
                System.out.println("File : " + f.getFileName());
            }
        }
    }

B - Deleting a file

    SMBClient client = new SMBClient(config);

    try (Connection connection = client.connect("SERVERNAME")) {
        AuthenticationContext ac = new AuthenticationContext("USERNAME", "PASSWORD".toCharArray(), "DOMAIN");
        Session session = connection.authenticate(ac);

        // Connect to Share
        try (DiskShare share = (DiskShare) session.connectShare("SHARENAME")) {
            share.rm("FILE");
        }
    }

C - Adjusting Timeout and Socket Timeout

    SmbConfig config = SmbConfig.builder()
            .withTimeout(120, TimeUnit.SECONDS) // Timeout sets Read, Write, and Transact timeouts (default is 60 seconds)
            .withSoTimeout(180, TimeUnit.SECONDS) // Socket Timeout (default is 0 seconds, blocks forever)
            .build();

    SMBClient client = new SMBClient(config);

    try (Connection connection = client.connect("SERVERNAME")) {
        AuthenticationContext ac = new AuthenticationContext("USERNAME", "PASSWORD".toCharArray(), "DOMAIN");
        Session session = connection.authenticate(ac);

        // Connect to Share
        try (DiskShare share = (DiskShare) session.connectShare("SHARENAME")) {
            ...
        }
    }

Frequently Asked Questions

When I run my code I get an SMBApiException with the message STATUS_โ€ฆโ€‹ (0xโ€ฆโ€‹). What am I doing wrong?

SMBJ is a low-level SMB client implementation. Most file/directory operations result in a request being sent to the SMB server. If the server responds to these requests with an error SMBJ will pass this error back to the calling code via an exception. The STATUS_โ€ฆโ€‹ value is the error code the server sent back to the client.

It is considered out of scope for the SMBJ project to document each and every possible error condition that may occur when using the SMB protocol. Detailed information on these errors can be found in the SMB specification and the error code table. Some common errors are described below.

When I try to open a file or directory my code fails with STATUS_ACCESS_DENIED. How can I fix this?

This error means that the file access youโ€™ve requested (the set of AccessMask values) is not being allowed by the server for the user account you used to log in to the server. Why this happens exactly depends on the precise set of AccessMask values you specified and the access control list that has been set on the file or directory in question.

To resolve this, reduce the set of AccessMask values down to just the access that you need. For instance, if you only want to read the contents of the file use FILE_READ_DATA instead of something more broad like GENERIC_READ or GENERIC_ALL.

The special MAXIMUM_ALLOWED value can be used to ask the server to grant the full set of permissions that are allowed by the access control list. You can then query the FileAccessInformation information class to determine which set of permissions was granted by the server.

For more details please refer to the documentation on creating and opening files on MSDN.

When I try to open a file or directory my code fails with STATUS_SHARING_VIOLATION. What does this mean?

A sharing violation error means that some other process has already opened the file or directory in question in a way that is incompatible with how youโ€™re trying to open it. This could be your own program, a different program running on your machine, a program running on a different client machine or even a process on the SMB server itself like an indexing or virus scanning service.

The SMB protocol does allow multiple clients to open the same file at the same time, but they need to cooperate when doing so. This is controlled by the set of SMB2ShareAccess values that are passed to the open file calls. When this set is empty, the SMB client requests exclusive access to the file. Passing one or more values indicates that other clients may open the file for the specified operations as well. For instance, if you open the file with only FILE_SHARE_READ and successfully open the file, then other clients may open the file for reading as well. If another client tries to open the file for writing, it will fail at that point with STATUS_SHARING_VIOLATION as long as you have the file open.

For more details please refer to the documentation on creating and opening files on MSDN.

Depending on SMBJ

If youโ€™re building your project using Maven, you can add the following dependency to the pom.xml:

<dependency>
  <groupId>com.hierynomus</groupId>
  <artifactId>smbj</artifactId>
  <version>0.11.5</version>
</dependency>

If your project is built using another build tool that uses the Maven Central repository, translate this dependency into the format used by your build tool.

Building SMBJ

  1. Clone the SMBJ repository.

  2. Ensure you have Java7 installed with the Unlimited strength Java Cryptography Extensions (JCE).

  3. Run the command ./gradlew clean build.

Changelog

0.12.0 (2023-??-??)

  • Ensure we call flip() on Buffer to avoid Java8/9 compatibility issues (Fixes #705)

  • Do not send SNB2EncryptionCapabilities if the withEncryptData is set to false (Fixes #747)

  • Added Implementation-Version and Implementation-Name to MANIFEST.MF (Fixes #743)

  • Upgraded Gradle to 8.0.2

  • Bytes written by the SMB2Writer are now returned as long, correctly reporting on files >2GB (Fixes #740)

  • Reduce the amount of locking in Connection and DirectTcpTransport

  • Fixed Cannot resolve path exception in DFS by specifying the correct TargetHint (Fixes #419)

  • Fixed ClassCastException in TargetInfo (Fixes #712)

More Repositories

1

sshj

ssh, scp and sftp for java
Java
2,479
star
2

license-gradle-plugin

Manage your license(s)
Groovy
407
star
3

asn-one

A Standalone ASN.1 Encoding/Decoding Library in Java
Java
28
star
4

assumeng

TestNG Assumptions
Java
12
star
5

scannit

A Java Metadata Scanner
Java
11
star
6

jython-gradle-plugin

Allows to download Jython/Python modules from pypi
Groovy
10
star
7

scalariform-gradle-plugin

Gradle plugin to run Scalariform over your code
Groovy
7
star
8

google-code-jam

Solutions for the Google Code Jam
Scala
3
star
9

appengine-gradle-plugin

Gradle plugin to develop Google AppEngine applications
Java
2
star
10

kitchen

Cooking with Spring Integration
Java
2
star
11

dotmac

My Dotfiles setup...
Shell
2
star
12

xke-enigma

Enigma machine for TDD session by @iwein and Jamie Dobson
Scala
2
star
13

labrat

The XebiaLabs hubot
CoffeeScript
1
star
14

drent-domo

Domotica on a beaglebone black
C++
1
star
15

gradle-remotecopy-plugin

Copying files/directories to remote hosts
1
star
16

syringe

A very small Dependency Injector
Java
1
star
17

hierynomus.github.com

1
star
18

codefoodbar-skeleton

code(food, bar) skeleton
1
star
19

xke-codeoff

Repository for the 2015-03-31 XKE CodeOff challenge
Python
1
star
20

vscode-sopsifier

VSCode SOPS plugin
TypeScript
1
star
21

Hadoop-Summer-Class

Companion code to the Xebia Hadoop Summer Class
Java
1
star
22

presentations

CSS
1
star
23

koetsier

Koetsiersbewijs examen
Scala
1
star
24

sandbox

Sandbox for some small try-out projects
Scala
1
star
25

smb-client

Groovy
1
star
26

timing

Monitoring your Java app
Java
1
star
27

code-challenges

Fun Coding solutions
Go
1
star
28

setup4j

An interactive product configuration framework
Java
1
star
29

t2-bus

Java
1
star