这真是一个老问题,但就在最近,我不得不对类似的项目工作...如果有人跑进了同样的问题,我会发布了答案。
使用UserPrincipal类找不到user的原因是,正如您所提到的,您正在使用ContextType.Machine进行搜索。但在DirectEntry类中,您只是在执行简单的LDAP://查询。
这是我的解决方案。
我将我的服务器信息存储在.config文件中。
...
//Server name and port
//Note* depending on structure container will be different for everybody
...
我然后创建ADLDSUtility类返回PrincipalContext对象。
...
using System.DirectoryServices.AccountManagement
...
public class ADLDSUtility
{
public static ContextOptions ContextOptions = ContextOptions.SecureSocketLayer | ContextOptions.Negotiate;
public static PrincipalContext Principal
{
get
{
return new PrincipalContext(
ContextType.ApplicationDirectory,
ConfigurationManager.AppSettings["ADLDS_Server"],
ConfigurationManager.AppSettings["ADLDS_Container"],
//you can specify username and password if need to
ContextOptions);
}
}
从那里,我写了一个method接受(用户名,currentPassword和NEWPASSWORD)为PARAMATERS。
public void ChangePassword(string userName, string currentPassword, string newPassword)
{
using (PrincipalContext ctx = ADLDSUtility.Principal)
{
using (UserPrincipal principal = new UserPrincipal(ctx))
{
using (var searchUser = UserPrincipal.FindByIdentity(ctx, IdentityType.UserPrincipalName, userName))
{
if (searchUser != null)
{
searchUser.ChangePassword(currentPassword, newPassword);
// searchUser.SetPassword(newPassword);
if (String.IsNullOrEmpty(searchUser.Guid.ToString()))
{
throw new Exception("Could not change password");
}
}
}
}
}
}
在此示例中,我通过UserPrincipalName搜索用户。但我们并不仅限于此。我们还可以通过IdentityType.Guid等搜索用户。
现在searchUser有两个涉及密码的方法。我提供了他们两个。
//requires current and new password
searchUser.ChangePassword(currentPassword, newPassword);
//setting a password. Only requires new password.
searchUser.SetPassword(newPassword);
注它最好使用SSL来设置或更改密码。*