共有フォルダ一覧取得 WMI版

WMIで書き直してみた。ユーザ認証も含んでる。こっちのほうが断然短い。

/// <summary>
/// 指定されたサーバの共有フォルダ一覧を取得します。
/// </summary>
/// <param name="serverPaht">サーバ名。</param>
/// <param name="user">接続ユーザ名。</param>
/// <param name="password">接続パスワード。</param>
/// <returns>取得された共有フォルダの一覧。</returns>
public static List<string> GetFiles( string serverPaht, string user, string password ) {
  ConnectionOptions option = new ConnectionOptions {
    Username = user,
    Password = password,
  };

  ManagementScope scope = new ManagementScope(
    ConcatenateNetworkPath( serverPaht, "\\root\\cimv2" ), option
  );

  ObjectQuery query = new ObjectQuery( "Select * From Win32_Share" );
  ManagementObjectSearcher searcher = new ManagementObjectSearcher( scope, query );
  ManagementObjectCollection collection = searcher.Get();

  List<string> list = new List<string>();
  foreach (ManagementObject managementObject in collection) {
    list.Add( string.Format( managementObject["Name"].ToString() ) );
  }
  return list;
}

/// <summary>
/// ネットワークパスを結合します。
/// </summary>
/// <param name="basePath">ベースパス。</param>
/// <param name="path">結合するパス。</param>
/// <returns>結合されたネットワークパス。</returns>
static string ConcatenateNetworkPath( string basePath, string path ) {
  if (basePath.EndsWith( "\\" )) {
    if (path.StartsWith( "\\" )) {
      path = path.TrimStart( new[] { '\\' } );
    }
  } else {
    if (!path.StartsWith( "\\" )) {
      return basePath + "\\" + path;
    }
  }
  return basePath + path;
}

使い方

GetFiles( @"\\192.168.0.1", "username", "password" );
GetFiles( @"\\servername", "username", "password" );