2013-02-05 5 views
0

사용자 정보를 얻기 위해 활성 디렉토리로 작업하려고합니다. 대부분의 경우 작동합니다. 문제는 사용자가 마지막으로 로그온 한 날짜를 얻지 못하는 것입니다. 누구든지 어떤 제안이 있습니까? 내 코드는 다음과 같습니다 :사용자가 Active Directory에서 마지막으로 로그온하는 방법

Public Shared Function GetUsersByUsername(ByVal Username As String) As ADUser 
    Dim myUser As New ADUser 
    Dim oroot As DirectoryEntry = New DirectoryEntry("GC://ldap.myCompany.com") 
    Dim osearcher As DirectorySearcher = New DirectorySearcher(oroot) 
    Dim result As SearchResult 

    osearcher.Filter = String.Format("(&(SAMAccountName={0}))", Username) 
    osearcher.PropertiesToLoad.Add("cn") 
    osearcher.PropertiesToLoad.Add("SAMAccountName") 'Users login name 
    osearcher.PropertiesToLoad.Add("givenName") 'Users first name 
    osearcher.PropertiesToLoad.Add("sn") 'Users last name 
    osearcher.PropertiesToLoad.Add("mail") 'Email address  
    osearcher.PropertiesToLoad.Add("accountExpires") 'expiration date 

    result = osearcher.FindOne 
    Try 
     Dim userPath As String() = result.Path.ToString.Split(New Char() {","c}) 
     Dim parsedString As String 
     Dim User As DirectoryEntry 
     Dim expirationDate As String 

     User = result.GetDirectoryEntry() 

     myUser.UserID = result.Properties("cn").Item(0) 
     myUser.EmailAddress = result.Properties("mail").Item(0) 
     myUser.FirstName = result.Properties("givenName").Item(0) 
     myUser.LastName = result.Properties("sn").Item(0)   

     expirationDate = result.Properties("accountExpires").Item(0) 

     If (isAccountLocked(User) = True) Then 
      myUser.Status = ADUser.AccountStatus.Locked 
     ElseIf (isAccountEnabled(User) = False) Then 
      myUser.Status = ADUser.AccountStatus.Disabled 
     ElseIf (isAccountExpired(expirationDate) = True) Then 
      myUser.Status = ADUser.AccountStatus.Expired 
     Else 
      myUser.Status = ADUser.AccountStatus.Active 
     End If 

     parsedString = userPath((userPath.Length - 3)) 
     myUser.Domain = parsedString.Substring(3, parsedString.Length - 3) 

    Catch ex As Exception 
     Return Nothing 
    End Try 

    Return myUser 
End Function 

답변

0

'lastLogon'LDAP 속성을 사용해 보셨습니까? 귀하의 코드는 좋아 보이는데, 정보가 어디서 AD에 저장되어 있는지 확실하지 않습니까? 나를 위해

+0

응답 마크를 보내 주셔서 감사합니다. 나는 광고를 처음 사용하기 때문에, 내가 무엇을하고 있는지 정확히 알지 못한다. 주로 언덕 위에있었습니다. 어쨌든 lastLogon 속성을 시도했지만 항상 null이 반환됩니다. 저는 매일 계정에 로그인하여 계정을 테스트하므로 가치가 있다는 것을 알고 있습니다. – jason

+0

몇 년 전에 내부 전화 번호부에 LDAP를 사용했는데 약간의 불편을 겪었습니다. 이 녀석의 위치는 진짜로 유용 하 그가 lastLogon가 너를 위해 일하지 않을지도 모른 까 왜에 어떤 정보가 있는다 : http://www.computerperformance.co.uk/ezine/ezine85.htm – markp3rry

+0

저것이 도움이되면 upvote에 잊지 말라 :) – markp3rry

1

작품 :

  1. 로드 재산 :

    osearcher.PropertiesToLoad.Add("lastLogon") 
    
  2. 액세스를 : 당신이 다시 간격 값을 얻을 것이다

    dim myDateInterval = result.Properties("lastLogon").Item(0) 
    

참고. 그것은 64 비트, 서명되지 않은 것 같습니다. .NET에는 몇 가지 캐스팅 메소드가 있지만 서명 된 64 비트 만 가져옵니다. 그것이 문제가되기까지 몇 년이 될지 미리 확인하지 않았습니까!

또한 DirectoryServices에서 새로운 UserPrincipal을 사용하는 경우 nullhostable 날짜를 반환하는 lastlogon이 있습니다.

관련 문제