ネットワークコンピュータのドライブ名及びフォルダを取得するには?

解決


葉月α  2005-12-15 21:07:08  No: 128902

開発環境
VB6.0 Windows2000

久々に質問させていただきます

今回、LANに接続されているネットワークコンピュータの
ドライブレター一覧の取得を行い、一覧表示を行う
ドライブを選択するとその中のフォルダを表示する
フォルダを選択するとファイルを表示するという

ローカル環境で行えばDriveListBoxとDirListBoxとFileListBoxで実現できる
処理を行いたいのですが

調べた所、WNetOpenEnumとWNetEnumResourceを用いることで出来るのでは?
と思いとりあえずローカルマシンに共有フォルダを5つ作成して
実行した所、1つだけ取得してERROR_NO_ITEMS(定数定義:259)で終了してしまいます

実行したソースは
RESOURCE_GLOBALNET=2
RESOURCETYPE_ANY=0
BUFSIZE=1000
nrA nrBはNETRESOUCE構造体
Type NETRESOUCE
  dwScope As Long
  dwType As Long
  dwDisplayType As Long
  dwUsage As Long
  lpLocalName As String
  lpRemoteName As String
  lpComment As String
  lpProvider As String
End Type
  

lngRet = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,0,nr,hEnum)

Do WNetEnumResource(hEnum,-1,BUF(0),BUFSIZE) <> ERROR_NO_ITEMS

  MoveMemory nrB , BUF(0), Len(nrB)
  lstrcpy strRemoteName, nrB.lpRemoteName
  Debug.Print strRemoteName

Loop

ということを行っています
A  なぜ一つだけフォルダが出来るのでかということと
B  この関連でドライブレターは取得できるのでしょうか?
C  サンプル等ではBUF(0)からAPI MoveMemoryを用いると
    NETRESOURCE構造体のlpRemoteNameに格納されているのを見かけるのですが
    どうしてもlpCommentに格納されてしまいます

不明点の多いまま質問している為、不明な所はご指摘願います


特攻隊長まるるう  2005-12-15 22:40:03  No: 128903

ドライブレター一覧…C: とか D: とか必要なんですか?
共有フォルダ名で良いです?

調べようかと思ってAPIの定義から確認しようとして
WNetEnumResource をぐぐったらいきなりサンプルが
引っかかって提示コードをデバックする気が失せたんで、
回答になってませんけど、それでもいいですか(  _)_
http://nienie.com/~masapico/api_WNetEnumResource.html
サンプルコードそのままコピペで自分のPCの共有フォルダは
全て表示されてしまいました。


葉月α  2005-12-16 00:05:13  No: 128904

特攻隊長まるるうさんありがとうございます
やっぱAPI名でググルとそれがTOPに来ますよね
一応そのページを参照させていただいた結果だったのでちとショック・・・

あとはネットワーク環境の問題とかその辺りになりそうな気配が充満してきました

実際やりたい作業は
相手先にあるファイルをローカルにコピーするというもの
その時にサーバ名はINIファイルに記述し
そのサーバのドライブレター(C$\ D$\等)を選択
フォルダを選択
ファイルを選択
選択したファイルをローカルの特定フォルダにコピーするというもの

私どもの入力ミス(開発マシンとインターネット接続マシンが違うためコピペできない)も要因としてあるかもしれないので
もう少し検証してみます

お手数おかけしました


特攻隊長まるるう  2005-12-16 00:41:31  No: 128905

>そのサーバのドライブレター(C$\ D$\等)を選択
…いや、だから、$ってことは共有フォルダの指定じゃないのでは?
エクスプローラのマイネットワークで開いていってC$\とかいう
フォルダが公開されてる?

サンプルコードそのままだと表示されるのは共有フォルダのみ
ですし、ドライブレター(C: とか D: とか)ではなく、共有フォルダ
(ドライブ)名(\\サーバ名\共有フォルダ名)のみが表示されます。
コンピュータにアクセスする権限が無く、パスワードの入力が
必要な場合などは『アクセスが拒否されました。』とメッセージ
が出ました。

十分にデバッグされたコードならいいんだけど、提示された
コードはリンク先のコードと細かい点でかなり違うし、デバッグ
が必要な段階なのか?サンプルコードをそのままの形で
実行してうまくいかなかったのか?どこが?というのが結構
あいまいな質問なので有効な回答を付け難いです。


Dental  2005-12-16 00:54:42  No: 128906

> …いや、だから、$ってことは共有フォルダの指定じゃないのでは?
> エクスプローラのマイネットワークで開いていってC$\とかいう
> フォルダが公開されてる?
http://support.microsoft.com/kb/314984


特攻隊長まるるう  2005-12-16 01:22:40  No: 128907

そう!そう!!、隠し共有という言葉が出てこなかったんです(TーT)
老化してるなぁ…痒いところに手が届くレス有難うございます。
すっきりしました(汗)


葉月α  2005-12-16 18:40:19  No: 128908

質問の仕方なっておらず申し訳ありません

最終的に行い事は隠し共有の表示です
コンボボックスに
C$\
D$\
E$\

と表示しDirListBoxのPathプロパティに
\\マシン名\C$\を指定してその中に存在するフォルダ一覧を表示
ということです

もし(私の知識で)出来ないならドライブ名もINIファイルに書き込んでも
よいですよ?との言葉を頂いたので、それが許されるならINIに書き込む方法を
最終的に取るかも知れません

どちらにしてもID・パスワードの問題は発生しますね・・・浅はかでした
ログインさえ出来ていれば、DirListBoxのPathプロパティには上記の事が実現できる
(フォルダのツリーが表示される)事は\\マシン名\ドライブ$を直打ちして確認しました

なので問題はパスワードですね
現状そちらも調査中としております

言い訳ですが
提示していただいたソースと私が最初に書いたソースが違うのは
各種サイトを見て回っているうちにそうなってしまったという
良い言い訳にもならないものでございます
また、共有フォルダの表示に関しての使い方もままなっていないので
もう少し考えてみます
というかもう一度入力しなおしてみます

最初の質問内容と150度くらい変わってしまっていることをお許しください


葉月α  2005-12-16 18:45:37  No: 128909

パスワード等に関しては
WNetAddConnection3
を調べれば出来そうという所に行き着いたので
それを調べて見ます


葉月α  2005-12-16 20:02:06  No: 128910

>もし(私の知識で)出来ないならドライブ名もINIファイルに書き込んでも
>よいですよ?

より検討してみたところ
逆にその方がメリットがあることに行き着きました
そもそもの仕様ミスです・・・ごめんなさい
結局ネットワーク先もドライブを選択できたほうがいいなぁ
というのが最初の要望だったのですが
検討結果・・・結局1つのドライブしかみないじゃんという結論になったんです

またログインに関しても
WNetAddConnection3に
マシン名、パスワード、ユーザID、NETRESOURCE構造体、再接続は試みないのでとりあえず最終引数には
マジックナンバーで0を指定し接続に成功しました
(この後きちんと定数定義します)

DirListBoxにもフォルダ一覧が正常に表示されました

一応質問の趣旨と解決方法が大きく変わってしまいましたが
解決とさせていただきたいと思います
また、共有フォルダが取得できなかった理由がわかった時は報告させて頂きます


葉月α  2005-12-21 20:14:53  No: 128911

隠し共有の取得についてない頭を絞ったので解決策を記述しておきます

前提条件として
接続先マシン名は固定の為INIファイルに記述している
起動時にWNetAddConnection2でログインを行わせる事を行っている

エラートラップにはOn Error Resume Nestを設定する
iをループカウンタとしたループでAsc("A")〜Asc("Z")までループし、
\\マシン名\chr(i) & "$"をDirListBox.Pathに設定する
正常に設定できた時はDirListBox.Pathの値が変化するので前回の値と比較する
前回と値が同じ=設定失敗
前回と値が違う=設定成功>コンボボックスにchr(i) & "$"を設定する

尚、一つも設定できなかった時は隠し共有(ドライブ)が存在しないことも考えられるが
今回の場合は権限不足によるものと判断し、終了以外の操作が出来ないように対応した

無駄が多いかもしれないけどなるべく私の頭で出来る範囲でやったらこういう解決法になりました


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加