2013-01-28 67 views
7

私はアンドロイドデバイスからWindows共有フォルダにファイルを書き込もうとしています。私はJCIFSの最新バージョンを使用しており、code which displays available network sharesが問題なく動作します。Samba/JCIFSの問題を使ってファイルを書き込み/アップロードする(SmbAuthException:アクセスが拒否されている)

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が記録されているので:だから私はここでは、ファイルのアップロードのためのコードは、(実際に私は、ファイルにテキストSringを書きたい)であるすべてのものがJCIFSとOKと私のLAN、無線LANなどであると仮定します私はそれが正しいことを確信しています(また、私は上記のコードを使用してURLをチェックし、フォルダを含むブラウズ)。
しかし、問題Imは常に同じになっている:

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

だから何を私が間違ってやっているとどのように何の認証がないときに私の目標をachiveするかは、共有フォルダへのアクセスを得るために必要とされますか?
BTW私のサムスンTVは、Linuxベースで、Sambaクライアントを使用していますが、問題なく同じ共有フォルダにアクセスしています。そこからMP3を再生しています。私のAOSデバイスはWiFi(Ethernet経由で接続されているテレビの代わりに)経由で私のLANにアクセスしているので、ノートブック+ WiFiを使って共有フォルダへのアクセスもチェックしても何の問題も見つからなかった。
を追加しました:

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

をし、拒否された同じアクセス権を取得:
私は、次の行を実行するために、今しようとしています。私も...ファイルの書き込みに

答えて

10

OMG !!!ソリューションはとてもシンプルでした!ログインされていないネットワークにアクセスするには/パスワード任意の承認を必要としないため、保護されたとはNtlmPasswordAuthentication.ANONYMOUSではありませんが、それは次のとおりです。

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

いまいましいが、それがその明白ではなかったです!

+2

これが機能するには、Windows上でゲストアカウントを有効にする必要があります。 –

+1

私の場合はWinXPだったので、これを動作させるためにゲストアカウントをアクティブにする必要はありません(今は2回チェックしていました)。 Win7に関してはおそらくそうです。 Win7は、ネットワーキングについて話すとチューニングが非常に難しくなりました。主な理由は、XPと比べて好きではないという主な理由です。 – Stan

2

をしようとしていないよ、このコードで

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

を試してみてください。また、あなたがアクセスしているフォルダのパスを共有してい確認してください。また、フォルダに書き込み権限が与えられていることを確認してください。

+0

???これは私のコードのコピーペーストラインですか?ポイントは何ですか?書き込み権限が与えられていて、共有フォルダが存在するのは確かです。 – Stan

+0

は私の間違いを本当に申し訳なく思っています。このコードで試してみてください。 – rwe

+0

よろしくお願いします。だから私はあなたのコードの1行目でユーザー名とパスワードとして使用すると思いますか?私が以前に言及したように、認証は必要ないので、ユーザーとパスワードは設定されていません。 – Stan

関連する問題