4

指定された OU 内の各 AD ユーザーのプロファイル / ホーム ディレクトリ / ホーム ドライブの設定を変更しようとしています。

この偉業を達成するはずの非常に基本的なコードを以下に示しますが、代わりに次の例外をスローしています。

要求された操作は、オブジェクトのクラスに関連付けられた 1 つ以上の制約を満たしていませんでした。

誰かがこの問題を抱えていましたか? もしそうなら、それを修正する方法はありますか?

ありがとうございました。

DirectoryEntry Entry = new DirectoryEntry("LDAP://OU=Company,DC=corp,DC=Placeholder,DC=com", null, null, AuthenticationTypes.Secure);

DirectorySearcher Searcher = new DirectorySearcher(Entry);
Searcher.SearchScope = SearchScope.Subtree;

Searcher.PropertiesToLoad.Add("sAMAccountName");
Searcher.Filter = "(&(objectClass=user)(objectCategory=person))";

foreach (SearchResult AdObj in Searcher.FindAll())
{
   Entry.InvokeSet("HomeDirectory", @"\\winfileserver\" + Convert.ToString(AdObj.Properties["sAMAccountName"][0]));
   Entry.InvokeSet("HomeDrive", "H");
   Entry.CommitChanges();
}
catch (Exception ex)
{
   richTextBox1.Text += ex.Message;
}
4

2 に答える 2

5

InvokeSet を呼び出す理由もありません。これを行う正しい方法は次のとおりです。

foreach (SearchResult AdObj in Searcher.FindAll()) { 
  DirectoryEntry user = AdObj.GetDirectoryEntry(); 
  user.Properties["HomeDirectory"].Value = @"\\winfileserver\" + Convert.ToString(AdObj.Properties["sAMAccountName"][0]); 
  user.Properties["HomeDrive"].Value = "H"; 
  user.CommitChanges(); 
} 
于 2011-09-27T02:36:08.483 に答える
3

Entry見つかったオブジェクトではなく、ディレクトリ ルートを指している を使用しているようです。そのため、呼び出しが失敗しています。

foreach ループを次のように変更できると思います。

foreach (SearchResult AdObj in Searcher.FindAll()) {
  DirectoryEntry user = AdObj.GetDirectoryEntry();
  user.InvokeSet("HomeDirectory", @"\\winfileserver\" + Convert.ToString(AdObj.Properties["sAMAccountName"][0]));
  user.InvokeSet("HomeDrive", "H");
  user.CommitChanges();
}
于 2011-09-26T20:57:01.350 に答える