none
VBScriptを使用して、ADのユーザー情報からpwdLastSetを取得したい RRS feed

  • 質問

  • VBScriptを使用して、Active Directoryに接続しpwdLastSetを取得しようとしているのですが、取得できません。

    PasswordLastChangedも同様に取得出来ませんでした。

    LDAPでは取得できないという記事も見かけるのですが、取得できないのでしょうか?

    取得できるのであれば、ご教示願います。

    2017年12月14日 14:01

回答

  • こんな感じですかね?

    Dim adoCommand, adoConnection, adoRecordset
    Dim objRootDSE, objPwdLastSet
    Dim strDNSDomain, strBase, strFilter, strAttributes, strQuery, strSamAccountName, dtmPwdLastSet
    
    Set adoCommand = CreateObject("ADODB.Command")
    Set adoConnection = CreateObject("ADODB.Connection")
    adoConnection.Provider = "ADsDSOObject"
    adoConnection.Open "Active Directory Provider"
    Set adoCommand.ActiveConnection = adoConnection
    
    Set objRootDSE = GetObject("LDAP://RootDSE")
    strDNSDomain = objRootDSE.Get("defaultNamingContext")
    strBase = "<LDAP://" & strDNSDomain & ">"
    
    strFilter = "(&(objectCategory=person)(objectClass=user))"
    strAttributes = "sAMAccountName,pwdLastSet"
    
    strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"
    
    adoCommand.CommandText = strQuery
    
    Set adoRecordset = adoCommand.Execute
    
    Do Until adoRecordset.EOF
        strSamAccountName = adoRecordset.Fields("sAMAccountName").Value
        dtmPwdLastSet = GetDateTime(adoRecordset.Fields("pwdLastSet").Value)
        Wscript.Echo strName & ", " & dtmPwdLastSet
    
        adoRecordset.MoveNext
    Loop
    
    adoRecordset.Close
    adoConnection.Close
    
    Function GetDateTime(objPwdLastSet)
        Dim lngHigh, lngLow
        Dim delta
    
        lngHigh = objPwdLastSet.HighPart
        lngLow = objPwdLastSet.LowPart
    
        If (lngLow < 0) Then
            lngHigh = lngHigh + 1
        End If
    
        delta = lngHigh * (2^32) + lngLowPart
        delta = (delta / (60 * 10000000) + 540) / 1440
    
        GetDateTime = delta + #1/1/1601#
    End Function

    2017年12月19日 2:48

すべての返信

  • こんな感じですかね?

    Dim adoCommand, adoConnection, adoRecordset
    Dim objRootDSE, objPwdLastSet
    Dim strDNSDomain, strBase, strFilter, strAttributes, strQuery, strSamAccountName, dtmPwdLastSet
    
    Set adoCommand = CreateObject("ADODB.Command")
    Set adoConnection = CreateObject("ADODB.Connection")
    adoConnection.Provider = "ADsDSOObject"
    adoConnection.Open "Active Directory Provider"
    Set adoCommand.ActiveConnection = adoConnection
    
    Set objRootDSE = GetObject("LDAP://RootDSE")
    strDNSDomain = objRootDSE.Get("defaultNamingContext")
    strBase = "<LDAP://" & strDNSDomain & ">"
    
    strFilter = "(&(objectCategory=person)(objectClass=user))"
    strAttributes = "sAMAccountName,pwdLastSet"
    
    strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree"
    
    adoCommand.CommandText = strQuery
    
    Set adoRecordset = adoCommand.Execute
    
    Do Until adoRecordset.EOF
        strSamAccountName = adoRecordset.Fields("sAMAccountName").Value
        dtmPwdLastSet = GetDateTime(adoRecordset.Fields("pwdLastSet").Value)
        Wscript.Echo strName & ", " & dtmPwdLastSet
    
        adoRecordset.MoveNext
    Loop
    
    adoRecordset.Close
    adoConnection.Close
    
    Function GetDateTime(objPwdLastSet)
        Dim lngHigh, lngLow
        Dim delta
    
        lngHigh = objPwdLastSet.HighPart
        lngLow = objPwdLastSet.LowPart
    
        If (lngLow < 0) Then
            lngHigh = lngHigh + 1
        End If
    
        delta = lngHigh * (2^32) + lngLowPart
        delta = (delta / (60 * 10000000) + 540) / 1440
    
        GetDateTime = delta + #1/1/1601#
    End Function

    2017年12月19日 2:48
  • フォーラムオペレーターの栗下 望です。
    hiro.z07 さん、こんにちは。

    Tomoaki Yoshizawa さんの回答はご覧いただけましたでしょうか?
    お試し済みであれば結果のご共有をいただけますと幸いです。

    既に問題が解決済みだった場合は、参考になった回答に[回答としてマーク]をご設定くださいね。

    どうぞよろしくお願いいたします。


    MSDN/TechNet Community Support 栗下 望

    2017年12月29日 7:56
    モデレータ