C#PrincipalContext仅更改某些用户的密码,而不是所有用户

时间:2018-02-06 04:26:03

标签: c# active-directory ldap change-password principalcontext

我正在尝试更改系统中所有成员的AD密码,但我的代码只是成功更改了某些成员的密码。对于无法更改密码的成员,它会显示以下错误:

  

System.NullReferenceException:未将对象引用设置为对象的实例。 at changep1.changep2.changeUserPassword(String _userID,String _oldPassword,String _newPassword)在C:\ Users \ Intern \ source \ repos \ changep1 \ changep1 \ changep2.aspx.cs:第52行

这是我的c#代码:

 public string changeUserPassword(string _userID, string _oldPassword, string _newPassword)
        {
            string message="";
            try
            {
                PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Domain, "extra.sales-comm.local", "DC=sales-comm,DC=local",
                ContextOptions.SimpleBind, @"admin", "Passw@rd");
                UserPrincipal oUserPrincipal = UserPrincipal.FindByIdentity(oPrincipalContext, _userID);

                oUserPrincipal.ChangePassword(_oldPassword, _newPassword);


                oUserPrincipal.Save();
            }
            catch (Exception e)
            {
                message = e.ToString();
            }
            return message;
        }

我不明白为什么我的代码不会更改所有AD成员的密码。请帮助谢谢。

1 个答案:

答案 0 :(得分:0)

如果找不到传递的user-id,您的代码需要在查找身份时检查UserPrincipal值是否为null。您在代码中未检查相同内容。这看起来就是它给出空指针异常的原因。

阅读方法UserPrincipal.FindByIdentity Method (PrincipalContext, String)的文档:

  

返回与指定标识匹配的用户主体对象   值。

     

<强>参数

     

context类型:System.DirectoryServices.AccountManagement.PrincipalContext

     

PrincipalContext,指定针对哪个服务器或域   执行操作。

     

identityValue类型:System.String

     

用户主体的身份。   此参数可以是IdentityType中包含的任何格式   枚举。

  

... // IdentityType枚举成员列在下面:

     

会员姓名-----------------------说明

     

DistinguishedName --------------身份是一个   专有名称(DN)。

     

Guid ----------------------身份是全球唯一标识符(GUID)。

     

名称----------------身份是一个名称。

     

SamAccountName ---------------身份是安全帐户管理员(SAM)名称。

     

Sid -------------身份是安全性中的安全标识符(SID)   描述符定义语言(SDDL)格式。

     

UserPrincipalName标识是用户主体名称(UPN)。

如下所示:

         try
            {
                PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Domain, "extra.sales-comm.local", "DC=sales-comm,DC=local", ContextOptions.SimpleBind, @"admin", "Passw@rd");
                UserPrincipal oUserPrincipal = UserPrincipal.FindByIdentity(oPrincipalContext, _userID);
               if ( null != oUserPrincipal){
                oUserPrincipal.ChangePassword(_oldPassword, _newPassword);    
                oUserPrincipal.Save();
               }
               else {
               // return the message that the user-id could not be found.
               // preferably passed argumnet in user-id should be **SamAccountName**
               // please make sure that the user-id corresponds to the members mentioned above
               }
            }
            catch (Exception e)
            {
                message = e.ToString();
            }