C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: ネットワーク共有フォルダへのアクセス方法


(過去ログ 30 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■14339 / inTopicNo.1)  ネットワーク共有フォルダへのアクセス方法
  
□投稿者/ tucchi (10回)-(2008/02/15(Fri) 15:43:07)

分類:[.NET 全般] 

こんにちは。

VS2003のC#でプログラムしています。

ネットワーク共有フォルダにあるファイルを取得するプログラムを作成したいのですが、
そのフォルダにアクセスする方法がわからずにいます。

普通に、ローカルフォルダのように扱えるのかな?と、
とりあえずフォルダ存在確認を以下のようにコーディングしてみました。

string netFolder = @"\\192.168.128.100\home\";

if (Directory.Exists(netFolder)
Console.WriteLine("あった");
else
Console.WriteLine("なかった");

これを実行してみると、あきらかにそのフォルダは存在するのに、
「なかった」
と表示されます。

そもそも、ローカルフォルダのように扱えないのかな?と思い、
googleで「c# ネットワーク共有」などと調べてみたのですが、わかりませんでした。

すみませんが、ネットワーク共有フォルダにアクセスする方法を教えていただけませんでしょうか?
引用返信 編集キー/
■14341 / inTopicNo.2)  Re[1]: ネットワーク共有フォルダへのアクセス方法
□投稿者/ 魔界の仮面弁士 (629回)-(2008/02/15(Fri) 16:15:40)
No14339 (tucchi さん) に返信
> string netFolder = @"\\192.168.128.100\home\";
このパスは、エクスプローラから参照できるのですね?

> これを実行してみると、あきらかにそのフォルダは存在するのに、
> 「なかった」
> と表示されます。
共有フォルダへのアクセス権限が無かったりしませんか? そのアプリの実行ユーザ権限において。

# たとえば、サービスとして動作するアプリのように、デスクトップにログオンしているユーザとは
# 異なるアカウントとして動作しているような場合とか。
引用返信 編集キー/
■14343 / inTopicNo.3)  Re[2]: ネットワーク共有フォルダへのアクセス方法
□投稿者/ tucchi (11回)-(2008/02/15(Fri) 16:52:54)
No14341 (魔界の仮面弁士 さん) に返信

回答ありがとうございます。
>>string netFolder = @"\\192.168.128.100\home\";
> このパスは、エクスプローラから参照できるのですね?
開発用マシンから、エクスプローラで参照しようとすると、
ユーザー名とパスワードを要求されました。
このマシンで先ほどのプログラムを実行すると、「なかった」と表示されました。

別のPC(一度共有フォルダにアクセスし、ユーザー名・パスワードを入力したことがあるマシン)から
エクスプローラで参照しようとすると、問題なく参照できました。
また、このマシンで先ほどのプログラムを実行すると、「あった」と表示されました。


> 共有フォルダへのアクセス権限が無かったりしませんか? そのアプリの実行ユーザ権限において。
>
> # たとえば、サービスとして動作するアプリのように、デスクトップにログオンしているユーザとは
> # 異なるアカウントとして動作しているような場合とか。
上記のテスト結果のとおり、アクセス権限がないことが原因だったのですね。
問題が整理できました。ありがとうございます。

となると、次に問題になるのは
プログラムから「共有フォルダへのアクセス権限を得る」ということになるのでしょうか?
エクスプローラからであれば、
「ユーザー名」「パスワード」を入力するだけで参照できるようになることから考えると、
同じような処理をプログラムから行えばいいわけですよね?
すみません。その方法はお分かりになるでしょうか?

(僕の考えが間違っている場合は、指摘していただけるとありがたいです)

よろしくお願いいたします。
引用返信 編集キー/
■14472 / inTopicNo.4)  Re[3]: ネットワーク共有フォルダへのアクセス方法
□投稿者/ crimsonwoods (1回)-(2008/02/19(Tue) 15:08:59)
> プログラムから「共有フォルダへのアクセス権限を得る」ということになるのでしょうか?

プログラムから権限を得なくても、事前に設定しておけばアクセス可能ですよ。
(ドメインユーザーのアクセス権の設定をするだけでも良いし、ネットワーク越しにマウントしてしまっても良い)
お勧めは適当なドライブにマウントしちゃうという方法です。
(CALの数とか気にしなくて良ければという条件付ですが)

で、どうしてもプログラムでなんとかしたい場合は↓のような方法があります。

[方法1]

netコマンドというものがあって「net use ほげほげ」と使います。
netコマンドの使い方は省略します(ご自分で調べてみてください)。
で、これと同じことをできるAPIがあって、NetUseXXXという名前で公開されています。
詳細はMSDNで調べてみてください。
C#からならP/Invokeを使って呼び出すことになると思います。

[方法2]

LogonUserおよびImpersonateを使用して一時的に別ユーザーでアクセスする。
たしかJittaさんのblogでソースが公開されていたような。。。
と思ったら見つけた。

http://blogs.wankuma.com/jitta/articles/30483.aspx


とりあえず参考情報ということで。
引用返信 編集キー/
■14507 / inTopicNo.5)  Re[4]: ネットワーク共有フォルダへのアクセス方法
□投稿者/ 渋木宏明(ひどり) (653回)-(2008/02/20(Wed) 12:04:56)
渋木宏明(ひどり) さんの Web サイト
> で、どうしてもプログラムでなんとかしたい場合は↓のような方法があります。

NetUseAdd() のヘルプにもちらっと書かれていますが、スタンドアロンアプリケーションから共有フォルダへの一時的なアクセスが目的なら、WNetAddConnectionXXX() で接続して UNC でアクセスする方が自然な気がします。

アプリケーションの勝手でネットワークドライブを割り当ててしまうのはいかがなものかと思いますし、WNetAddConnectionXXX() なら、シェルと同じ UI で認証を行えるので、ユーザに対しても説明しやすいと思います。

Web アプリケーションの場合は、なるべく web.config の設定による偽装で済むように設計&構築するのが無難です。

> [方法2]

たかだかファイルアクセス程度で偽装ってのはオーバーテクノロジーです。

偽装をすると、偽装先のアカウントに許可された範囲でファイルアクセス以外のことまで出来てしまうのでセキュリティ的にもよろしくないかと。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -