前回、DirectoryEntry.Properties プロパティに保持されてる属性名とその値をテキストファイルに出力するサンプルを書きました。
この中に含まれないものはオプションプロパティから取得できます。Properties プロパティにあるものもあります。
こちらも Windowsアプリ用ですが、オプションプロパティに保持されてる属性名とその値をテキストファイルに出力するサンプルです。
VB
Private Sub OutputOptionalProperties(entry As DirectoryEntry)
Dim adsi = DirectCast(entry.NativeObject, IADs)
Dim schema = DirectCast(entry.SchemaEntry.NativeObject, IADsClass)
Dim folderName = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
Dim fileName = String.Format("{0}OptionalProperties.txt", entry.Properties.Item("cn").Value)
Dim val As Object
Using writer As New StreamWriter(Path.Combine(folderName, fileName), False, Encoding.UTF8)
For Each pname As String In DirectCast(schema.OptionalProperties, IEnumerable)
Try
val = adsi.GetEx(pname)
Catch
writer.WriteLine("{0}:<未設定>", pname)
Continue For
End Try
If TypeOf val Is Byte() Then
Dim bstr = BitConverter.ToString(DirectCast(val, Byte()))
writer.WriteLine("{0}:{1}", pname, bstr)
Else
For Each pval In DirectCast(val, IEnumerable)
writer.WriteLine("{0}:{1}", pname, pval)
Next
End If
Next
End Using
MessageBox.Show(Me, String.Format("{0} に '{1}' を作成しました。", folderName, fileName), "プロパティ出力")
End Sub
C#
private void OutputOptionalProperties(DirectoryEntry entry)
{
var adsi = (IADs)entry.NativeObject;
var schema = (IADsClass)entry.SchemaEntry.NativeObject;
var folderName = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
var fileName = String.Format("{0}OptionalProperties.txt", entry.Properties["cn"].Value);
object val;
using (var writer = new StreamWriter(System.IO.Path.Combine(folderName, fileName), false, Encoding.UTF8))
{
foreach (string pname in (IEnumerable)schema.OptionalProperties)
{
try
{
val = adsi.GetEx(pname);
}
catch
{
writer.WriteLine("{0}:<未設定>", pname);
continue;
}
if (val is byte[])
{
var bstr = BitConverter.ToString((byte[])val);
writer.WriteLine("{0}:{1}", pname, bstr);
}
else
{
foreach (var pval in (IEnumerable)val)
{
writer.WriteLine("{0}:{1}", pname, pval);
}
}
}
}
MessageBox.Show(this, String.Format("{0} に '{1}' を作成しました。", folderName, fileName), "プロパティ出力")
}
前回書いたプロパティも今回のオプションのプロパティもそうですが、これはユーザに限らずグループやコンピュータなどを表す DirectoryEntry であってもそのまま使えます。
但し、実装の仕方としてはいいとは言えないので、あくまで確認用ということで悪しからずw