Skip to main content

PowerShell function for launching a process under alternate credentials, providing functionality, similar to runas.exe.

function Start-ProcessAsUser
{
    ##############################################################################
    ##
    ## Start-ProcessAsUser
    ##
    ## From Windows PowerShell Cookbook (O'Reilly)
    ## by Lee Holmes (http://www.leeholmes.com/guide)
    ##
    ##############################################################################

    <#

    .SYNOPSIS

    Launch a process under alternate credentials, providing functionality
    similar to runas.exe.

    .EXAMPLE

    PS > $file = Join-Path ([Environment]::GetFolderPath("System")) certmgr.msc
    PS > Start-ProcessAsUser Administrator mmc $file

    #>

    param(
        ## The credential to launch the process under
        $Credential = (Get-Credential),

        ## The process to start
        [Parameter(Mandatory = $true)]
        [string] $Process,

        ## Any arguments to pass to the process
        [string] $ArgumentList = ""
    )

    Set-StrictMode -Version 3

    ## Create a real credential if they supplied a username
    $credential = Get-Credential $credential

    ## Exit if they canceled out of the credential dialog
    if(-not ($credential -is "System.Management.Automation.PsCredential"))
    {
        return
    }

    ## Prepare the startup information (including username and password)
    $startInfo = New-Object Diagnostics.ProcessStartInfo
    $startInfo.Filename = $process
    $startInfo.Arguments = $argumentList

    ## If we're launching as ourselves, set the "runas" verb
    if(($credential.Username -eq "$ENV:Username") -or
        ($credential.Username -eq "\$ENV:Username"))
    {
        $startInfo.Verb = "runas"
    }
    else
    {
        $startInfo.UserName = $credential.Username
        $startInfo.Password = $credential.Password
        $startInfo.UseShellExecute = $false
    }

    ## Start the process
    [Diagnostics.Process]::Start($startInfo)
}