CreateProcessAsUser (advapi32)
Last changed: -87.186.76.92

.
Summary

C# Signature:

[DllImport("advapi32.dll", SetLastError=true, CharSet=CharSet.Unicode)]
static extern bool CreateProcessAsUser(
    IntPtr hToken,
    string lpApplicationName,
    string lpCommandLine,
    ref SECURITY_ATTRIBUTES lpProcessAttributes,
    ref SECURITY_ATTRIBUTES lpThreadAttributes,
    bool bInheritHandles,
    uint dwCreationFlags,
    IntPtr lpEnvironment,
    string lpCurrentDirectory,
    ref STARTUPINFO lpStartupInfo,
    out PROCESS_INFORMATION lpProcessInformation);

VB Signature :

Private Declare Auto Function CreateProcessAsUser Lib "advapi32" ( _
    ByVal hToken As IntPtr, _
    ByVal strApplicationName As String, _
    ByVal strCommandLine As String, _
    ByRef lpProcessAttributes as SECURITY_ATTRIBUTES, _
    ByRef lpThreadAttributes as SECURITY_ATTRIBUTES, _
    ByVal bInheritHandles as Boolean, _
    ByVal dwCreationFlags As Integer, _
    ByVal lpEnvironment As IntPtr, _
    ByVal lpCurrentDriectory As String, _
    ByRef lpStartupInfo As STARTUPINFO, _
    ByRef lpProcessInformation As PROCESS_INFORMATION) As Boolean

VB Signature:

<DllImport("Advapi32.dll", ExactSpelling:=False, SetLastError:=True, CharSet:=CharSet.Unicode)> _
Private Shared Function CreateProcessAsUser( _
                           ByVal hToken As IntPtr, _
                           ByVal lpApplicationName As String, _
                           <[In](), Out(), [Optional]()> ByVal lpCommandLine As StringBuilder, _
                           ByVal lpProcessAttributes As IntPtr, _
                           ByVal lpThreadAttributes As IntPtr, _
                           <MarshalAs(UnmanagedType.Bool)> ByVal bInheritHandles As Boolean, _
                           ByVal dwCreationFlags As Integer, _
                           ByVal lpEnvironment As IntPtr, _
                           ByVal lpCurrentDirectory As String, _
                           <[In]()> ByRef lpStartupInfo As StartupInfo, _
                           <Out()> ByRef lpProcessInformation As PROCESS_INFORMATION) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function

User-Defined Types:

SECURITY_ATTRIBUTES

PROCESS_INFORMATION

STARTUPINFO

LOGON_TYPE

LOGON_PROVIDER

CREATE_PROCESS_FLAGS

Notes:

Use StringBuilder for lpCommandLine parameter for unicode version of this function.

The Unicode version of this function, CreateProcessAsUserW, can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation.

Tips & Tricks:

Please add some!

C# Sample Code:

// Declare variables
PROCESS_INFORMATION pi;
STARTUPINFO si;
System.IntPtr hToken;

// Initialize structs
si.cb = Marshal.SizeOf(si);

// Get the user token
if (LogonUser(userPart, domainPart, password, LOGON_TYPE.LOGON32_LOGON_BATCH, LOGON_PROVIDER.LOGON32_PROVIDER_DEFAULT, hToken))
{
     // Create structs
     SECURITY_ATTRIBUTES saProcessAttributes = new SECURITY_ATTRIBUTES();
     SECURITY_ATTRIBUTES saThreadAttributes = new SECURITY_ATTRIBUTES();    

     // Now create the process as the user
     if (!CreateProcessAsUser(hToken, String.Empty, commandLine,
     null, saThreadAttributes, false, 0, IntPtr.Zero, 0, si, pi))
     {
     // Throw exception
     throw new Exception("Failed to CreateProcessAsUser");
     }
}

VB Sample Code:

Dim pi As PROCESS_INFORMATION
Dim si As STARTUPINFO
si.cb = Marshal.SizeOf(si)
Dim hToken as System.IntPtr
If LogonUser(userPart, domainPart, password, LOGON_TYPE.LOGON32_LOGON_BATCH, _
          LOGON_PROVIDER.LOGON32_PROVIDER_DEFAULT, hToken) Then

     Dim saProcessAttributes as SECURITY_ATTRIBUTES = new SECURITY_ATTRIBUTES
     Dim saThreadAttributes as SECURITY_ATTRIBUTES = new SECURITY_ATTRIBUTES  
     If Not CreateProcessAsUser(hToken, "", strCmdLine, Nothing, _
     saThreadAttributes, False, 0, IntPtr.Zero, 0, si, pi) Then

     Throw New Exception(Err.Description)
     End If
End If

Alternative Managed API:

Do you know one? Please contribute it!

Documentation