32bit用_ネットワークに接続されている全てのコンピュータ名を取得するには?
※まだ書きかけです。すみません。
※間違ってたらすみません。
※メモ書きなので、自分でも意味不明な箇所も多いです。ごめんなさい。
★応用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 |
' ' Option Explicit Type NETRESOURCE 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 Type LPNETRESOURCE dwScope As Long dwType As Long dwDisplayType As Long dwUsage As Long lpLocalName As Long lpRemoteName As Long lpComment As Long lpProvider As Long End Type '================================================ '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 Long, _ ByVal dwType As Long, _ ByVal dwUsage As Long, _ LPNETRESOURCE As Any, _ lphEnum As Long) As Long Declare Function WNetEnumResource Lib "mpr.dll" Alias "WNetEnumResourceA" ( _ ByVal hEnum As Long, _ lpcCount As Long, _ lpBuffer As Any, _ lpBufferSize As Long) As Long Declare Function WNetCloseEnum Lib "mpr.dll" ( _ ByVal hEnum As Long) As Long Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" ( _ Destination As Any, _ Source As Any, _ ByVal Length As Long) Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" ( _ ByVal lpString1 As Any, _ ByVal lpString2 As Any) As Long '########################################################### ' 'ネットワーク上のPC名を、「異なるワークグループ」であっても '全部取得するプログラム。 'ただし、PCのみで、スマホなどは無視されます。 'また、ワークグループ名を変えた直後だと、 '(設定変更の反映が遅いので)設定変更の反映が追いつかず、 '同じPC名が出ることがあります。 '一瞬で終わりません。少し時間がかかります。 'http://vbit.kit.co.jp/QAndA08.htm# の '「ネットワークに接続されている全てのコンピュータ名を取得するには?」 'を参考にして作り変えたものです。 ' '########################################################### Sub GetPCNmListInLanNetWork() Dim nr As NETRESOURCE Dim lpnr As LPNETRESOURCE Dim bnr(1000) As Byte Dim strRemoteName As String Dim hEnum As Long Dim BufSize As Long Dim ret As Long Dim v_WG As Variant Dim j As Integer Dim s_PcNmList As String s_PcNmList = "" strRemoteName = String$(512, 0) ' NETRESOURCE構造体を設定 nr.dwScope = RESOURCE_GLOBALNET nr.dwType = RESOURCETYPE_ANY nr.dwDisplayType = RESOURCEDISPLAYTYPE_DOMAIN nr.dwUsage = RESOURCEUSAGE_CONTAINER v_WG = GetWGNmList For j = 0 To UBound(v_WG) nr.lpRemoteName = v_WG(j) '←ココだけ書き換える!★★★ nr.lpProvider = "Microsoft Windows Network" ' 設定された NETRESOURCE でオープン ret = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, nr, hEnum) BufSize = 1000 ' WNetEnumResource で接続されているコンピュータの情報を取得 Do While WNetEnumResource(hEnum, 1, bnr(0), BufSize) = NO_ERROR '取得したデータを strRemoteName にコピー MoveMemory lpnr, bnr(0), Len(lpnr) lstrcpy strRemoteName, lpnr.lpRemoteName 'strRemoteName の後ろの Chr$(0) をカット ' Debug.Print Left$(strRemoteName, InStr(strRemoteName, vbNullChar) - 1) s_PcNmList = s_PcNmList & Left$(strRemoteName, InStr(strRemoteName, vbNullChar) - 1) & "," Loop WNetCloseEnum hEnum Next j Debug.Print s_PcNmList End Sub '########################################################### ' 'ネットワーク上のすべてのワークグループ名を取得するプログラム。 ' '########################################################### Function GetWGNmList() As Variant Dim nr As NETRESOURCE Dim lpnr As LPNETRESOURCE Dim bnr(1000) As Byte Dim strRemoteName As String Dim hEnum As Long Dim BufSize As Long Dim ret As Long Dim v_Tmplist() As String Dim i As Integer i = 0 ReDim v_Tmplist(10) strRemoteName = String$(512, 0) ' NETRESOURCE構造体を設定 nr.dwScope = RESOURCE_GLOBALNET nr.dwType = RESOURCETYPE_ANY nr.dwDisplayType = RESOURCEDISPLAYTYPE_DOMAIN nr.dwUsage = RESOURCEUSAGE_CONTAINER nr.lpRemoteName = "" '←ココだけ書き換える!★★★ nr.lpProvider = "Microsoft Windows Network" ' 設定された NETRESOURCE でオープン ret = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, nr, hEnum) BufSize = 1000 ' WNetEnumResource で接続されているコンピュータの情報を取得 Do While WNetEnumResource(hEnum, 1, bnr(0), BufSize) = NO_ERROR '取得したデータを strRemoteName にコピー MoveMemory lpnr, bnr(0), Len(lpnr) lstrcpy strRemoteName, lpnr.lpRemoteName 'strRemoteName の後ろの Chr$(0) をカット ' Debug.Print Left$(strRemoteName, InStr(strRemoteName, vbNullChar) - 1) v_Tmplist(i) = Left$(strRemoteName, InStr(strRemoteName, vbNullChar) - 1) ' Debug.Print v_Tmplist(i) i = i + 1 Loop WNetCloseEnum hEnum ReDim Preserve v_Tmplist(i - 1) GetWGNmList = v_Tmplist() End Function Function MultiReturnArray(a_sPath) Dim sPath Dim sFile Dim i i = InStrRev(a_sPath, "\") sPath = Left(a_sPath, i) sFile = Mid(a_sPath, i + 1) MultiReturnArray = Array(sPath, sFile) End Function Sub MultiReturnArrayTest() Dim sPath Dim v Dim s sPath = "C:\web\test\abc.txt" v = MultiReturnArray(sPath) For Each s In v Debug.Print s Next End Sub ' ' |
★基本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
' ' Option Explicit Type NETRESOURCE 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 Type LPNETRESOURCE dwScope As Long dwType As Long dwDisplayType As Long dwUsage As Long lpLocalName As Long lpRemoteName As Long lpComment As Long lpProvider As Long End Type '================================================ '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 Long, _ ByVal dwType As Long, _ ByVal dwUsage As Long, _ LPNETRESOURCE As Any, _ lphEnum As Long) As Long Declare Function WNetEnumResource Lib "mpr.dll" Alias "WNetEnumResourceA" ( _ ByVal hEnum As Long, _ lpcCount As Long, _ lpBuffer As Any, _ lpBufferSize As Long) As Long Declare Function WNetCloseEnum Lib "mpr.dll" ( _ ByVal hEnum As Long) As Long Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" ( _ Destination As Any, _ Source As Any, _ ByVal Length As Long) Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" ( _ ByVal lpString1 As Any, _ ByVal lpString2 As Any) As Long '##################################################### '##################################################### Sub test() Dim nr As NETRESOURCE Dim lpnr As LPNETRESOURCE Dim bnr(1000) As Byte Dim strRemoteName As String Dim hEnum As Long Dim BufSize As Long Dim ret As Long strRemoteName = String$(512, 0) ' NETRESOURCE構造体を設定 nr.dwScope = RESOURCE_GLOBALNET nr.dwType = RESOURCETYPE_ANY nr.dwDisplayType = RESOURCEDISPLAYTYPE_DOMAIN nr.dwUsage = RESOURCEUSAGE_CONTAINER nr.lpRemoteName = "TAKE1" '←ココだけ書き換える!★★★ "" でやるとすべてのワークグループ名が表示される。 '存在しないワークグループ名を指定すると長時間フリーズこくときがあるので常に""にしておく。 nr.lpProvider = "Microsoft Windows Network" ' 設定された NETRESOURCE でオープン ret = WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, nr, hEnum) BufSize = 1000 ' WNetEnumResource で接続されているコンピュータの情報を取得 Do While WNetEnumResource(hEnum, 1, bnr(0), BufSize) = NO_ERROR '取得したデータを strRemoteName にコピー MoveMemory lpnr, bnr(0), Len(lpnr) lstrcpy strRemoteName, lpnr.lpRemoteName 'strRemoteName の後ろの Chr$(0) をカット Debug.Print Left$(strRemoteName, InStr(strRemoteName, vbNullChar) - 1) Loop WNetCloseEnum hEnum End Sub ' ' |