java-8smbj

hierynomus smbj write - share file access denied issue


Using smbj to rite file to shared folder and the below code is giving me access denied issue. But i have mounted the same shared folder under "Network Locations" and i can write file to the same folder by manually creating. I am guessing the options i use in to write the file is not correct. Code:

public static void main(String args[]) {
        SMBClient client = new SMBClient();

        try (Connection connection = client.connect("10.48.36.248")) {
            AuthenticationContext ac = new AuthenticationContext("test", "1234".toCharArray(), "");
            Session session = connection.authenticate(ac);

            // Connect to ShareCards
            try (DiskShare share = (DiskShare) session.connectShare("CCS")) {
                Set<FileAttributes> fileAttributes = new HashSet<>();
                fileAttributes.add(FileAttributes.FILE_ATTRIBUTE_NORMAL);
                Set<SMB2CreateOptions> createOptions = new HashSet<>();
                createOptions.add(SMB2CreateOptions.FILE_NON_DIRECTORY_FILE);
                createOptions.add(SMB2CreateOptions.FILE_WRITE_THROUGH);
                File f = share.openFile(                
                        "\\SWD\\Groups\\New Folder\\"
                                + "Test.txt",
                        new HashSet(Arrays.asList(new AccessMask[] { AccessMask.FILE_ADD_FILE })), fileAttributes,
                        SMB2ShareAccess.ALL,
                        SMB2CreateDisposition.FILE_OVERWRITE_IF, createOptions);

                OutputStream oStream = f.getOutputStream();
                oStream.write("I am testing".getBytes());
                oStream.flush();
                oStream.close();
            
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            client.close();
        }

The exception i am getting is

Exception in thread "main" com.hierynomus.mssmb2.SMBApiException: STATUS_ACCESS_DENIED (0xc0000022): Create failed for \\10.48.36.248\CCS\SWD\Groups\New Folder\Test.txt
    

UPDATE: \\10.48.36.248\CCS\SWD after this the "Groups" folder looks like a shortcut to another location, maybe that is the reason I am getting access denied error? How do i write to the shortcut folder?


Solution

  • Implemented using jcifs-ng and it works fine

    Pom

    <dependency>
    <groupId>eu.agno3.jcifs</groupId>
    <artifactId>jcifs-ng</artifactId>
    <version>2.1.7</version>
    </dependency>
    

    Code:

    import jcifs.CIFSContext;
    import jcifs.CIFSException;
    import jcifs.context.SingletonContext;
    import jcifs.smb.NtlmPasswordAuthenticator;
    import jcifs.smb.SmbFile;
    import jcifs.smb.SmbFileOutputStream;
    
    public class JCIFSTest {
        public static void main(String[] args) {
            try {
                
                CIFSContext baseCxt = SingletonContext.getInstance();
                CIFSContext auth = baseCxt.withCredentials(new NtlmPasswordAuthenticator("domain", "username", "password"));
    
                SmbFile f = new SmbFile("smb://10.48.36.248/CCS/SWD/GROUPS/New Folder/test.txt", auth);
                SmbFileOutputStream out = new SmbFileOutputStream(f,true);
                out.write("Just test".getBytes());
                f.close();
                out.close();
            }  catch (CIFSException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }