Access to file using Java with Samba JCIFS
Asked Answered
B

3

27

I have a question about accessing file with Samba JCIFS.

So there is a server I want to access, let's call it server.unv.edu and the workgroup is WKGRP.

There is a share in this server: \\server.unv.edu\pcb$

the way I am trying to access to the server is:

public class SMBAuthenticator extends NtlmAuthenticator {

private String username = "username";
private String password = "password";
private String domain = "smb://server.unv.edu/WKGRP/";

public SMBAuthenticator() {
    NtlmAuthenticator.setDefault(this);
}

and

public class SMBConnection {

public String urlString = "smb://server.unv.edu/pcb$/path/file.txt";
NtlmPasswordAuthentication auth;
SmbFile smbFile;

public SMBConnection() throws MalformedURLException{;
    //url = new URL(urlString);
    SMBAuthenticator authenticator = new SMBAuthenticator();
    auth = authenticator.getNtlmPasswordAuthentication();   
    smbFile = new SmbFile(urlString, auth);
}

public InputStream getSMBInputStream() throws IOException{
    return this.smbFile.getInputStream();
}

public InputStream getInputStream() throws IOException{
    InputStream is = this.getSMBInputStream();
    return is;
}
}

But this doesn't work. I got an error of:

jcifs.smb.SmbAuthException: Logon failure: unknown user name or bad password.
at jcifs.smb.SmbTransport.checkStatus(SmbTransport.java:544)
at jcifs.smb.SmbTransport.send(SmbTransport.java:661)
at jcifs.smb.SmbSession.sessionSetup(SmbSession.java:390)
at jcifs.smb.SmbSession.send(SmbSession.java:218)
at jcifs.smb.SmbTree.treeConnect(SmbTree.java:176)
at jcifs.smb.SmbFile.doConnect(SmbFile.java:929)
at jcifs.smb.SmbFile.connect(SmbFile.java:954)
at jcifs.smb.SmbFile.connect0(SmbFile.java:880)
at jcifs.smb.SmbFile.open0(SmbFile.java:972)
at jcifs.smb.SmbFile.open(SmbFile.java:1006)
at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:73)
at jcifs.smb.SmbFileInputStream.<init>(SmbFileInputStream.java:65)
at jcifs.smb.SmbFile.getInputStream(SmbFile.java:2844)
at edu.umd.lib.sambaConnection.SMBConnection.getSMBInputStream(SMBConnection.java:33)
at edu.umd.lib.sambaConnection.SMBConnection.getInputStream(SMBConnection.java:37)
at edu.umd.lib.sambaConnection.SambaConnectionTest.test(SambaConnectionTest.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Can anyone give me a suggestion or a correctness of my code, to help me access to the file?

Bentwood answered 14/10, 2011 at 18:22 Comment(1)
I would first test the code against a local file (or a share you just created) and then try with the remote server. This, so that you can make sure your code is OK, and is not something else (like permissions).Yarber
P
54

You are making this harder than it should be. Please follow the below steps and make sure the shared folder you are creating has write access for this user you are using.

  1. download the jar file http://jcifs.samba.org/ (there is only one jar file)
  2. copy and paste the below code with your information for user name, password and shared folder and that's all you need

I was running this on Linux and wanted to write to a Windows box so you want to create a shared folder and put the shared folder name in the below variable if you don't know how to create shared folder on windows ...use google as always

    String user = "your_user_name";
    String pass ="your_pass_word";

    String sharedFolder="shared";
    String path="smb://ip_address/"+sharedFolder+"/test.txt";
    NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("",user, pass);
    SmbFile smbFile = new SmbFile(path,auth);
    SmbFileOutputStream smbfos = new SmbFileOutputStream(smbFile);
    smbfos.write("testing....and writing to a file".getBytes());
    System.out.println("completed ...nice !");
Patsis answered 19/10, 2012 at 19:59 Comment(4)
Is there a way to cehck whether the authentication was successful or noy ? I tried with auth.equals(true), but it doesnt seem to return anything eventhough the authentication was success.Handily
I have a router with a usb connection. I connected a hard drive to it. Mac OS directly can access it. I want to access it with Java, but I do not know the username and password. How can I find it out? The folder for example is here: smb://air5750nas/KORAY/Diziler But what is the username password OSX is using?Cru
Where can I get the user and pass in Samba server?Landman
The domain on line NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("domain",user, pass); is the network domain on which you login, e.g your company name abc.xyz.company etc. I was getting "The network name cannot be found." exception if domain name was empty.Hamate
A
1

Since the accepted answer, NtlmPasswordAuthentication has been deprecated. Therefore, this is how I solved, for example, copying a file to a samba share:

String user="your_samba_username";
String pass="your_samba_password";
String path="smb://samba_ip_address/outputdir/outputfile.txt";
try {
    InputStream  winfis = new FileInputStream(new File("c:/inputdir/inputfile.txt"));
    try {
        SingletonContext baseContext = SingletonContext.getInstance(); 
        Credentials credentials=new NtlmPasswordAuthenticator(null,user,pass); 
        CIFSContext testCtx = baseContext.withCredentials(credentials);
        try {             
            SmbFile smbFile = new SmbFile(path, testCtx);
            SmbFileOutputStream smbfos = new SmbFileOutputStream(smbFile);
            try {
                IOUtils.copy(winfis, smbfos);
            } catch (IOException ex) {
                ex.printStackTrace();
            } finally {    
                try {
                    smbfos.close();
                } catch (IOException ex) {
                     ex.printStackTrace();
                }
            }
        } catch (MalformedURLException ex) {
            ex.printStackTrace();
        }
    } catch (CIFSException ex) {
        ex.printStackTrace();
    } finally {
        try {
            winfis.close();
        } catch (IOException ex) {
             ex.printStackTrace();
        }
    }
} catch (FileNotFoundException ex) {
    ex.printStackTrace();
}

Required libraries (dependencies):

Amniocentesis answered 27/6, 2023 at 6:40 Comment(1)
Thank you. I followed your instruction but I've encountred the issue. Cpould you please take a look #76592472 ? If you need any additional details - I am always ready to share them.Marvismarwin
I
-1
/** You can simply use this util class for read write operations. **/

import java.io.IOException;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.UnknownHostException;
import java.nio.charset.StandardCharsets;

import jcifs.smb.NtlmPasswordAuthentication;
import jcifs.smb.SmbException;
import jcifs.smb.SmbFile;
import jcifs.smb.SmbFileInputStream;
import jcifs.smb.SmbFileOutputStream;

public class NDMUtil {

public static void writeToNDM(String userName, String password, String domain, String sharedPath,
        String textToWrite) throws MalformedURLException, SmbException, UnknownHostException, IOException {
    NtlmPasswordAuthentication authentication = new NtlmPasswordAuthentication(domain, userName, password);
    try (OutputStream out = new SmbFileOutputStream(new SmbFile(sharedPath, authentication))) {
        byte[] bytesToWrite = textToWrite.getBytes();
        if (out != null && bytesToWrite != null && bytesToWrite.length > 0) {
            out.write(bytesToWrite);
        }
    }
    ;
}

public static String readFromNDM(String userName, String password, String domain, String sharedPath)
        throws MalformedURLException, SmbException, IOException {
    NtlmPasswordAuthentication authentication = new NtlmPasswordAuthentication(domain, userName, password);
    String fileContent = IOUtil.toString(new SmbFileInputStream(new SmbFile(sharedPath, authentication)),
            StandardCharsets.UTF_8.name());
    System.out.println(fileContent);
    return fileContent;
}

}

Interoceptor answered 16/8, 2019 at 15:37 Comment(1)
Package com.wellsfargo... Really? Does Wells Fargo agree with you copy/pasting this on a public space?Crabbe

© 2022 - 2024 — McMap. All rights reserved.