How to: Search for Password Change Requests from a Connected Data Source

When users change their passwords at a connected data source, the password change is first imported into the Forefront Identity Manager Synchronization Service (FIM Synchronization Service) connector space for that data source. The password is then synchronized with the metaverse and exported to the other connected data sources. The MIIS_PasswordChangeHistorySource Class class contains the password change history from the originating connected data source.

The following examples show how to search for password change requests from the originating connected data source.

Search by User

The following Microsoft Visual Basic Scripting Edition (VBScript) example shows how to retrieve the password change history for a specified user from the data source that requested the change.

Option Explicit

On Error Resume Next

Const PktPrivacy = 6    ' Authentication level

Dim Service             ' Service object
Dim queryString         ' SQL Query string
Dim userName            ' sAMAccountName of the user
Dim domainName          ' User domain
Dim errorString         ' Error string
Dim statusString        ' Status string
Dim CSUsers             ' Connector space user collection
Dim User                ' Connector space user
Dim changeHistories     ' Change history collection
Dim changeHistory       ' Change history member

userName = "jeffsmith"
domainName ="fabrikam"

Set Service = GetObject("winmgmts:{authenticationLevel=PktPrivacy}!root\MicrosoftIdentityIntegrationServer")
If err.number<>0 then 
    errorString = "Could not retrieve service object: "
    errorString = errorString & Err.Description
    ErrorHandler(errorString)
End If

queryString = "Select * From MIIS_CSObject WHERE Domain = "
queryString = queryString & "'" & domainName & "' "
queryString = queryString & "and account = '" & userName & "'"
Set CSUsers = Service.ExecQuery(queryString)

If err.number <> 0 then
    errorString = "Could not find the user: "
    errorString = errorString & err.Description
    ErrorHandler(errorString)
End If

If CSUsers.Count = 0 then 
    statusString = "No users with that sAMAccountName."
    ErrorHandler(statusString)
End If 

For each User in CSUsers

    queryString = "Select * from MIIS_PasswordChangeHistorySource WHERE " &_
    queryString = queryString & "CsGuid = '"
    queryString = queryString & User.Guid & "'"
    Set changeHistories = Service.ExecQuery(queryString)
    
    If err.number <> 0 then
        errorString = "Could not retrieve password change history: " 
        errorString = errorString & Err.Description
        ErrorHandler(errorString)
    End If

    If changeHistories.Count = 0 then
        statusString = "There are no password change histories for the " 
        statusString = statusString & "user " & User.Account & "."
        WScript.Echo statusString
      Else
        For Each changeHistory in changeHistories
            statusString = "Change History for this user "
            statusString = statusString & userName &":"
            WScript.Echo statusString
            WScript.Echo changeHistory.eventDetails
        Next
    End If
Next
Sub ErrorHandler (ErrorMessage)
    WScript.Echo ErrorMessage
    WScript.Quit(1)
End Sub

Search by Time

The following VBScript example shows how to retrieve the password change history for any change request made after September 16, 2004.

Option Explicit

On Error Resume Next

Const PktPrivacy = 6    ' Authentication level
Dim Service             ' Service object
Dim queryString         ' SQL Query string
Dim errorString         ' Error string
Dim timePeriod          ' Time string
Dim changeHistories     ' Change history collection
Dim changeHistory       ' Change history member

Set Service = GetObject("winmgmts:{authenticationLevel=PktPrivacy}!root\MicrosoftIdentityIntegrationServer")
If err.number<>0 then 
    errorString = "Could not retrieve service object: "
    errorString = errorString & Err.Description
    ErrorHandler(errorString)
End If

timePeriod = "2004-09-16"
queryString = "Select * From MIIS_PasswordChangeHistorySource WHERE MIISReceiveTime > '"
queryString = queryString & timePeriod & "'"
    
Set changeHistories = Service.ExecQuery(queryString)

If err.number <> 0 then
    errorString = "Could not retrieve password change history: " 
    errorString = errorString & Err.Description
    ErrorHandler(errorString)
End If

If changeHistories.Count = 0 then
    WScript.Echo "There are no password changes requested after "
    WScript.Echo timePeriod & "."
    WScript.Quit(0)
End If

For Each changeHistory in changeHistories
    WScript.Echo changeHistory.eventDetails
Next

Sub ErrorHandler (ErrorMessage)
    WScript.Echo ErrorMessage
    WScript.Quit(1)
End Sub

Search by Management Agent

The following VBScript example shows how to retrieve the password change history from the originating connected data source for a specified management agent.

Option Explicit

On Error Resume Next

Const PktPrivacy = 6    ' Authentication level
Dim Service             ' Service object
Dim queryString         ' SQL Query string
Dim errorString         ' Error string
Dim statusString        ' Status string
Dim ManagementAgentSet  ' Management agent collection
Dim ManagementAgent     ' Management agent member
Dim changeHistories     ' Change history collection
Dim changeHistory       ' Change history member

Set Service = GetObject("winmgmts:{authenticationLevel=PktPrivacy}!root\MicrosoftIdentityIntegrationServer")

If err.number<>0 then 
    errorString = "Could not retrieve service object: "
    errorString = errorString & Err.Description
    ErrorHandler(errorString)
End If

queryString = "Select * From MIIS_ManagementAgent"

Set ManagementAgentSet = Service.ExecQuery(queryString)

If err.number <> 0 then
    errorString = "Could not retrieve management agent collection: " 
    errorString = errorString & Err.Description
    ErrorHandler(errorString)
End If 

If ManagementAgentSet.Count = 0 then
    statusString = "There are no management agents on this server."
    ErrorHandler(statusString)
End If

For Each ManagementAgent in ManagementAgentSet
    queryString = "Select * From MIIS_PasswordChangeHistorySource WHERE MaGuid = '"
    queryString = queryString & ManagementAgent.Guid & "'"
    
    Set changeHistories = Service.ExecQuery(queryString)

    If err.number <> 0 then
        errorString = "Could not retrieve password change history: " 
        errorString = errorString & Err.Description
        ErrorHandler(errorString)
    End If

    If changeHistories.Count = 0 then
        statusString = "There are no password change histories for the " 
        statusString = statusString & ManagementAgent.Name
        statusString = statusString & " management agent."
        WScript.Echo statusString
    Else

        For Each changeHistory in changeHistories
            statusString = "Change History for the "
            statusString = statusString & ManagementAgent.Name
            statusString = statusString & " management agent."
            WScript.Echo statusString
            WScript.Echo changeHistory.eventDetails
        Next
    End If
Next

Sub ErrorHandler (ErrorMessage)
    WScript.Echo ErrorMessage
    WScript.Quit(1)
End Sub

Search by Reference GUID

The following VBScript example shows how to retrieve the password change history for a specified reference GUID from the originating server. In this example, the reference GUID is supplied. You can obtain the reference GUID from the MIIS_PasswordChangeHistoryTarget Class class or the MIIS_PasswordChangeQueue Class class. You can pass the value to this script to track the password change history from the originating connected data source to the target data sources.

Option Explicit

On Error Resume Next

Const PktPrivacy = 6    ' Authentication level
Dim Service             ' Service object
Dim queryString         ' SQL Query string
Dim errorString         ' Error string
Dim statusString        ' Status string
Dim refGuid             ' Reference Guid string
Dim changeHistories     ' Change history collection
Dim changeHistory       ' Change history member

' In this example, the reference GUID is supplied.
' In practice, the reference GUID can be obtained from the
' MIIS_PasswordChangeHistoryTarget or the MIIS_PasswordChangeQueue
' classes and be passed to this script.

refGuid = "{B6F6FEB7-0EB7-45D9-B4CB-3B6B02CA9023}"

Set Service = GetObject("winmgmts:{authenticationLevel=PktPrivacy}!root\MicrosoftIdentityIntegrationServer")

If err.number<>0 then 
    errorString = "Could not retrieve service object: "
    errorString = errorString & Err.Description
    ErrorHandler(errorString)
End If
   
queryString = "Select * From MIIS_PasswordChangeHistorySource WHERE "
queryString = queryString & "ReferenceGuid = '"

queryString = queryString & refGuid & "'"

Set changeHistories = Service.ExecQuery(queryString)

If err.number <> 0 then
    errorString = "Could not retrieve password change history: " 
    errorString = errorString & Err.Description
    ErrorHandler(errorString)
End If

If changeHistories.Count = 0 then
    statusString = "There are no password change histories for the " 
    statusString = statusString & "reference Guid "
    statusString = statusString & refGuid & "."
    WScript.Echo statusString
Else
    For Each changeHistory in changeHistories
        statusString = "Change History for Reference Guid: "
        statusString = statusString & refGuid
        statusString = statusString & "."
        WScript.Echo statusString
        WScript.Echo changeHistory.eventDetails
    Next
End If

Sub ErrorHandler (ErrorMessage)
    WScript.Echo ErrorMessage
    WScript.Quit(1)
End Sub

See Also

Reference

MIIS_PasswordChangeHistorySource Class

Concepts

Password Synchronization
WMI Provider Overview
Using the WMI Provider
Password Management