UNCパスをローカルパスに変換するには?

解決


とも  2008-11-07 06:15:46  No: 145391  IP: 192.*.*.*

お世話になってます!

以下のようなことをしたいのですが、方法はりますでしょうか?

●したいこと
  ・サーバー①とクライアントPC②がありました。
  ・サーバー①にはC:\共有フォルダ③があり
  ・クライアントPC②からそれを  \\サーバー①\共有フォルダ③で見るこ
    とができます。
  ・このときサーバー①でプログラムを動作させ、
        入力で「\\サーバー①\共有フォルダ③」の情報を与え
        結果の「C:\共有フォルダ③」
        を取得したい。
●環境
    サーバー
      ・windows server 2003
      ・.NET Framework 2.0
      ・VB.NET 2005

編集 削除
だい  2008-11-07 09:03:51  No: 145392  IP: 192.*.*.*

安直にやるなら、
コマンドプロンプトで
Net Share
の結果を得て該当する行を得るとか。
コマンド実行と取得はこういうのの応用で。
http://dobon.net/vb/dotnet/process/standardoutput.html

APIならNetShareEnumですかね。
http://www.pinvoke.net/default.aspx/netapi32/NetShareEnum.html

編集 削除
魔界の仮面弁士  2008-11-07 09:34:42  No: 145393  IP: 192.*.*.*

取得方法としては幾つかありますが、まずは WMI を用いた方法を。

Imports System
Imports System.Management
Imports System.Collections.Generic
Public Module Module1
    Public Sub Main()
        Dim list As Dictionary(Of String, String) = GetSharedResources()
        For Each Item As KeyValuePair(Of String, String) In list
            Console.WriteLine("{0} = '{1}'", Item.Key, Item.Value)
        Next
        MsgBox("列挙完了", vbInformation Or vbSystemModal)
    End Sub

    Public Function GetSharedResources() As Dictionary(Of String, String)
        GetSharedResources = New Dictionary(Of String, String)()
        For Each mo As ManagementObject In New ManagementClass("Win32_Share").GetInstances()
            GetSharedResources.Add(CStr(mo("Name")), CStr(mo("Path")))
        Next
    End Function
End Module



> VB.NET 2005
すなわち VB2005 ですね。(.NET の名を製品名に冠するのは 2003 までです。)

編集 削除
とも  2008-11-07 14:59:12  No: 145394  IP: 192.*.*.*

だいさん界の魔界の仮面弁士ありがとうございます。
今のところWMIで動かすのがベターかなと思っていますが、
魔界の仮面弁士のサンプルのどこに\\サーバー①\共有フォルダ③を
入れたらいいのかわかりません。
申し訳ありませんが、教えてください。

編集 削除
魔界の仮面弁士  2008-11-07 17:47:44  No: 145395  IP: 192.*.*.*

> だいさん界の魔界の仮面弁士ありがとうございます。
# うっかり、「大殺界の魔界の仮面弁士」と読みかけた…。


> 魔界の仮面弁士のサンプルのどこに
結果は Dictionary で受けているので、その一覧に対して
  If list.ContainsKey(strFolderName) Then
    MsgBox( list(strFolderName) )
  End If
とすれば検索できるかと思います。

あるいは全部列挙してから取得するのでは無く、
  Dim s As String = String.Format( _
    "SELECT Path FROM Win32_Share WHERE Name = '{0}' AND Type = 0", _
    Replace(strFolderName, "\", "\\"))
のような WQL を ManagementObjectSearcher で呼び出すとか。(未確認)


> 入れたらいいのかわかりません。
今回はサーバー上で動かすので、サーバー名は使いません。
UNC による指定では無く、共有フォルダ名だけを指定してみてください。

# 権限さえあれば、別サーバの \root\cimv2:Win32_Share に接続することも
# できますが、今回はその必要も無さそうですし。

編集 削除
とも  2008-11-08 13:45:56  No: 145396  IP: 192.*.*.*

魔界の仮面弁士さんありがとうございます!
また名前めちゃめちゃ&呼捨してしまいごめんなさい。

サンプルの意味理解できました!
解決しそうです。ありがとうございました。

編集 削除