DirectoryAccess クラスに追加したプリンタ関連のメソッドのコードです。(前回追加したコードはこちら)
VB
'プリンタを取得します。
Public Shared Function GetPrintQueues() AsIList(OfPrintQueue)
Dim printers As NewList(OfPrintQueue)()
If CanConnectDomain Then 'ドメインに接続できる時
Using root = GetRootEntry() 'ルートのDirectoryEntryを取得
Dim filter = String.Format("(objectCategory={0})", CategoryType.PrintQueue)
Using searcher As NewDirectorySearcher(root, filter)
Using results = searcher.FindAll()
For Each res AsSearchResultIn 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<T>()
{
var printers = newList<PrintQueue>();
if (CanConnectDomain) //ドメインに接続できる時
{
using (var root = GetRootEntry()) //ルートのDirectoryEntryを取得
{
var filter = String.Format("(objectCategory={0})", CategoryType.PrintQueue);
using (var searcher = newDirectorySearcher(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 AsDirectoryEntry) AsDirectoryObject
Dim category AsCategoryType
If[Enum].TryParse(OfCategoryType)(entry.SchemaClassName, True, category) = False Then
Throw NewArgumentException("entry の種類が CategoryType に該当しません。", "entry")
End If
Select Case category
CaseCategoryType.User
If CanConnectDomain Then 'ドメインに接続できる時
Return NewDomainUser(entry)
Else 'ドメインに接続できない時
Return NewLocalUser(entry)
End If
CaseCategoryType.Group
If CanConnectDomain Then 'ドメインに接続できる時
Return NewDomainGroup(entry)
Else 'ドメインに接続できない時
Return NewLocalGroup(entry)
End If
CaseCategoryType.Computer
Return NewComputer(entry)
CaseCategoryType.PrintQueue
Return NewPrintQueue(entry)
Case Else
Throw NewNotImplementedException()
End Select
End Function
C#
private staticDirectoryObject CreateInstance(DirectoryEntry entry)
{
CategoryType category;
if (Enum.TryParse<CategoryType>(entry.SchemaClassName, true, out category) == false)
{
throw newArgumentException("entry の種類が CategoryType に該当しません。", "entry");
}
switch (category)
{
caseCategoryType.User:
if (CanConnectDomain) //ドメインに接続できる時
{
return newDomainUser(entry);
}
else //ドメインに接続できない時
{
return newLocalUser(entry);
}
caseCategoryType.Group:
if (CanConnectDomain) //ドメインに接続できる時
{
return newDomainGroup(entry);
}
else //ドメインに接続できない時
{
return newLocalGroup(entry);
}
caseCategoryType.Computer:
return newComputer(entry);
caseCategoryType.PrintQueue:
return newPrintQueue(entry);
default:
throw newNotImplementedException();
}
}