#  RunAs.pl
#  Example 7.14:
#  ----------------------------------------
#  From "Win32 Perl Scripting: Administrators Handbook" by Dave Roth
#  Published by New Riders Publishing.
#  ISBN # 1-57870-215-1
#
#  This script demonstrates how a user can be impersonated and
#  a new process created as the impersonated user.
#
print "From the book 'Win32 Perl Scripting: The Administrator's Handbook' by Dave Roth\n\n";


use Win32::AdminMisc;
my( $Domain, $User ) = ( ( shift @ARGV ) =~ /((.*)\\)?(.*?)$/ )[1..2]; 
$Password = shift @ARGV;
$Process = join( " ", @ARGV );
print "\nStarting \"$Process\" as $User in the \U$Domain\E domain...\n\n";
$Result = Win32::AdminMisc::LogonAsUser( $Domain,
                                         $User,
                                         $Password,
                                         LOGON32_LOGON_INTERACTIVE );
if( $Result )
{
    $LogonUser = Win32::AdminMisc::GetLogonName();
    print "Successfully logged on as $LogonUser.\n";
    $Result = Win32::AdminMisc::CreateProcessAsUser(
                                $Process,
                                "Flags"  => CREATE_NEW_CONSOLE,
                                "XSize"  => 640,
                                "YSize"  => 400,
                                "X"      => 200,
                                "Y"      => 175,
                                "XBuffer"=> 80,
                                "YBuffer"=> 175,
                                "Show"   => SW_MAXIMIZE,
                                "Title"  => "\u$User\'s $Process program",
                                "Fill"   => BACKGROUND_BLUE    |
                                            FOREGROUND_RED     |
                                            FOREGROUND_BLUE    |
                                            FOREGROUND_GREEN |
                                            FOREGROUND_INTENSITY );
    if( $Result )
    {
        print "Successful! The new processes PID is $Result.\n";
    }
    else
    {
        print "Failed.\n\tError: ", Error(), "\n";
    }
}
else
{
    print "Failed to logon.\n\tError: ", Error(), "\n";
}

sub Error
{
    return( Win32::FormatMessage( Win32::AdminMisc::GetError() ) );
}
