DirectoryAccess クラスに追加したプリンタ関連のメソッドのコードです。(前回追加したコードはこちら)
VB
'プリンタを取得します。
Public Shared Function GetPrintQueues() As IList(Of PrintQueue)
Dim printers As New List(Of PrintQueue)()
If CanConnectDomain Then 'ドメインに接続できる時
Using root = GetRootEntry() 'ルートのDirectoryEntryを取得
Dim filter = String.Format("(objectCategory={0})", CategoryType.PrintQueue)
Using searcher As New DirectorySearcher(root, filter)
Using results = searcher.FindAll()
For Each res As SearchResult In results
printers.Add(DirectCast(CreateInstance(res.GetDirectoryEntry()), PrintQueue))
Next
End Using
End Using
End Using
End If
Return printers
End Function
C#
//プリンタを取得します。
public static IList<PrintQueue> GetPrintQueues()
{
var printers = new List<PrintQueue>();
if (CanConnectDomain) //ドメインに接続できる時
{
using (var root = GetRootEntry()) //ルートのDirectoryEntryを取得
{
var filter = String.Format("(objectCategory={0})", CategoryType.PrintQueue);
using (var searcher = new DirectorySearcher(root, filter))
{
using (var results = searcher.FindAll())
{
foreach (SearchResult res in results)
{
printers.Add((PrintQueue)CreateInstance(res.GetDirectoryEntry()));
}
}
}
}
}
return printers;
}
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 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);
default:
throw new NotImplementedException();
}
}