Записать / загрузить файл, используя проблему Samba/JCIFS (SmbAuthException: доступ запрещен)

Поэтому я пытаюсь записать файл с устройства Android в общую папку Windows. Я использую последнюю версию JCIFS, и код, который отображает доступные сетевые ресурсы, работает нормально. Поэтому я предполагаю, что с JCIFS и моей локальной сетью, WiFi и т. Д. Все в порядке. Вот код для загрузки файла (на самом деле я просто хочу написать текст Sring to a File):

    public boolean save2Samba(String text, String fileName) {
        try {

            // My Windows shares doesn't require any login/password
            // String name="login";//my windows username
            // String password="password1";//my windows password

            // sSambaFolder contains a path like MYPC/E/SharedFolderName/
            String url = "smb://" + sSambaFolder.toLowerCase()+fileName;

            SmbFile file = null;
            try {
                // assume ANONYMOUS is my case but there is no description of this in JCIFS API
                NtlmPasswordAuthentication auth = NtlmPasswordAuthentication.ANONYMOUS;
                file = new SmbFile(url, auth);
                android.util.Log.i("TestApp",url);
                // output is like smb://mypc/e/sharedfoldername/file.txt;
                SmbFileOutputStream out = new SmbFileOutputStream(file);
                out.write(text.getBytes());
                out.flush();
                out.close();

            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }

            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

Так как URL зарегистрирован, я уверен, что это правильно (также я проверил URL, используя код, который я упомянул выше, и он просматривает содержимое папки).
Но проблема в том, что я всегда получаю одно и то же:

W/System.err(3214): jcifs.smb.SmbAuthException: Access is denied.

Акции не защищены паролем, поэтому мне не нужно имя пользователя / пароль, чтобы получить доступ. Я мог читать / писать / удалять файлы из другого WinPC, и авторизация не требуется. Также я пытался создать пароль для пользователя на WinPC с общими ресурсами, но результат был тот же. Поэтому я безуспешно попробовал несколько версий NtlmPasswordAuthentication:

NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("");
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(":");
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("Administrator:"); //actual username on WinPC with shares
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("Administrator");
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null,"Administrator","");
NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null,"","");

Так что я делаю не так и как достичь своей цели, когда не требуется авторизация для получения доступа к общей папке?
Кстати, мой телевизор Samsung на базе Linux, использующий клиент samba, без проблем получает доступ к той же общей папке и воспроизводит оттуда MP3 (ну, да, он только для чтения). Так как мое устройство AOS получает доступ к моей локальной сети через WiFi (вместо телевизора, подключенного через Ethernet), я также проверил доступ к общей папке с помощью ноутбука +WiFi и не обнаружил проблем.
Добавлено:
Я пытаюсь сейчас выполнить следующие строки:

file = new SmbFile(url, auth);
android.util.Log.i("save2Samba", "file.exists(): " + file.exists());

и получить тот же доступ запрещен. Я даже не пытаюсь записать файл...

2 ответа

Решение

О, МОЙ БОГ!!! Решение было так просто!!! Чтобы получить доступ к сети, которая не защищена логином / паролем и, следовательно, не требует какой-либо авторизации, это не NtlmPasswordAuthentication.ANONYMOUS, НО это:

NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null, null, null);

блин это не было так очевидно!

Попробуй с этим кодом

 NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("",
                            username, password);
    sharepath = "smb://" + pathtosharefolder + test.txt;  


 sFile = new SmbFile(sharepath, auth);
    SmbFileOutputStream out = new SmbFileOutputStream(file, true);
    out.write(text.getBytes());

Также проверьте, есть ли у вас общий путь к папке, к которой вы обращаетесь. Также проверьте это дало разрешение на запись в папку

Другие вопросы по тегам