Transforms/securityIdentifier.ps1

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

if($FullLoad)
{
Add-Type @'
    using System;
    using System.Text;
 
    public static class SecurityIdentifierExtensions
    {
        public static string ToLdapSearchableString(this System.Security.Principal.SecurityIdentifier sid)
        {
            StringBuilder sb = new StringBuilder();
            var bytes = new byte[sid.BinaryLength];
            sid.GetBinaryForm(bytes, 0);
            foreach(var v in bytes)
            {
                sb.Append("\\");
                sb.Append(v.ToString("X2"));
            }
            return sb.ToString();
        }
    }
'@


}
$codeBlock= New-LdapAttributeTransformDefinition -SupportedAttributes @('objectSid','tokenGroups','tokenGroupsGlobalAndUniversal','tokenGroupsNoGCAcceptable','sidHistory') -BinaryInput

$codeBlock.OnLoad = { 
    param(
    [byte[][]]$Values
    )
    Process
    {
        foreach($Value in $Values)
        {
            New-Object System.Security.Principal.SecurityIdentifier($Value,0)
        }
    }
}
$codeBlock.OnSave = { 
    param(
    [system.security.principal.securityidentifier[]]$Values
    )
    
    Process
    {
        foreach($sid in $Values)
        {
            $retVal=new-object system.byte[]($sid.BinaryLength)
            $sid.GetBinaryForm($retVal,0)
            ,($retVal)
        }
    }
}
$codeBlock