DirectoryAccess クラスに追加した共有フォルダ関連のメソッドのコードです。(前回追加したコードはこちら)
VB
'共有フォルダを取得します。
Public Shared Function GetVolumes() As IList(Of Volume)
Dim folders As New List(Of Volume)()
If CanConnectDomain Then 'ドメインに接続できる時
Using root = GetRootEntry() 'ルートのDirectoryEntryを取得
Dim filter = String.Format("(objectCategory={0})", CategoryType.Volume)
Using searcher As New DirectorySearcher(root, filter)
Using results = searcher.FindAll()
For Each res As SearchResult In results
folders.Add(DirectCast(CreateInstance(res.GetDirectoryEntry()), Volume))
Next
End Using
End Using
End Using
End If
Return folders
End Function
C#
//共有フォルダを取得します。
public static IList<Volume> GetVolumes()
{
var folders = new List<Volume>();
if (CanConnectDomain) //ドメインに接続できる時
{
using (var root = GetRootEntry()) //ルートのDirectoryEntryを取得
{
var filter = String.Format("(objectCategory={0})", CategoryType.Volume);
using (var searcher = new DirectorySearcher(root, filter))
{
using (var results = searcher.FindAll())
{
foreach (SearchResult res in results)
{
folders.Add((Volume)CreateInstance(res.GetDirectoryEntry()));
}
}
}
}
}
return folders;
}
DirectoryObject のインスタンスを作成する CreateInstance メソッドに共有フォルダ部分のコード(太字の部分)を追加しました。
VB
Private Shared Function CreateInstance(entry As DirectoryEntry) As DirectoryObject
Dim category As CategoryType
If [Enum].TryParse(Of CategoryType)(entry.SchemaClassName, True, category) = False Then
Throw New ArgumentException("entry の種類が CategoryType に該当しません。", "entry")
End If
Select Case category
Case CategoryType.User
If CanConnectDomain Then 'ドメインに接続できる時
Return New DomainUser(entry)
Else 'ドメインに接続できない時
Return New LocalUser(entry)
End If
Case CategoryType.Group
If CanConnectDomain Then 'ドメインに接続できる時
Return New DomainGroup(entry)
Else 'ドメインに接続できない時
Return New LocalGroup(entry)
End If
Case CategoryType.Computer
Return New Computer(entry)
Case CategoryType.PrintQueue
Return New PrintQueue(entry)
Case CategoryType.Volume
Return New Volume(entry)
Case Else
Throw New NotImplementedException()
End Select
End Function
C#
private static DirectoryObject CreateInstance(DirectoryEntry entry)
{
CategoryType category;
if (Enum.TryParse<CategoryType>(entry.SchemaClassName, true, out category) == false)
{
throw new ArgumentException("entry の種類が CategoryType に該当しません。", "entry");
}
switch (category)
{
case CategoryType.User:
if (CanConnectDomain) //ドメインに接続できる時
{
return new DomainUser(entry);
}
else //ドメインに接続できない時
{
return new LocalUser(entry);
}
case CategoryType.Group:
if (CanConnectDomain) //ドメインに接続できる時
{
return new DomainGroup(entry);
}
else //ドメインに接続できない時
{
return new LocalGroup(entry);
}
case CategoryType.Computer:
return new Computer(entry);
case CategoryType.PrintQueue:
return new PrintQueue(entry);
case CategoryType.Volume:
return new Volume(entry);
default:
throw new NotImplementedException();
}
}