DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ネットワークに接続されている全てのコンピュータ名を取得

環境/言語:[環境(XP)、使用言語(VB.NET)、.NET Frameworkのバージョン(1.1)]
分類:[.NET]

お世話になります。
早速ですが、VB.NETで、ネットワークに接続されている全てのコンピュータ名
を取得しようとし、調べてきました。
APIを使いできるとあり、VB6でのサンプルをみつけたのでためしたのですが、
ループ内にはいっていきません。
どうかご教授お願いします。

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim nr As wNET.NETRESOURCE
Dim lpnr As wNET.LPNETRESOURCE
Dim bnr(1000) As Byte
Dim strRemoteName As String
Dim hEnum As Integer
Dim BufSize As Integer
Dim ret As Integer

strRemoteName = CStr(512)

' NETRESOURCE構造体を設定
nr.dwScope = wNET.RESOURCE_GLOBALNET
nr.dwType = wNET.RESOURCETYPE_ANY
nr.dwDisplayType = wNET.RESOURCEDISPLAYTYPE_DOMAIN
nr.dwUsage = wNET.RESOURCEUSAGE_CONTAINER
nr.lpRemoteName = "WORKGROUP"
nr.lpProvider = "Microsoft Windows Network"

' 設定された NETRESOURCE でオープン
ret = wNET.WNetOpenEnum(wNET.RESOURCE_GLOBALNET, wNET.RESOURCETYPE_ANY, 0, nr, hEnum)

BufSize = 1000
' WNetEnumResource で接続されているコンピュータの情報を取得
Do While aa.WNetEnumResource(hEnum, 1, bnr(0), BufSize) = wNET.NO_ERROR

'取得したデータを strRemoteName にコピー
wNET.MoveMemory(lpnr, bnr(0), Len(lpnr))
wNET.lstrcpy(strRemoteName, lpnr.lpRemoteName)

'strRemoteName の後ろの Chr$(0) をカット
MessageBox.Show(strRemoteName)
'Debug.Print(Left$(strRemoteName, InStr(strRemoteName, vbNullChar) - 1))
Loop

wNET.WNetCloseEnum(hEnum)
End Sub

Public Class wNET
Structure NETRESOURCE
Public dwScope As Integer
Public dwType As Integer
Public dwDisplayType As Integer
Public dwUsage As Integer
Public lpLocalName As String
Public lpRemoteName As String
Public lpComment As String
Public lpProvider As String
End Structure

Structure LPNETRESOURCE
Public dwScope As Integer
Public dwType As Integer
Public dwDisplayType As Integer
Public dwUsage As Integer
Public lpLocalName As Integer
Public lpRemoteName As Integer
Public lpComment As Integer
Public lpProvider As Integer
End Structure

'================================================
'dwScope // リソースの範囲
'列挙するリソースの範囲を指定します。次の値のいずれかを指定します
'================================================
'現在接続されているすべてのリソース(dwUsage パラメータ
'は無視されます)
Public Const RESOURCE_CONNECTED = &H1
'呼び出し側のネットワークコンテキスト内([ネットワーク
'コンピュータ]に表示される範囲)のリソース(dwUsage
'パラメータは無視されます)
Public Const RESOURCE_CONTEXT = &H5
'ネットワーク上のすべてのリソース
Public Const RESOURCE_GLOBALNET = &H2
'記憶されている接続(dwUsage パラメータは無視されます)
Public Const RESOURCE_REMEMBERED = &H3

'================================================
'dwType // リソースの種類
'列挙するリソースの種類を指定します。次の値を組み合わせて指定します
'================================================
'すべてのリソース(RESOURCETYPE_DISK または RESOURCETYPE_PRINT
'との組み合わせは不可)
Public Const RESOURCETYPE_ANY = &H0
'すべてのディスクリソース
Public Const RESOURCETYPE_DISK = &H1
'すべての印刷リソース
Public Const RESOURCETYPE_PRINT = &H2

'================================================
'dwUsage // リソースの用途
'列挙するリソースの用途を指定します。次の値を組み合わせて指定します。
'================================================
'0 すべてのリソース
' すべての接続可能なリソース
Public Const RESOURCEUSAGE_CONNECTABLE = &H1
' すべてのコンテナリソース
Public Const RESOURCEUSAGE_CONTAINER = &H2

'================================================
'dwDisplayType // 表示タイプ
'エクスプローラなどで表示されるオブジェクトのタイプ
'================================================
'一般
Public Const RESOURCEDISPLAYTYPE_GENERIC = &H0
'ドメイン
Public Const RESOURCEDISPLAYTYPE_DOMAIN = &H1
'サーバ
Public Const RESOURCEDISPLAYTYPE_SERVER = &H2
'共有
Public Const RESOURCEDISPLAYTYPE_SHARE = &H3

'================================================
'WNetOpenEnum 戻り値
'================================================
'lpNetResource パラメータがコンテナリソースを指していません。
Public Const ERROR_NOT_CONTAINER = 1207&
'dwScope パラメータまたは dwType パラメータの値が無効です。
Public Const ERROR_INVALID_PARAMETER = 87 ' dderror
'ネットワークがありません。
Public Const ERROR_NO_NETWORK = 1222&
'ネットワーク固有のエラーが発生しました。エラーの詳細は、
'WNetGetLastError 関数で取得できます。
Public Const ERROR_EXTENDED_ERROR = 1208&

'================================================
'WNetEnumResource 戻り値
'================================================
'列挙が成功し、要求したデータがバッファに格納されました。
'アプリケーションは、引き続きこの関数を呼び出して、列挙
'を続けることができます。
Public Const NO_ERROR = 0
'これ以上列挙するエントリはありません。このときのバッファ
'の内容は、未定義です。
Public Const ERROR_NO_MORE_ITEMS = 259&
'================================================
'まだ列挙できるエントリが残っています。
Public Const ERROR_MORE_DATA = 234
'hEnum ハンドルが無効です。
Public Const ERROR_INVALID_HANDLE = 6&
'ERROR_EXTENDED_ERROR、ERROR_NO_NETWORK も返されます。
'================================================

'Declare Function WNetOpenEnum Lib "mpr.dll" Alias "WNetOpenEnumA" ( _
' ByVal dwScope As Integer, ByVal dwType As Integer, ByVal dwUsage As Integer, ByVal LPNETRESOURCE As Object, ByVal lphEnum As Integer) As Integer

Declare Auto Function WNetOpenEnum Lib "mpr.dll" Alias "WNetOpenEnumA" ( _
ByVal dwScope As Integer, ByVal dwType As Integer, ByVal dwUsage As Integer, ByVal LPNETRESOURCE As NETRESOURCE, _
ByVal lphEnum As Integer) As Long


Declare Function WNetEnumResource Lib "mpr.dll" Alias "WNetEnumResourceA" ( _
ByVal hEnum As Integer, ByVal lpcCount As Integer, ByRef lpBuffer As Byte, ByVal lpBufferSize As Integer) As Long

Declare Function WNetCloseEnum Lib "mpr.dll" (ByVal hEnum As Integer) As Long

Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Object, ByVal Source As Integer, ByVal Length As Integer)

Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long

End Class
■No18932に返信(オーデさんの記事)
> 早速ですが、VB.NETで、ネットワークに接続されている全てのコンピュータ名
> を取得しようとし、調べてきました。
> APIを使いできるとあり、VB6でのサンプルをみつけたのでためしたのですが、ループ内にはいっていきません。

API を使う必要はないです。

こちらの私の投稿を参照してください。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=35924&forum=7
返事遅くなってすみません。

環境を詳しく書いていなかったです。すみません。

.NET2003での開発で、System.DirectoryServicesは2005からの名前空間

みたいでした。

他に方法はないものなのでしょうか?
■No19006に返信(オーデさんの記事)
> 環境を詳しく書いていなかったです。すみません。
> 
> .NET2003での開発で、System.DirectoryServicesは2005からの名前空間
> 
> みたいでした。

はつみみです。:)

そこにそのようなソースがありますか?
MSDN ライブラリには 2.0 から追加されたとは一切記述がありませんが
すみません勘違いでした。

名前空間でなく、クラスのやつを言ってました。

もう少ししらべます。
■No19015に返信(オーデさんの記事)
> すみません勘違いでした。
> 名前空間でなく、クラスのやつを言ってました。

System.DirectoryServices.DirectoryEntry クラスにもそのようなことは書かれていませんが...?
じゃんぬさんありがとうございます。

勘違いしてたのは、DirectoryEntryでなく、何を見たのか、

DirectoryVirtualListView クラスでした・・・。

色々とご迷惑かけました。ありがとうございました。
  • 題名: Re[7]: 解決しました!!
  • 著者: オーデ
  • 日時: 2007/02/07 12:08:41
  • ID: 19040
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
すみません。解決済みのチェックをいれ忘れてました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板