Active Directory에 대해 사용자 이름과 비밀번호를 확인 하시겠습니까?


526

Active Directory에 대해 사용자 이름과 비밀번호를 확인하려면 어떻게해야합니까? 사용자 이름과 비밀번호가 올바른지 확인하고 싶습니다.

답변:


642

.NET 3.5 이상에서 작업하는 경우 System.DirectoryServices.AccountManagement네임 스페이스를 사용하고 자격 증명을 쉽게 확인할 수 있습니다.

// create a "principal context" - e.g. your domain (could be machine, too)
using(PrincipalContext pc = new PrincipalContext(ContextType.Domain, "YOURDOMAIN"))
{
    // validate the credentials
    bool isValid = pc.ValidateCredentials("myuser", "mypassword");
}

간단하고 신뢰할 수 있으며 최종적으로 100 % C # 관리 코드입니다. 무엇을 더 요청할 수 있습니까? :-)

여기에 대한 모든 내용을 읽으십시오.

최신 정보:

이 다른 SO 질문 (및 그 답변)에 요약 된 것처럼 이 호출 True에는 사용자의 이전 암호가 반환 될 수있는 문제가 있습니다. 이 동작을 인식하고 이런 일이 발생해도 놀라지 마십시오 :-) (이 점을 지적한 @MikeGledhill 덕분에!)


36
내 도메인에서 pc.ValidateCredentials ( "myuser", "mypassword", ContextOptions.Negotiate)를 지정하거나 System.DirectoryServices.Protocols.DirectoryOperationException : 서버가 디렉토리 요청을 처리 할 수 ​​없습니다.
Alex Peck

12
암호가 만료되었거나 계정이 비활성화 된 경우 ValidateCredentials는 false를 반환합니다. 불행히도, 그것이 false를 반환 했는지 알려주지 않습니다 (사용자를 리디렉션하여 비밀번호를 변경하는 것과 같은 합리적인 일을 할 수 없다는 것을 의미하기 때문에 유감입니다).
Chris J

64
또한 '게스트'계정에주의하십시오. 도메인 수준 게스트 계정이 활성화되어 있으면 존재하지 않는 사용자 에게 부여하면 ValidateCredentials가 true를 반환합니다 . 결과적으로 UserPrinciple.FindByIdentity, 전달 된 사용자 ID가 먼저 존재하는지 확인 하기 위해 전화 를 걸 수 있습니다.
Chris J

7
@AlexPeck : 나처럼 이것을해야하는 이유는 .NET이 기본적으로 LDAP + SSL, Kerberos, RPC 등의 기술을 사용했기 때문입니다. 네트워크에서 RPC가 꺼져 있다고 생각합니다 (good!). .NET에서 명시 적으로 말하지 않으면 Kerberos가 실제로 사용되지 않습니다 ContextOptions.Negotiate.
Brett Veenstra

5
사용자가 자신의 Active Directory 암호를 변경하면이 코드는 이전 AD 암호를 사용하여 사용자를 계속 행복하게 인증합니다. 응, 진짜 여기를 읽으십시오 : stackoverflow.com/questions/8949501/…
Mike Gledhill

70

인트라넷에서이 작업을 수행합니다

System.DirectoryServices를 사용해야합니다.

다음은 코드의 내장입니다

using (DirectoryEntry adsEntry = new DirectoryEntry(path, strAccountId, strPassword))
{
    using (DirectorySearcher adsSearcher = new DirectorySearcher(adsEntry))
    {
        //adsSearcher.Filter = "(&(objectClass=user)(objectCategory=person))";
        adsSearcher.Filter = "(sAMAccountName=" + strAccountId + ")";

        try
        {
            SearchResult adsSearchResult = adsSearcher.FindOne();
            bSucceeded = true;

            strAuthenticatedBy = "Active Directory";
            strError = "User has been authenticated by Active Directory.";
        }
        catch (Exception ex)
        {
            // Failed to authenticate. Most likely it is caused by unknown user
            // id or bad strPassword.
            strError = ex.Message;
        }
        finally
        {
            adsEntry.Close();
        }
    }
}

9
"경로"에 무엇을 넣습니까? 도메인의 이름은? 서버의 이름? 도메인의 LDAP 경로? 서버의 LDAP 경로?
Ian Boyd

3
답변 1 : 아니요. 웹 서비스로 실행하므로 기본 웹 앱의 여러 위치에서 호출 할 수 있습니다. ANSWER2는 : // DC = DOMAINNAME1, DC = DOMAINNAME2, DC = COM : 경로는 LDAP 정보 ... LDAP 포함
DiningPhilanderer

3
이로 인해 LDAP 삽입이 허용 될 수 있습니다. 당신은 탈출 또는 strAccountId에있는 괄호를 제거 할 수 있는지 확인 할 수 있습니다
Brain2000

이것이 strPassword일반 텍스트로 LDAP에 저장 되었음을 의미합니까 ?
Matt Kocaj

15
명시 적으로 호출 할 필요가 전혀 없습니다 Close()A의 using변수.
Nyerguds

62

여기에 제시된 몇 가지 솔루션에는 잘못된 사용자 / 암호와 변경해야하는 암호를 구별 할 수있는 기능이 없습니다. 다음과 같은 방법으로 수행 할 수 있습니다.

using System;
using System.DirectoryServices.Protocols;
using System.Net;

namespace ProtocolTest
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                LdapConnection connection = new LdapConnection("ldap.fabrikam.com");
                NetworkCredential credential = new NetworkCredential("user", "password");
                connection.Credential = credential;
                connection.Bind();
                Console.WriteLine("logged in");
            }
            catch (LdapException lexc)
            {
                String error = lexc.ServerErrorMessage;
                Console.WriteLine(lexc);
            }
            catch (Exception exc)
            {
                Console.WriteLine(exc);
            }
        }
    }
}

사용자 비밀번호가 잘못되었거나 사용자가 존재하지 않으면 오류에

"8009030C : LdapErr : DSID-0C0904DC, 설명 : AcceptSecurityContext 오류, 데이터 52e, v1db1",

사용자 비밀번호를 변경해야하는 경우

"8009030C : LdapErr : DSID-0C0904DC, 설명 : AcceptSecurityContext 오류, 데이터 773, v1db1"

lexc.ServerErrorMessage데이터 값은 Win32 오류 코드 16 진수 표현입니다. 이들은 Win32 LogonUser API 호출을 호출하여 리턴되는 동일한 오류 코드입니다. 아래 목록에는 16 진수 및 10 진수 값이있는 공통 값 범위가 요약되어 있습니다.

525 user not found ​(1317)
52e invalid credentials ​(1326)
530 not permitted to logon at this time (1328)
531 not permitted to logon at this workstation (1329)
532 password expired ​(1330)
533 account disabled ​(1331) 
701 account expired ​(1793)
773 user must reset password (1907)
775 user account locked (1909)

2
불행하게도 일부 AD 설치는 LDAP 하위 오류 코드를 반환하지 않으므로이 솔루션이 작동하지 않습니다.
Søren Mors

4
프로젝트에 일부 참조를 추가하는 것을 잊지 마세요 : System.DirectoryServicesSystem.DirectoryServices.Protocols
TomXP411

3
그러나 내 질문은 이것입니다. LDAP 서버 이름을 어떻게 얻습니까? 휴대용 응용 프로그램을 작성하는 경우 사용자가 모든 네트워크에서 AD 서버 이름을 알고 있거나 제공 할 필요는 없습니다.
TomXP411

1
특정 워크 스테이션에 로그인 할 수있는 사용자가 있습니다. 로그인을 시도하는 워크 스테이션을 어떻게 지정합니까? (workstation1은 데이터 531로 실패하고 workstation2는 정상적으로 작동합니다)
akohlsmith

1
크레딧이 충분하다고 생각하지 않아서 이상하게 느낍니다. 이것은 "사용자가 암호를 재설정해야"하는지 여부를 결정하기 위해 Win32 API 호출의 어려움없이 완벽하게 관리되는 방법입니다. 이 방법에 허점이있어 감사 율이 낮습니까? 흠 ...
Lionet Chen

34

DirectoryService를 사용하는 매우 간단한 솔루션 :

using System.DirectoryServices;

//srvr = ldap server, e.g. LDAP://domain.com
//usr = user name
//pwd = user password
public bool IsAuthenticated(string srvr, string usr, string pwd)
{
    bool authenticated = false;

    try
    {
        DirectoryEntry entry = new DirectoryEntry(srvr, usr, pwd);
        object nativeObject = entry.NativeObject;
        authenticated = true;
    }
    catch (DirectoryServicesCOMException cex)
    {
        //not authenticated; reason why is in cex
    }
    catch (Exception ex)
    {
        //not authenticated due to some other exception [this is optional]
    }

    return authenticated;
}

잘못된 사용자 / 암호를 감지하려면 NativeObject 액세스가 필요합니다.


4
이 코드는 권한 검사도 수행하기 때문에 좋지 않습니다 (사용자가 활성 디렉토리 정보를 읽을 수 있는지 확인하십시오). 사용자 이름과 비밀번호는 유효하지만 사용자는 정보를 읽을 수 없으며 예외가 발생합니다. 즉, 유효한 사용자 이름 및 비밀번호를 가질 수 있지만 여전히 예외가 발생합니다.
Ian Boyd

2
내가 요구하는 과정에서 실제로 오전 고유 의 동등한 PrincipleContext에만 .NET 3.5에 존재 -. 그러나 .NET 3.5 이상을 사용하는 경우 다음을 사용해야합니다.PrincipleContext
Ian Boyd

28

불행히도 AD에서 사용자 자격 증명을 확인하는 "간단한"방법은 없습니다.

지금까지 모든 방법을 제시하면 다음과 같은 부정적 결과를 얻을 수 있습니다. 사용자의 자격 증명은 유효하지만 AD는 특정 상황에서 거짓을 반환합니다.

  • 다음 로그온시 비밀번호를 변경해야합니다.
  • 사용자 비밀번호가 만료되었습니다.

ActiveDirectory에서는 사용자가 비밀번호를 변경해야하거나 비밀번호가 만료되어 LDAP를 사용하여 비밀번호가 유효하지 않은지 확인할 수 없습니다.

암호 변경 또는 암호 만료를 확인하려면 Win32 : LogonUser ()를 호출하고 Windows 오류 코드에서 다음 두 상수를 확인하십시오.

  • ERROR_PASSWORD_MUST_CHANGE = 1907
  • ERROR_PASSWORD_EXPIRED = 1330

1
나는 :)데도하지만 여기 당신이 만료와 MUST_CHANGE에 대한 devinitions을 가지고 어디에 ... 요구하지 찾을 수 있습니다
mabstrei


감사. 내 유효성 검사가 항상 거짓을 반환하는 방법을 찾으려고했습니다. 사용자가 비밀번호를 변경해야하기 때문입니다.
Deise Vicentin

22

아마도 가장 쉬운 방법은 LogInUser Win32 API를 PInvoke하는 것입니다.

http://www.pinvoke.net/default.aspx/advapi32/LogonUser.html

MSDN 참조는 여기에서 ...

http://msdn.microsoft.com/en-us/library/aa378184.aspx

확실히 로그온 유형을 사용하고 싶습니다

LOGON32_LOGON_NETWORK (3)

이것은 가벼운 토큰 만 생성하며 AuthN 검사에 적합합니다. (다른 유형은 대화식 세션 등을 만드는 데 사용될 수 있습니다.)


@Alan이 지적했듯이 LogonUser API에는 System.DirectoryServices 호출 외에 많은 유용한 특성이 있습니다.
stephbu

3
@cciotti : 아니, 그건 잘못이야. 누군가를 올바르게 인증하는 가장 좋은 방법은 LogonUserAPI를 @stephbu write로 사용하는 것입니다. 이 게시물에 설명 된 다른 모든 방법은 100 % 작동하지 않습니다. 그러나 LogonUser를 호출하려면 도메인에 가입해야한다고 생각합니다.
Alan

@Alan 자격 증명을 생성하려면 유효한 도메인 계정을 전달하여 도메인에 연결할 수 있어야합니다. 그러나 귀하의 컴퓨터가 반드시 도메인의 구성원 일 필요는 없습니다.
stephbu

2
LogonUserAPI는 가지고있는 사용자가 필요로 운영 체제의 일부로 작동을 privelage을; 이는 사용자가 얻는 것이 아니라 조직의 모든 사용자에게 부여하려는 것이 아닙니다. ( msdn.microsoft.com/en-us/library/aa378184(v=vs.85).aspx )
Ian Boyd

1
LogonUser 는 support.microsoft.com/kb/180548 에 따라 Windows 2000 이하 운영 체제의 일부로작동하면 됩니다. Server 2003 이상에서는 문제가 없습니다.
Chris J

18

전체 .Net 솔루션은 System.DirectoryServices 네임 스페이스의 클래스를 사용하는 것입니다. AD 서버를 직접 쿼리 할 수 ​​있습니다. 이 작업을 수행하는 작은 샘플이 있습니다.

using (DirectoryEntry entry = new DirectoryEntry())
{
    entry.Username = "here goes the username you want to validate";
    entry.Password = "here goes the password";

    DirectorySearcher searcher = new DirectorySearcher(entry);

    searcher.Filter = "(objectclass=user)";

    try
    {
        searcher.FindOne();
    }
    catch (COMException ex)
    {
        if (ex.ErrorCode == -2147023570)
        {
            // Login or password is incorrect
        }
    }
}

// FindOne() didn't throw, the credentials are correct

이 코드는 직접 제공 한 자격 증명을 사용하여 AD 서버에 연결합니다. 자격 증명이 유효하지 않으면 searcher.FindOne ()에서 예외가 발생합니다. ErrorCode는 "잘못된 사용자 이름 / 암호"COM 오류에 해당하는 것입니다.

AD 사용자로 코드를 실행할 필요는 없습니다. 실제로 도메인 외부의 클라이언트에서 AD 서버의 정보를 쿼리하는 데 성공적으로 사용합니다!


인증 유형은 어떻습니까? 위의 코드에서 잊어 버린 것 같습니다. :-) 기본적으로 DirectoryEntry.AuthenticationType은 Secured right?로 설정됩니다. 해당 코드는 보안되지 않은 (익명 또는 없음) LDAP에서 작동하지 않습니다. 내가 이것으로 맞습니까?
jerbersoft

아래쪽 측 쿼리 광고 서버는 가지고있다 허가 AD 서버를 조회 할 수 있습니다. 자격 증명은 유효하지만 AD를 쿼리 할 권한이 없으면 오류가 발생합니다. 이것이 바로 소위 고속 바인드 가 작성된 이유 입니다. 사용자가 무언가를 할 수있는 권한을 부여하지 않고 자격 증명의 유효성을 검사합니다.
Ian Boyd

2
자격 증명을 확인하기 전에 다른 이유로 COMException이 발생하는 경우 누군가가 통과 할 수 없습니까?
Stefan Paul Noack 님이

11

LDAP 자격 증명을 빠르게 인증하기위한 또 다른 .NET 호출 :

using System.DirectoryServices;

using(var DE = new DirectoryEntry(path, username, password)
{
    try
    {
        DE.RefreshCache(); // This will force credentials validation
    }
    catch (COMException ex)
    {
        // Validation failed - handle how you want
    }
}

이것은 PrincipalContext를 사용하여 나를 위해 일한 유일한 솔루션입니다.
Daniel

PrincipalContext는 보안 LDAP 연결 (일명 포트 636을 사용하는 LDAPS
Kiquenet

10

이 코드를 사용해보십시오 (참고 : Windows Server 2000에서 작동하지 않는 것으로보고 됨)

#region NTLogonUser
#region Direct OS LogonUser Code
[DllImport( "advapi32.dll")]
private static extern bool LogonUser(String lpszUsername, 
    String lpszDomain, String lpszPassword, int dwLogonType, 
    int dwLogonProvider, out int phToken);

[DllImport("Kernel32.dll")]
private static extern int GetLastError();

public static bool LogOnXP(String sDomain, String sUser, String sPassword)
{
   int token1, ret;
   int attmpts = 0;

   bool LoggedOn = false;

   while (!LoggedOn && attmpts < 2)
   {
      LoggedOn= LogonUser(sUser, sDomain, sPassword, 3, 0, out token1);
      if (LoggedOn) return (true);
      else
      {
         switch (ret = GetLastError())
         {
            case (126): ; 
               if (attmpts++ > 2)
                  throw new LogonException(
                      "Specified module could not be found. error code: " + 
                      ret.ToString());
               break;

            case (1314): 
               throw new LogonException(
                  "Specified module could not be found. error code: " + 
                      ret.ToString());

            case (1326): 
               // edited out based on comment
               //  throw new LogonException(
               //   "Unknown user name or bad password.");
            return false;

            default: 
               throw new LogonException(
                  "Unexpected Logon Failure. Contact Administrator");
              }
          }
       }
   return(false);
}
#endregion Direct Logon Code
#endregion NTLogonUser

"LogonException"에 대한 사용자 정의 예외를 작성해야합니다.


메소드에서 정보를 리턴하기 위해 예외 처리를 사용하지 마십시오. "알 수없는 사용자 이름 또는 잘못된 암호"는 예외가 아니며 LogonUser의 표준 동작입니다. 그냥 거짓을 반환하십시오.
Treb

그래 ...이 ... 오래된 VB6 라이브러리에서 포트를했다 2003을 서면 또는 그래서 ... (닷넷 처음 나왔을 때)
찰스 Bretana

Windows 2000에서 실행중인 경우이 코드가 작동하지 않습니다 ( support.microsoft.com/kb/180548 )
Ian Boyd

1
이것을 다시 생각하십시오. 로그온 사용자의 예상되는 동작 은 사용자를에 로그온하는 것입니다 . 이 태스크를 수행하는 데 실패하면, IS 예외. 실제로이 메서드는 부울이 아닌 void를 반환해야합니다. 또한 방금 부울을 반환하면 메서드 소비자는 사용자에게 실패 이유를 알려줄 방법이 없습니다.
Charles Bretana

5

.NET 2.0 및 관리 코드가 붙어있는 경우 로컬 및 도메인 계정에서 작동하는 다른 방법이 있습니다.

using System;
using System.Collections.Generic;
using System.Text;
using System.Security;
using System.Diagnostics;

static public bool Validate(string domain, string username, string password)
{
    try
    {
        Process proc = new Process();
        proc.StartInfo = new ProcessStartInfo()
        {
            FileName = "no_matter.xyz",
            CreateNoWindow = true,
            WindowStyle = ProcessWindowStyle.Hidden,
            WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData),
            UseShellExecute = false,
            RedirectStandardError = true,
            RedirectStandardOutput = true,
            RedirectStandardInput = true,
            LoadUserProfile = true,
            Domain = String.IsNullOrEmpty(domain) ? "" : domain,
            UserName = username,
            Password = Credentials.ToSecureString(password)
        };
        proc.Start();
        proc.WaitForExit();
    }
    catch (System.ComponentModel.Win32Exception ex)
    {
        switch (ex.NativeErrorCode)
        {
            case 1326: return false;
            case 2: return true;
            default: throw ex;
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }

    return false;
}   

그가 스크립트를 실행하는 컴퓨터의 로컬 계정과 잘 작동
eka808

BTW,이 메소드를 작동 시키려면이 메소드가 필요합니다. public static SecureString ToSecureString (string PwString) {char [] PasswordChars = PwString.ToCharArray (); SecureString 비밀번호 = new SecureString (); foreach (PasswordChars의 문자 c) Password.AppendChar (c); ProcessStartInfo foo = 새 ProcessStartInfo (); foo.Password = 비밀번호; foo.Password를 리턴하십시오. }
eka808

반대로 암호에 대해서는 SecureString을 사용해야합니다. WPF PasswordBox가 지원합니다.
Stephen Drew

5

잘못된 사용자 이름 또는 암호, 잠긴 계정, 만료 된 암호 등 여러 가지 이유로 Windows 인증이 실패 할 수 있습니다. 이러한 오류를 구별하려면 P / Invoke를 통해 LogonUser API 함수를 호출하고 함수가 false다음을 리턴하면 오류 코드를 확인하십시오 .

using System;
using System.ComponentModel;
using System.Runtime.InteropServices;

using Microsoft.Win32.SafeHandles;

public static class Win32Authentication
{
    private class SafeTokenHandle : SafeHandleZeroOrMinusOneIsInvalid
    {
        private SafeTokenHandle() // called by P/Invoke
            : base(true)
        {
        }

        protected override bool ReleaseHandle()
        {
            return CloseHandle(this.handle);
        }
    }

    private enum LogonType : uint
    {
        Network = 3, // LOGON32_LOGON_NETWORK
    }

    private enum LogonProvider : uint
    {
        WinNT50 = 3, // LOGON32_PROVIDER_WINNT50
    }

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool CloseHandle(IntPtr handle);

    [DllImport("advapi32.dll", SetLastError = true)]
    private static extern bool LogonUser(
        string userName, string domain, string password,
        LogonType logonType, LogonProvider logonProvider,
        out SafeTokenHandle token);

    public static void AuthenticateUser(string userName, string password)
    {
        string domain = null;
        string[] parts = userName.Split('\\');
        if (parts.Length == 2)
        {
            domain = parts[0];
            userName = parts[1];
        }

        SafeTokenHandle token;
        if (LogonUser(userName, domain, password, LogonType.Network, LogonProvider.WinNT50, out token))
            token.Dispose();
        else
            throw new Win32Exception(); // calls Marshal.GetLastWin32Error()
    }
}

샘플 사용법 :

try
{
    Win32Authentication.AuthenticateUser("EXAMPLE\\user", "P@ssw0rd");
    // Or: Win32Authentication.AuthenticateUser("user@example.com", "P@ssw0rd");
}
catch (Win32Exception ex)
{
    switch (ex.NativeErrorCode)
    {
        case 1326: // ERROR_LOGON_FAILURE (incorrect user name or password)
            // ...
        case 1327: // ERROR_ACCOUNT_RESTRICTION
            // ...
        case 1330: // ERROR_PASSWORD_EXPIRED
            // ...
        case 1331: // ERROR_ACCOUNT_DISABLED
            // ...
        case 1907: // ERROR_PASSWORD_MUST_CHANGE
            // ...
        case 1909: // ERROR_ACCOUNT_LOCKED_OUT
            // ...
        default: // Other
            break;
    }
}

참고 : LogonUser는 확인하려는 도메인과의 신뢰 관계가 필요합니다.


귀하의 답변이 가장 높은 투표 응답보다 나은 이유를 설명 할 수 있습니까?
모하마드 알리

1
@MohammadAli : 자격 증명 유효성 검사가 실패한 이유 (잘못된 자격 증명, 잠긴 계정, 만료 된 암호 등)를 알아야하는 경우 LogonUser API 함수가 알려줍니다. 대조적으로, PrincipalContext.ValidateCredentials 메소드는 (marc_s의 답변에 대한 의견에 따라) 그렇지 않습니다. 이 모든 경우에 false를 반환합니다. 반면 LogonUser는 도메인과의 트러스트 관계가 필요하지만 PrincipalContext.ValidateCredentials (제 생각에는)는 없습니다.
Michael Liu

2

내 간단한 기능

 private bool IsValidActiveDirectoryUser(string activeDirectoryServerDomain, string username, string password)
    {
        try
        {
            DirectoryEntry de = new DirectoryEntry("LDAP://" + activeDirectoryServerDomain, username + "@" + activeDirectoryServerDomain, password, AuthenticationTypes.Secure);
            DirectorySearcher ds = new DirectorySearcher(de);
            ds.FindOne();
            return true;
        }
        catch //(Exception ex)
        {
            return false;
        }
    }

1

여기 내 참조를위한 완벽한 인증 솔루션.

먼저 다음 네 가지 참조를 추가하십시오.

 using System.DirectoryServices;
 using System.DirectoryServices.Protocols;
 using System.DirectoryServices.AccountManagement;
 using System.Net; 

private void AuthUser() { 


      try{
            string Uid = "USER_NAME";
            string Pass = "PASSWORD";
            if (Uid == "")
            {
                MessageBox.Show("Username cannot be null");
            }
            else if (Pass == "")
            {
                MessageBox.Show("Password cannot be null");
            }
            else
            {
                LdapConnection connection = new LdapConnection("YOUR DOMAIN");
                NetworkCredential credential = new NetworkCredential(Uid, Pass);
                connection.Credential = credential;
                connection.Bind();

                // after authenticate Loading user details to data table
                PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
                UserPrincipal user = UserPrincipal.FindByIdentity(ctx, Uid);
                DirectoryEntry up_User = (DirectoryEntry)user.GetUnderlyingObject();
                DirectorySearcher deSearch = new DirectorySearcher(up_User);
                SearchResultCollection results = deSearch.FindAll();
                ResultPropertyCollection rpc = results[0].Properties;
                DataTable dt = new DataTable();
                DataRow toInsert = dt.NewRow();
                dt.Rows.InsertAt(toInsert, 0);

                foreach (string rp in rpc.PropertyNames)
                {
                    if (rpc[rp][0].ToString() != "System.Byte[]")
                    {
                        dt.Columns.Add(rp.ToString(), typeof(System.String));

                        foreach (DataRow row in dt.Rows)
                        {
                            row[rp.ToString()] = rpc[rp][0].ToString();
                        }

                    }  
                }
             //You can load data to grid view and see for reference only
                 dataGridView1.DataSource = dt;


            }
        } //Error Handling part
        catch (LdapException lexc)
        {
            String error = lexc.ServerErrorMessage;
            string pp = error.Substring(76, 4);
            string ppp = pp.Trim();

            if ("52e" == ppp)
            {
                MessageBox.Show("Invalid Username or password, contact ADA Team");
            }
            if ("775​" == ppp)
            {
                MessageBox.Show("User account locked, contact ADA Team");
            }
            if ("525​" == ppp)
            {
                MessageBox.Show("User not found, contact ADA Team");
            }
            if ("530" == ppp)
            {
                MessageBox.Show("Not permitted to logon at this time, contact ADA Team");
            }
            if ("531" == ppp)
            {
                MessageBox.Show("Not permitted to logon at this workstation, contact ADA Team");
            }
            if ("532" == ppp)
            {
                MessageBox.Show("Password expired, contact ADA Team");
            }
            if ("533​" == ppp)
            {
                MessageBox.Show("Account disabled, contact ADA Team");
            }
            if ("533​" == ppp)
            {
                MessageBox.Show("Account disabled, contact ADA Team");
            }



        } //common error handling
        catch (Exception exc)
        {
            MessageBox.Show("Invalid Username or password, contact ADA Team");

        }

        finally {
            tbUID.Text = "";
            tbPass.Text = "";

        }
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.