Запись/загрузка файла с помощью проблемы Samba/JCIFS (SmbAuthException: Доступ запрещен)

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

    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 подключается к моей локальной сети через Wi-Fi (вместо телевизора, который подключен через Ethernet), я также проверил доступ к общей папке с помощью ноутбука + WiFi и не обнаружил проблем.
Добавлено:
Сейчас я пытаюсь выполнить следующие строки:

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

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


person Stan    schedule 28.01.2013    source источник


Ответы (2)


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

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

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

person Stan    schedule 27.02.2013
comment
Вам нужно включить гостевую учетную запись в Windows, прежде чем это сработает. - person Daan Olislagers; 15.10.2013
comment
В моем случае это была WinXP, и вам не нужна активная гостевая учетная запись, чтобы это работало (сейчас проверил это дважды). Что касается Win7, то, наверное, так. Win7 стало очень сложно настроить, если говорить о сети, и это основная причина, по которой мне она не нравится по сравнению с XP. - person Stan; 15.10.2013

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

 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());

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

person rwe    schedule 13.02.2013
comment
??? это скопированные строки моего кода? В чем смысл? Разрешения на запись даны, и общая папка действительно существует, это точно - person Stan; 15.02.2013
comment
очень сожалею о моей ошибке. можешь попробовать с этим кодом и дай мне знать пожалуйста - person rwe; 27.02.2013
comment
в порядке. так что я должен использовать в качестве имени пользователя и пароля в 1-й строке кода? Как я упоминал ранее, аутентификация не требуется, поэтому пользователь и пароль не установлены. - person Stan; 27.02.2013
comment
единственная разница в вашем коде - это новый SmbFileOutputStream(file, true); который позволяет добавить файл. Все равно не повезло. Доступ запрещен - person Stan; 27.02.2013