CreateProcessAsUser (advapi32)
Last changed: -87.186.76.92

.
Summary

C# Signature:

[DllImport("advapi32.dll", SetLastError=true, CharSet=CharSet.Auto)]
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

User-Defined Types:

SECURITY_ATTRIBUTES

PROCESS_INFORMATION

STARTUPINFO

LOGON_TYPE

LOGON_PROVIDER

CREATE_PROCESS_FLAGS

Notes:

None.

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