【发布时间】:2013-01-02 09:58:48
【问题描述】:
我正在开发一个 C# Web 应用程序,以允许对 Active Directory 用户帐户进行读写访问。
我在我们的主要公司 AD 上做得很好——我可以读取帐户、获取属性、将详细信息保存回 AD、启用/禁用帐户等。我正在使用模拟来执行此操作,所以就在它保存到之前AD 它更改为使用不同的帐户(属于域管理员),然后在保存后恢复到主应用程序池帐户。
我刚刚被要求通过应用程序添加用户帐户,但我对在主 AD 上进行测试并不满意,因此我设置了一个带有测试 AD 的 VM。我已经在那个虚拟机上安装了应用程序,它可以从 AD 中读取。我已经设置了在实时 AD 上模拟的相同用户帐户,并将其添加到域管理员组中。但是,当我尝试将详细信息保存到现有用户时,我收到“拒绝访问”错误。
我知道模拟在保存之前的工作,我输出结果,我尝试更改密码,但失败并出现另一个错误。
我已询问我们的网络管理员是否为实时 AD 的模拟用户设置了任何特殊内容,但他说他没有,而且它们似乎是相同的。
除了将模拟用户添加到域管理员组之外,是否有人知道我可能需要做的其他事情?我尝试以用户身份登录 VM,并通过 AD 本身更改了用户帐户,因此该用户似乎确实具有所需的访问级别。
以下是我用来模拟用户的代码:
Impersonation imp = new Impersonation();
string impResult = "";
imp.ImpersonateDomainUser(out impResult, ConfigurationManager.AppSettings["ADAdminUserLogin"], user.Domain, ConfigurationManager.AppSettings["ADAdminUserPwd"]);
...
imp.Revert();
impResult 返回以下内容:
Before impersonation: NT AUTHORITY\SYSTEM
After impersonation: TESTDOMAIN\user.manager.service
我用来保存到 AD 的代码是:
var entry = new DirectoryEntry();
var account = userName.Replace(domain, "");
var search = new DirectorySearcher(entry) { Filter = "(SAMAccountName=" + account + ")" };
search.PropertiesToLoad.Add(propertyName);
var result = search.FindOne();
if (result != null)
{
DirectoryEntry entryToUpdate = result.GetDirectoryEntry();
if (propertyValue == null || propertyValue.ToString().Length == 0)
entryToUpdate.Properties[propertyName].Clear();
else
entryToUpdate.Properties[propertyName].Value = propertyValue;
entryToUpdate.CommitChanges();
entryToUpdate.Close();
entryToUpdate.Dispose();
}
任何建议将不胜感激。
【问题讨论】:
-
我已经向我的应用程序添加了一些跟踪,以确保它实际上使用模拟用户帐户将属性保存到 AD,就是这种情况。
-
我现在似乎已经修好了。如果其他人有这个问题,除非您也在虚拟机上进行测试,否则这不太可能,这取决于我的用户访问控制设置。我关闭了 UAC 并重新启动,它现在可以工作了。
-
请将您的评论作为答案,并将其标记为有效答案。
标签: c# asp.net active-directory