我正在尝试修改活动目录中用户的某些属性。我可以改变一些属性,有些属性我无法改变。我正在模仿,但是对于某些属性,当我尝试调用CommitChanges()时,我仍然会收到“General Access denied error”。
例如,这将起作用:
DirectoryEntry deUser = new DirectoryEntry(result.Path);
if (ImpersonateValidUser(adConnectionUsername, adConnectionDomain, adConnectionPassword))
{
deUser.Properties["ampPasswordQuestion"].Value = newPasswordQuestion;
deUser.Properties["ampPasswordAnswer"].Value = newPasswordAnswer;
deUser.CommitChanges();
deUser.Close();
UndoImpersonation();
}
这可能是因为我们手动将属性添加到AD模式中而没有访问限制。 (参见 ASP.NET 3.5安全性,成员资格和C#和VB 的角色管理)
但是,如果我尝试修改记录的Comment属性,如下所示:
DirectoryEntry deUser = new DirectoryEntry(result.Path);
if (ImpersonateValidUser(adConnectionUsername, adConnectionDomain, adConnectionPassword))
{
deUser.Properties["comment"].Value = comment;
deUser.CommitChanges();
deUser.Close();
UndoImpersonation();
}
然后我会收到“General access denied error”。
有人有什么想法吗?
Impersionation代码来自Microsoft:http://support.microsoft.com/kb/306158
答案 0 :(得分:3)
我相信我发现了这个问题。显然你需要在模拟完成后创建将被修改的DirectoryEntry。这似乎是有道理的,因为我相信修改用户的权利在创建要修改的条目时变得有效。任何人都可以验证吗?我没有看到它在任何文档中以这种方式解释。
我做了一些测试,发现第一个条目甚至不需要模拟,因为这些属性不安全。
在第二种情况下,以下代码有效:
if (ImpersonateValidUser(adConnectionUsername, adConnectionDomain, adConnectionPassword))
{
DirectoryEntry deUser = new DirectoryEntry(result.Path);
deUser.Properties["comment"].Value = comment;
deUser.CommitChanges();
deUser.Close();
UndoImpersonation();
}