ここでの私の目標は次のとおりです。
- ユーザーはコンボボックスにコンピュータ名の全部または一部を入力します
- ボタン クリック イベントはバックグラウンド ワーカーを開始し、コンピュータ名を DoWork メソッドに渡します
- DoWork メソッドは ActiveDirectory で computername を検索し、コレクションを WorkerCompleted メソッドに渡します
- WorkerCompleted メソッドは、各コンピューター名をコンボボックス項目に追加します。
私のエラーは、backgroundWorker_RunWorkerCompleted メソッドの foreach ループにあります。
- 「'オブジェクト' には 'GetEnumerator' のパブリック定義が含まれていないため、foreach ステートメントはタイプ 'オブジェクト' の変数を操作できません」
MessageBox.Show(results.First().ToString()); を実行すると DoWork メソッドでは、コレクション内の最初のコンピューター名を表示できます。
MessageBox.Show(e.Result.ToString()); を実行すると DoWork および WorkerCompleted メソッドでは、次のようになります。
- "System.DirectoryServices.AccountManagement.PrincipalSearchResult`1[System.DirectoryServices.AccountManagement.Principal]"
これに関するガイダンスをいただければ幸いです。
private void button1_Click(object sender, EventArgs e)
{
//Saves computername entered by user to pass into DoWork method
string PCName = comboBox1.Text;
//Start background thread passing computer to the Dowork method
backgroundWorker1.RunWorkerAsync(PCName);
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
{
//Setup Filter
ComputerPrincipal computer = new ComputerPrincipal(ctx);
computer.Name = "*" + e.Argument + "*";
//Search for PC
PrincipalSearcher ps = new PrincipalSearcher();
ps.QueryFilter = computer;
//Get Results
PrincipalSearchResult<Principal> results = ps.FindAll();
//results will be passed to RunWorkerCompleted
e.Result = results;
}
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//Add each computername to combobox
foreach (object PC in e.Result) // <--------------- ERROR HERE!
{
comboBox1.Items.Add(PC.ToString());
}
}
}