我正在开发一个C# Web应用程序,允许读写Active Directory用户帐户。我已经在我们的主公司AD上取得了很好的效果-我可以读取帐户、获取属性、将详细信息保存回AD、启用/禁用帐户等。我使用模拟来完成这个过程,所以在保存到AD之前,它会切换到使用不同的帐户(属于域管理员),然后在保存后恢复为主应用程序池帐户。
我刚刚被要求通过应用程序添加用户帐户,但我对在主AD上测试此功能感到不满意,因此我设置了一个带有测试AD的VM。我已经在那个VM上设置了应用程序,并且可以从AD中读取。我设置了与实时AD中模拟的相同的用户帐户,并将其添加到域管理员组。但是,当我尝试保存现有用户的详细信息时,我收到“拒绝访问”的错误。
我知道模拟正在工作,因为在保存之前,我输出了结果,并尝试更改密码,但出现了不同的错误。
我询问了我们的网络管理员是否为实时AD中的模拟用户设置了任何特殊设置,但他说他没有,并且它们似乎是相同的。
除了将模拟用户添加到域管理员组之外,还有其他需要做的事情吗?我尝试使用用户登录到VM,并通过AD本身对用户帐户进行更改,因此用户似乎具有所需的访问级别。
以下是我用来模拟用户的代码:
我使用的代码用于保存到AD是:
```
任何建议都将不胜感激。
我刚刚被要求通过应用程序添加用户帐户,但我对在主AD上测试此功能感到不满意,因此我设置了一个带有测试AD的VM。我已经在那个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是:
```
我正在使用以下代码保存到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();
}
任何建议都将不胜感激。