C# PrincipalContext 只更改部分用户的密码,而不是全部

C# PrincipalContext only changes password for some users, not all

我正在尝试更改我系统中所有成员的 AD 密码,但我的代码仅成功更改了部分成员的密码。对于不能修改密码的会员,显示如下错误:

System.NullReferenceException: Object reference not set to an instance of an object. at changep1.changep2.changeUserPassword(String _userID, String _oldPassword, String _newPassword) in C:\Users\Intern\source\repos\changep1\changep1\changep2.aspx.cs:line 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 成员的密码。请帮忙谢谢。

您的代码需要在查找身份时检查 UserPrincipal 值是否为空,以防找不到传递的用户 ID。您没有在代码中检查相同的内容。这看起来像是它给出空指针异常的原因。

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

Returns a user principal object that matches the specified identity value.

Parameters

context Type: System.DirectoryServices.AccountManagement.PrincipalContext

The PrincipalContext that specifies the server or domain against which operations are performed.

identityValue Type: System.String

The identity of the user principal. This parameter can be any format that is contained in the IdentityType enumeration.


... // IdentityType Enumeration members are listed below:

Member name----------------------- Description

DistinguishedName-------------- The identity is a Distinguished Name (DN).

Guid ---------------------- The identity is a Globally Unique Identifier (GUID).

Name ---------------- The identity is a name.

SamAccountName--------------- The identity is a Security Account Manager (SAM) name.

Sid ------------- The identity is a Security Identifier (SID) in Security Descriptor Definition Language (SDDL) format.

UserPrincipalName The identity is a User Principal Name (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();
            }