Private Commands/Set-eaRunAsRunspaceToken.ps1

Function Set-eaRunAsRunspaceToken {
    <#
    .SYNOPSIS
    Will make the current runspace run under a different token
     
    .DESCRIPTION
    Makes the current runspace thread run under a different token. Doesn't always filter through to all PowerShell commands though
     
    .PARAMETER Credential
    Credential you want the runspace to run under
     
    .PARAMETER LogonType
    Logon Type
     
    .PARAMETER LogonProvider
    Logon Provider
     
    .EXAMPLE
    Set-eaRunAsRunspaceToken -Credential $MyCred
     
    .NOTES
    .Author: Ryan Ephgrave
     
    #>

    Param(
        [pscredential]$Credential,
        [int]$LogonType = 9,
        [int]$LogonProvider = 0
    )
    $null = Add-Type -Namespace eaRunAs -Name RunAs -MemberDefinition @'
    [DllImport("advapi32.dll", SetLastError = true)]
    public static extern bool LogonUser(string user, string domain, string password, int logonType, int logonProvider, out IntPtr token);
  
    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern bool CloseHandle(IntPtr handle);
'@
  -ErrorAction SilentlyContinue -Debug:$false
    $VerboseMessage =  "UserName: $($Credential.GetNetworkCredential().UserName)`n"
    $VerboseMessage += "Domain: $($Credential.GetNetworkCredential().Domain)`n"
    $VerboseMessage += "LogonType: $($LogonType)`n"
    Write-Verbose -Message $VerboseMessage
    [System.IntPtr]$phToken = 0
    $WasSuccessful = [eaRunAs.RunAs]::LogonUser(
        $Credential.GetNetworkCredential().UserName,
        $Credential.GetNetworkCredential().Domain,
        $Credential.GetNetworkCredential().Password,
        $LogonType,
        $LogonProvider,
        [ref]$phToken
    )
    if($WasSuccessful){
        [System.Security.Principal.WindowsIdentity]::Impersonate($phToken)
        [void][eaRunAs.RunAs]::CloseHandle($phToken) 
    }
    else {
        throw "Could not get token!"
    }
}