Transforms/admpwd.e.pwdhistory.ps1

[CmdletBinding()]
param (
    [Parameter()]
    [Switch]
    $FullLoad
)

if($FullLoad)
{
    Add-Type -TypeDefinition @'
using System;
using System.Collections.Generic;
 
public class AdmPwdPasswordHistory
{
    public DateTime ValidSince {get; set;}
    public uint EncryptionKeyId {get; set;}
    public string PasswordData {get; private set;}
 
    public AdmPwdPasswordHistory(string rawValue)
    {
        string[] data = rawValue.Split(':');
        switch (data.Length)
        {
            case 3:
                //timestamp + keyID + encrypted Pwd
                ValidSince = DateTime.ParseExact(data[0].Replace(".0Z", ""), "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AssumeUniversal | System.Globalization.DateTimeStyles.AdjustToUniversal);
                EncryptionKeyId = UInt32.Parse(data[1].Trim());
                PasswordData = data[2].Trim();
                break;
            case 2:
                //timestamp + pwd
                ValidSince = DateTime.ParseExact(data[0].Replace(".0Z", ""), "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AssumeUniversal | System.Globalization.DateTimeStyles.AdjustToUniversal);
                EncryptionKeyId = 0;
                PasswordData = data[1].Trim();
                break;
            case 1:
                //just pwd
                ValidSince = DateTime.MinValue;
                EncryptionKeyId = 0;
                PasswordData = data[0];
                break;
        }
    }
 
    public override string ToString()
    {
        if(ValidSince==DateTime.MinValue)
            return PasswordData;
        if(EncryptionKeyId==0)
            return string.Format("{0}.0Z: {1}", ValidSince.ToUniversalTime().ToString("yyyyMMddHHmmss"), PasswordData);
 
        return string.Format("{0}.0Z: {1}: {2}", ValidSince.ToUniversalTime().ToString("yyyyMMddHHmmss"), EncryptionKeyId, PasswordData);
    }
}
'@

}

#add attributes that can be used with this transform
$SupportedAttributes = @('ms-Mcs-AdmPwdHistory')

# This is mandatory definition of transform that is expected by transform architecture
$codeBlock= New-LdapAttributeTransformDefinition -SupportedAttributes $SupportedAttributes

$codeBlock.OnLoad = { 
    param(
    [string[]]$Values
    )
    Process
    {
        foreach($Value in $Values)
        {
            try {
                New-Object AdmPwdPasswordHistory($Value)
            }
            catch {
                throw;
            }
        }
    }
}
$codeBlock.OnSave = { 
    param(
    [AdmPwdPasswordHistory[]]$Values
    )
    
    Process
    {
        foreach($Value in $Values)
        {
            $Value.ToString();
        }
    }
}
$codeBlock