代码之家  ›  专栏  ›  技术社区  ›  Scott Lance

修改Active Directory属性

  •  0
  • Scott Lance  · 技术社区  · 15 年前

    我正在尝试修改Active Directory中用户的某些属性。有些属性我可以更改,有些则无法更改。我正在进行模拟,但对于某些属性,当我尝试调用CommitChanges()时,仍然会出现“一般拒绝访问”错误。

    例如,这将起作用:

    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模式中。(见 使用C和VB的ASP.NET 3.5安全性、成员资格和角色管理 )

    但是,如果我尝试修改记录的comment属性,如下所示:

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

    然后我会得到“一般访问被拒绝错误”。

    有人有什么想法吗?

    未授权代码来自Microsoft,位于: http://support.microsoft.com/kb/306158

    1 回复  |  直到 15 年前
        1
  •  3
  •   Scott Lance    15 年前

    我想我已经找到问题了。显然,您需要创建将被修改的目录entry 之后 模拟完成。这似乎是有意义的,因为我相信修改用户的权利在创建要修改的条目时变得有效。有人能证实这一点吗?我在任何文档中都没有看到这种解释。

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

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

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