问题描述
我正在制作一个小型表单应用程序,用于向 Active Directory 添加新用户。
在创建 PrincipalContext 之后,我正在创建 UserPrincipal 并设置它的属性。
当我在 UserPrincipal 上调用 Save 时,抛出以下异常:
System.DirectoryServices.AccountManagement.PrincipalOperationException:请求的验证信息类无效。 (来自 HRESULT 的异常:0x80070544)---> System.Runtime.InteropServices.COMException:请求的验证信息类无效。
以下代码的相关部分:
PrincipalContext principalContext = null;
try
{
principalContext = new PrincipalContext(ContextType.Domain,"abc.com","OU=ouname,DC=abc,DC=com",ContextOptions.Negotiate,uName,pWord);
}
catch (Exception e)
{
return "Failed to create PrincipalContext. Exception: " + e;
}
// Check if user object already exists in the store
UserPrincipal usr = UserPrincipal.FindByIdentity(principalContext,userlogonName);
if (usr != null)
{
return userlogonName + " already exists. Please use a different User logon Name.";
}
// Create the new UserPrincipal object
UserPrincipal userPrincipal = new UserPrincipal(principalContext);
if (lastName != null && lastName.Length > 0)
{
userPrincipal.Surname = lastName;
}
if (firstName != null && firstName.Length > 0)
{
userPrincipal.Givenname = firstName;
}
if (userlogonName != null && userlogonName.Length > 0)
{
userPrincipal.EmailAddress = userlogonName + "@abc.com";
}
if (userlogonName != null && userlogonName.Length > 0)
{
userPrincipal.SamAccountName = userlogonName;
userPrincipal.UserPrincipalName = userlogonName;
}
string pwdOfNewlyCreatedUser = "abc123$$$!ABC";
userPrincipal.SetPassword(pwdOfNewlyCreatedUser);
userPrincipal.Enabled = true;
userPrincipal.ExpirePasswordNow();
try
{
userPrincipal.Save();
}
catch (Exception e)
{
return "Exception creating user object. " + e;
}
为清楚起见编辑: 这一行是捕获异常的地方:“ userPrincipal.Save();”
以上代码取自这里:
https://docs.microsoft.com/en-us/previous-versions/bb384369(v=vs.90)
我不知道从哪里开始。
编辑:进一步调查指向密码的设置。如果删除以下几行,则会创建用户:
string pwdOfNewlyCreatedUser = "abc123$$$!ABC";
userPrincipal.SetPassword(pwdOfNewlyCreatedUser);
但我不想删除这些行。或者更具体地说,我不想不设置密码。
解决方法
解决了这个问题。或者更确切地说,已经解决了这个问题。
在尝试以多种不同方式设置密码后,我找到了一种简单有效的方法。
代替
string pwdOfNewlyCreatedUser = "abc123$$$!ABC";
userPrincipal.SetPassword(pwdOfNewlyCreatedUser);
userPrincipal.Enabled = true;
userPrincipal.ExpirePasswordNow();
try
{
userPrincipal.Save();
}
catch (Exception e)
{
return "Exception creating user object. " + e;
}
我这样做:
userPrincipal.Enabled = true;
try
{
userPrincipal.Save();
userPrincipal.ChangePassword("","abc123$$$!ABC");
userPrincipal.ExpirePasswordNow();
userPrincipal.Save();
}
catch (Exception e)
{
return "Exception creating user object. " + e;
}
总结:SetPassword 不起作用,但在使用 ChangePassword 保存用户后起作用。