none
CreateProcessAsUser

    Question

  • Hi Guys,


    I am trying to accomplish a windows service which creates a process using createprocessasuser.I went through the internet for 2 months but never got a working code in windows 2000.Can anybody give me a working solution that run an interactive process in console(winsta0/default).


    Thanks in advance...
    Monday, September 22, 2008 1:11 PM

All replies

  • Thanks for your reply


    This is the code I am using.But unfortunately its getting a windows error Application failed to initialize.When we commenting the code Si.Desktop="winsta0/default"  then we haven't any error and we can see the process started in Task Manager but cant see window in this desktop (Its Started in another desktop .I want to start in console).What I did wrong ? Whats wrong with this code?   And I am using windows 2000 so cant use WTSGetActiveConsoleSessionId()  and WTSQueryUserToken().Can anybody help me?

     Private Function SetCurProcessPrivileges() As Boolean 
            Try 
                'Dim Id As IntPtr = GetCurrentProcessId() 
                'Dim Proc As ProcessProcess = Process.GetCurrentProcess 
                Dim ProcHandle As IntPtr '= OpenProcess(PROCESS_QUERY_INFORMATION, False, GetCurrentProcessId) 
                ProcHandle = Process.GetCurrentProcess.Handle 
                Dim ProcTocken As IntPtrIntPtr = IntPtr.Zero 
                Dim TempID As LUID 
                Dim TockPriv As TOKEN_PRIVILEGES 
                Dim tkpNewButIgnored As TOKEN_PRIVILEGES 
                Dim NewTkLen As Int32 
                ''Pr.Handle=A handle to the process whose access token is opened. The process must have the PROCESS_QUERY_INFORMATION access permission. 
                Result = OpenProcessToken(ProcHandle, (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), ProcTocken) 
                If Result = False Then 
                    Dim Myerror As Integer = Marshal.GetLastWin32Error 
                    Dim message As StringString = String.Format(" Error: {0}", Myerror) 
                    System.Diagnostics.EventLog.WriteEntry("Test Service[OpenProcessToken]", message, EventLogEntryType.Error) 
                End If 
     
                Result = LookupPrivilegeValue("", "SeAssignPrimaryTokenPrivilege", TempID) 
                If Result = False Then 
                    Dim Myerror As Integer = Marshal.GetLastWin32Error 
                    Dim message As StringString = String.Format(" Error: {0}", Myerror) 
                    System.Diagnostics.EventLog.WriteEntry("Test Service[LookupPrivilegeValue1]", message, EventLogEntryType.Error) 
                End If 
                TockPriv.TheLuid = TempID 
                TockPriv.Attributes = SE_PRIVILEGE_ENABLED 
                TockPriv.PrivilegeCount = 1 
                NewTkLen = Len(tkpNewButIgnored) 
                Result = AdjustTokenPrivileges(ProcTocken, False, TockPriv, Len(TockPriv), tkpNewButIgnored, NewTkLen) 
                If Result = False Then 
                    Dim Myerror As Integer = Marshal.GetLastWin32Error 
                    Dim message As StringString = String.Format(" Error: {0}", Myerror) 
                    System.Diagnostics.EventLog.WriteEntry("Test Service[AdjustTokenPrivileges1]", message, EventLogEntryType.Error) 
                End If 
                tkpNewButIgnored = Nothing 
                TempID = Nothing 
                TockPriv = Nothing 
                Result = LookupPrivilegeValue("", "SeIncreaseQuotaPrivilege", TempID) 
                If Result = False Then 
                    Dim Myerror As Integer = Marshal.GetLastWin32Error 
                    Dim message As StringString = String.Format(" Error: {0}", Myerror) 
                    System.Diagnostics.EventLog.WriteEntry("Test Service[LookupPrivilegeValue2]", message, EventLogEntryType.Error) 
                End If 
                TockPriv.TheLuid = TempID 
                TockPriv.Attributes = SE_PRIVILEGE_ENABLED 
                TockPriv.PrivilegeCount = 1 
                NewTkLen = Len(TockPriv) 
                Result = AdjustTokenPrivileges(ProcTocken, False, TockPriv, Len(TockPriv), tkpNewButIgnored, NewTkLen) 
                If Result = False Then 
                    Dim Myerror As Integer = Marshal.GetLastWin32Error 
                    Dim message As StringString = String.Format(" Error: {0}", Myerror) 
                    System.Diagnostics.EventLog.WriteEntry("Test Service[AdjustTokenPrivileges2]", message, EventLogEntryType.Error) 
                End If 
                tkpNewButIgnored = Nothing 
                TempID = Nothing 
                TockPriv = Nothing 
                Result = LookupPrivilegeValue("", "SeTcbPrivilege", TempID) 
                If Result = False Then 
                    Dim Myerror As Integer = Marshal.GetLastWin32Error 
                    Dim message As StringString = String.Format(" Error: {0}", Myerror) 
                    System.Diagnostics.EventLog.WriteEntry("Test Service[LookupPrivilegeValue3]", message, EventLogEntryType.Error) 
                End If 
                TockPriv.TheLuid = TempID 
                TockPriv.Attributes = SE_PRIVILEGE_ENABLED 
                TockPriv.PrivilegeCount = 1 
                NewTkLen = Len(TockPriv) 
                Result = AdjustTokenPrivileges(ProcTocken, False, TockPriv, Len(TockPriv), tkpNewButIgnored, NewTkLen) 
                If Result = False Then 
                    Dim Myerror As Integer = Marshal.GetLastWin32Error 
                    Dim message As StringString = String.Format(" Error: {0}", Myerror) 
                    System.Diagnostics.EventLog.WriteEntry("Test Service[AdjustTokenPrivileges3]", message, EventLogEntryType.Error) 
                End If 
            Catch ex As Exception 
                System.Diagnostics.EventLog.WriteEntry("Test Service[SetCurProcessPrivileges]", ex.Message, EventLogEntryType.Error) 
            End Try 
        End Function 
     
     Private Function LaunchProcessAsUser(ByVal cmdLine As String, ByVal token As IntPtr, ByVal envBlock As IntPtr) As Boolean 
            Try 
                
                Dim pi As PROCESS_INFORMATION = New PROCESS_INFORMATION 
                Dim saProcess As SECURITY_ATTRIBUTES = New SECURITY_ATTRIBUTES 
                Dim saThread As SECURITY_ATTRIBUTES = New SECURITY_ATTRIBUTES 
                saProcess.nLength = Convert.ToUInt32(Marshal.SizeOf(saProcess)) 
                saThread.nLength = Convert.ToUInt32(Marshal.SizeOf(saThread)) 
                Dim si As STARTUPINFO = New STARTUPINFO 
                si.cb = Convert.ToUInt32(Marshal.SizeOf(si)) 
                si.lpDesktop = "winsta0\default" 
                si.dwFlags = Convert.ToUInt32(STARTF_USESHOWWINDOW Or STARTF_FORCEONFEEDBACK) 
                si.wShowWindow = SW_SHOW 
                Result = CreateProcessAsUser(token, Nothing, cmdLine, saProcess, saThread, True, CREATE_UNICODE_ENVIRONMENT, envBlock, Nothing, si, pi) 
                If Result = False Then 
                    Dim Myerror As Integer = Marshal.GetLastWin32Error 
                    Dim message As StringString = String.Format(" Error: {0}", Myerror) 
                    System.Diagnostics.EventLog.WriteEntry("Test Service[CreateProcessAsUser]", message, EventLogEntryType.Error) 
                End If 
                Result = DestroyEnvironmentBlock(envBlock) 
                If Result = False Then 
                    Dim Myerror As Integer = Marshal.GetLastWin32Error 
                    Dim message As StringString = String.Format(" Error: {0}", Myerror) 
                    System.Diagnostics.EventLog.WriteEntry("Test Service[DestroyEnvironmentBlock]", message, EventLogEntryType.Error) 
                End If 
                Return Result 
            Catch ex As Exception 
                System.Diagnostics.EventLog.WriteEntry("Test Service[LaunchProcessAsUser]", ex.Message, EventLogEntryType.Error) 
            End Try 
        End Function 
     
     Private Function GetEnvironmentBlock(ByVal token As IntPtr) As IntPtr 
            Dim envBlock As IntPtrIntPtr = IntPtr.Zero 
            Result = CreateEnvironmentBlock(envBlock, token, False) 
            If Result = False Then 
                Dim message As String = " Error: " & Marshal.GetLastWin32Error 
                System.Diagnostics.EventLog.WriteEntry("Test Service[CreateEnvironmentBlock]", message, EventLogEntryType.Error) 
            End If 
            Return envBlock 
        End Function 
     Private Function GetPrimaryUserTocken() As IntPtr 
            Dim CurrTocken As IntPtr = System.Security.Principal.WindowsIdentity.GetCurrent.Token 
            'Result = LogonUser("fasalur_dt", "SMART", "F27s9r1", LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, CurrTocken) 
            'If Result = False Then 
            '    Dim Myerror As Integer = Marshal.GetLastWin32Error 
            '    Dim message As StringString = String.Format(" Error: {0}", Myerror) 
            '    System.Diagnostics.EventLog.WriteEntry("Test Service[LogonUser]", message, EventLogEntryType.Error) 
            'End If 
            Dim DupeTocken As IntPtr 
            Dim SecAtt As SECURITY_ATTRIBUTES = New SECURITY_ATTRIBUTES 
            SecAtt.nLength = Convert.ToUInt32(Marshal.SizeOf(SecAtt)) 
            Result = DuplicateTokenEx(CurrTocken, Convert.ToUInt32(TOKEN_ASSIGN_PRIMARY Or TOKEN_DUPLICATE Or TOKEN_QUERY), SecAtt, CType(SECURITY_IMPERSONATION_LEVEL.SecurityIdentification, Integer), CType(TOKEN_TYPE.TokenPrimary, Integer), DupeTocken) 
            If Result = False Then 
                Dim Myerror As Integer = Marshal.GetLastWin32Error 
                Dim message As StringString = String.Format(" Error: {0}", Myerror) 
                System.Diagnostics.EventLog.WriteEntry("Test Service[DuplicateTokenEx]", message, EventLogEntryType.Error) 
            End If 
            Return DupeTocken 
        End Function 
     
     Protected Overrides Sub OnStart(ByVal args() As String) 
     
     SetCurProcessPrivileges() 
    Dim User as IntPtr=GetPrimaryUserTocken() 
    LaunchProcessAsUser("NOTEPAD.exe", User, GetEnvironmentBlock(User)) 
     
    end sub 



    • Edited by fazalbhi Tuesday, September 23, 2008 4:03 AM editing
    Tuesday, September 23, 2008 3:55 AM