Vb.net 如何让用户上次从Active Directory登录

Vb.net 如何让用户上次从Active Directory登录,vb.net,active-directory,vb.net-2010,Vb.net,Active Directory,Vb.net 2010,我正在尝试使用active directory获取用户信息。在大多数情况下,它是有效的。问题是我似乎无法获得用户的最后登录日期。有人有什么建议吗?我的代码如下: Public Shared Function GetUsersByUsername(ByVal Username As String) As ADUser Dim myUser As New ADUser Dim oroot As DirectoryEntry = New DirectoryEntry("GC:/

我正在尝试使用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

您是否尝试过“lastLogon”LDAP属性?您的代码看起来不错,我猜您只是不确定信息存储在AD中的什么位置?

对我来说很有用:

  • 加载属性:

    osearcher.PropertiesToLoad.Add("lastLogon")  
    
  • 访问它:

    dim myDateInterval = result.Properties("lastLogon").Item(0)
    
  • 注意,您将返回一个间隔值。我想它是64位的,无符号的。NET中有一些强制转换方法,但它们只接受带符号的64位。我还没有检查过在它成为一个问题之前会有多少年


    此外,如果您使用DirectoryServices中较新的UserPrincipal,则其中包含lastlogon,这将返回一个可为空的日期。

    感谢您的响应标记。我是一个新的使用广告,所以我不太确定我在做什么,哈哈。这主要是上坡路。无论如何,我尝试了lastLogon属性,但它总是返回空值。我知道它应该有一个值,因为我用每天登录的帐户进行测试;这家伙的网站真的很有用,他有一些关于为什么lastLogon可能不适合你的信息:谢谢你的链接,但我认为这不会有帮助。我尝试过使用“result.Properties(“lastLogon”).Item(0)”,但它总是返回空值