修改Active Directory属性

时间:2009-09-09 20:22:24

标签: c# asp.net active-directory

我正在尝试修改活动目录中用户的某些属性。我可以改变一些属性,有些属性我无法改变。我正在模仿,但是对于某些属性,当我尝试调用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

1 个答案:

答案 0 :(得分:3)

我相信我发现了这个问题。显然你需要在模拟完成后创建将被修改的DirectoryEntry。这似乎是有道理的,因为我相信修改用户的权利在创建要修改的条目时变得有效。任何人都可以验证吗?我没有看到它在任何文档中以这种方式解释。

我做了一些测试,发现第一个条目甚至不需要模拟,因为这些属性不安全。

在第二种情况下,以下代码有效:

if (ImpersonateValidUser(adConnectionUsername, adConnectionDomain, adConnectionPassword))
{      
    DirectoryEntry deUser = new DirectoryEntry(result.Path);              
    deUser.Properties["comment"].Value = comment;
    deUser.CommitChanges();
    deUser.Close();

    UndoImpersonation();
}