2013-01-28 1 views
7

Je suis en train d'écrire un fichier à partir du périphérique Android à Windows dossier partagé. J'utilise la dernière version de JCIFS et code which displays available network shares fonctionne très bien. Donc, je suppose que tout est ok avec JCIFS et avec mon LAN, WiFi, etc. Voici le code pour le téléchargement de fichiers (en fait je veux juste écrire un Sring texte dans un fichier):Ecrire/télécharger un fichier en utilisant Samba numéro/JCIFS (SmbAuthException: accès refusé)

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; 
     } 
    } 

Depuis l'url est connecté Je suis sûr qu'il est correct (aussi j'ai vérifié l'URL en utilisant le code que j'ai mentionné ci-dessus et il navigue le contenu du dossier).
Mais le problème est Im toujours obtenir le même:

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

ne sont pas protégés par mot, donc je ne avez pas besoin de nom d'utilisateur/mot de passe pour avoir accès. Je pourrais lire/écrire/supprimer des fichiers d'un autre WinPC et aucune autorisation n'est requise. J'ai aussi essayé de créer un mot de passe pour l'utilisateur sur WinPC avec des partages mais le résultat était le même. J'ai donc essayé plusieurs versions de NtlmPasswordAuthentication sans chance:

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,"",""); 

Alors qu'est-ce que je fais mal et comment achive mon but quand il n'y a pas d'autorisation est nécessaire pour obtenir l'accès au dossier partagé?
BTW mon téléviseur Samsung qui est basé sur Linux et utilise le client samba accède le même dossier partagé sans problème et joue MP3 à partir de là (bien, oui, il lit seulement). Depuis mon périphérique AOS accède à mon réseau local via WiFi (au lieu de TV qui est connecté via Ethernet) J'ai également vérifié l'accès au dossier partagé en utilisant notebook + WiFi et n'a trouvé aucun problème.
Ajouté:
J'essaie maintenant d'exécuter les lignes suivantes:

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

et obtenir le même accès refusé. Je ne vais même pas essayer d'écrire le fichier ...

Répondre

10

OMG !!! La solution était si simple !!! Pour accéder au réseau qui n'est pas login/mot de passe protégé et n'a donc pas besoin d'autorisation n'est pas NtlmPasswordAuthentication.ANONYMOUS mais il est:

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

bon sang était pas évident!

+2

Vous devez activer le compte Invité sur les fenêtres avant que cela fonctionne. –

+1

Dans mon cas, c'était WinXP et vous n'avez pas besoin d'un compte invité pour être actif pour que cela fonctionne (l'avait vérifié deux fois maintenant). Quant à Win7, c'est probablement le cas. Win7 est devenu très difficile à mettre au point si parler de réseautage et c'est la principale raison pour laquelle je ne l'aime pas par rapport à XP. – Stan

2

essayer avec ce code

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

Vérifiez aussi que vous avez partager le chemin du dossier que vous accédez. Vérifiez aussi qu'il a donné l'autorisation d'écriture dans le dossier

+0

??? est-ce une copie-collée des lignes de mon code? À quoi ça sert? Les autorisations d'écriture sont données et le dossier partagé existe bel et bien – Stan

+0

vraiment désolé pour mon erreur. pouvez-vous essayer avec ce code et laissez-moi savoir s'il vous plaît – rwe

+0

ok. alors qu'est-ce que je suis supposé utiliser comme nom d'utilisateur et mot de passe en 1ère ligne de code? Comme je l'ai mentionné précédemment, il n'y a pas d'authentification nécessaire, donc il n'y a pas d'utilisateur et le mot de passe a été défini. – Stan