콘텐츠로 건너뛰기

Active Directory 비밀번호 변경

AD(Active Directory) 계정 비밀번호를 변경하는 간단한 프로그램입니다.

프로그램은 아래와 같이 디자인하였습니다.

액티브디렉토리 계정 비밀번호 변경

실행하여 연결테스트 후 결과 출력

도메인, 계정명, 비밀번호를 입력하고 연결테스트를 실행합니다.
연결이 성공적으로 테스트된 경우 비밀번호를 변경할 수 있게 됩니다.
실행로그는 아래쪽 텍스트박스에 출력됩니다.

테스트 프로그램이라고 무턱대고 입력하시면 실제 서버에 반영되어 버리니 주의하시기 바랍니다.

코드는 아래와 같습니다. 소스코드를 첨부하니 코드를 보시고 싶으시면 다운로드하셔서 보시면 됩니다.

Visual Studio 2010 솔루션 파일이고, .Net Framework 4.0을 사용합니다.
(.Net Framework 2.0 환경에서 사용하셔도 아무문제없습니다.)

솔루션 파일 다운로드

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.DirectoryServices;

namespace ADChangePassword
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.Load += new EventHandler(Form1_Load);
            this.btnTest.Click += new EventHandler(btnTest_Click);
            this.btnChg.Click += new EventHandler(btnChg_Click);
        }

        void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                this.txtPasswordChg.Enabled = false;
                this.txtPasswordChgRe.Enabled = false;
                this.btnChg.Enabled = false;

                this.txtDomain.Focus();
            }
            catch (Exception ex)
            {
                this.txtConsole.Text += "\r\n[Form Load] Error :";
                this.txtConsole.Text += "\r\n" + ex.Message;
            }
        }

        void btnTest_Click(object sender, EventArgs e)
        {
            try
            {
                if (string.IsNullOrEmpty(this.txtDomain.Text.Trim()))
                {
                    MessageBox.Show("도메인명을 입력하세요", "알림");
                    this.txtDomain.Focus();
                }
                else if (string.IsNullOrEmpty(this.txtUserId.Text.Trim()))
                {
                    MessageBox.Show("사용자 계정명을 입력하세요. 도메인을", "알림");
                    this.txtUserId.Focus();
                }
                else if (string.IsNullOrEmpty(this.txtUserPassword.Text.Trim()))
                {
                    this.txtUserPassword.Focus();
                }
                else
                {
                    string adDomain = this.txtDomain.Text.Trim();
                    string userName = this.txtUserId.Text.Trim();
                    string userPassword = this.txtUserPassword.Text.Trim();
                    string sMessage = string.Empty;
                    DirectoryEntry adUser = this.GetUserInfo(adDomain, userName, userPassword, out sMessage);
                    if (adUser == null || !string.IsNullOrEmpty(sMessage))
                    {
                        throw new Exception(sMessage);
                    }

                    foreach (string propertyName in adUser.Properties.PropertyNames)
                    {
                        string oneNode = propertyName + ": " + adUser.Properties[propertyName][0].ToString();
                        Console.WriteLine(oneNode);
                        this.txtConsole.Text += "\r\nFound User";
                        this.txtConsole.Text += "\r\n" + oneNode;
                    }

                    this.txtConsole.Text += "\r\n[Test Success]:";

                    this.txtPasswordChg.Enabled = true;
                    this.txtPasswordChgRe.Enabled = true;
                    this.btnChg.Enabled = true;
                }
            }
            catch (Exception ex)
            {
                this.txtPasswordChg.Enabled = false;
                this.txtPasswordChgRe.Enabled = false;
                this.btnChg.Enabled = false;

                this.txtConsole.Text += "\r\n[btnTest Click] Error :";
                this.txtConsole.Text += "\r\n" + ex.Message;
            }
        }

        void btnChg_Click(object sender, EventArgs e)
        {
            try
            {
                if (string.IsNullOrEmpty(this.txtPasswordChg.Text.Trim()))
                {
                    MessageBox.Show("변경할 비밀번호를 입력하세요", "알림");
                    this.txtPasswordChg.Focus();
                }
                else if (string.IsNullOrEmpty(this.txtPasswordChg.Text.Trim()))
                {
                    MessageBox.Show("변경할 비밀번호를 확인하세요.\r\n변경할 비밀번호와 다시 입력한 변경할 비밀번호는 동일해야 합니다.", "알림");
                    this.txtPasswordChgRe.Focus();
                }
                else if (!this.txtPasswordChg.Text.Trim().Equals(this.txtPasswordChgRe.Text.Trim()))
                {
                    this.txtPasswordChgRe.Focus();
                }
                else
                {

                    string adDomain = this.txtDomain.Text.Trim();
                    string userName = this.txtUserId.Text.Trim();
                    string userPassword = this.txtUserPassword.Text.Trim();
                    string sMessage = string.Empty;

                    DirectoryEntry adUser = this.GetUserInfo(adDomain, userName, userPassword, out sMessage);

                    if (adUser == null || !string.IsNullOrEmpty(sMessage))
                    {
                        throw new Exception(sMessage);
                    }

                    foreach (string propertyName in adUser.Properties.PropertyNames)
                    {
                        string oneNode = propertyName + ": " + adUser.Properties[propertyName][0].ToString();
                        Console.WriteLine(oneNode);
                        this.txtConsole.Text += "\r\nFound User";
                        this.txtConsole.Text += "\r\n" + oneNode;
                    }

                    string chgPassword = this.txtPasswordChg.Text.Trim();
                    adUser.Invoke("ChangePassword", userPassword, chgPassword);
                    adUser.CommitChanges();

                    this.txtConsole.Text += "\r\nSuccess :";
                    this.txtConsole.Text += "\r\n비밀번호가 변경되었습니다:";
                }
            }
            catch (Exception ex)
            {
                this.txtConsole.Text += "\r\n[btnChg Click] Error :";
                this.txtConsole.Text += "\r\n" + ex.Message;
            }
        }

        private DirectoryEntry GetUserInfo(string domain, string userName, string password, out string message)
        {
            message = string.Empty;
            DirectoryEntry adUser = null;

            try
            {
                string[] atmpDomain = domain.Split('.');
                string userNameDomain = string.Empty;

                if (domain.Contains("@"))
                {
                    userNameDomain = userName + "@" + atmpDomain;
                }
                else
                {
                    if (atmpDomain.Length > 0)
                    {
                        userNameDomain = atmpDomain[0] + @"\" + userName;
                    }
                    else
                    {
                        throw new Exception("도메인명 처리중 오류가 발생했습니다");
                    }
                }

                DirectoryEntry entryPC = new DirectoryEntry("LDAP://" + domain, userNameDomain, password);
                //entryPC.AuthenticationType = AuthenticationTypes.Secure;
                if (entryPC == null)
                {
                    throw new Exception("사용자를 찾을 수 없습니다.");
                }

                DirectorySearcher search = new DirectorySearcher(entryPC);
                search.Filter = "(SAMAccountName=" + userName + ")";
                search.PropertiesToLoad.Add("cn");
                SearchResult result = search.FindOne();
                adUser = result.GetDirectoryEntry();

                return adUser;
            }
            catch (Exception ex)
            {
                message = ex.Message;
                return adUser;
            }
        }
    }
}

이 사이트는 광고를 포함하고 있습니다.
광고로 발생한 수익금은 서버 유지 관리에 사용되고 있습니다.

This site contains advertisements.
Revenue generated by the ad servers are being used for maintenance.

“Active Directory 비밀번호 변경”의 2개의 댓글

  1. 안녕하세요. 소스 잘봤습니다.

    제가 여러가지 방법으로 비빌번호 변경 테스트를 시도해봤는데

    모두 동일한 오류가 나왔습니다.

    bbon 님께서 올려주신 소스를 이용해서 프로젝트를 생성해서 테스트를 해봤는데도 같은 오류가 나는데..

    혹시 이 오류에 대해서 아시는지 해서 댓글 남겨봅니다.

    [btnChg Click] Error :
    호출 대상이 예외를 Throw했습니다.

    혹시 이 오류 보신 적 있으신가요..

    구글링을 다 해봐도 모두 같은 이런 방식으로 하면 다들 성공하시는거 같은데….

    답변좀 부탁드립니다.

    1. 반갑습니다.

      코드를 다시 실행했을 때, 입력된 계정정보로 로그온된 것으로 처리되지 않아 비밀번호 변경이 불가능한 것으로 보이는 문제가 발생함을 알게 되었습니다.

      조금 한가해지면, 문제를 정확히 확인하고 해경방법을 찾아봐야겠습니다.

      혹시나, 관리자 계정으로 인증이 가능한 환경이라면 active directory reset password 글도 확인해 보십시오.

      빨리 문제가 해결되시길 기원합니다.

댓글 남기기