2014-03-06 14 views
0

我有嘗試創建一個進程這樣一個控制檯應用程序:爲什麼我必須創建一個單獨的任務才能在此處運行進程?

public static void Main(string[] args) 
{ 
    const string path = @"C:\Windows\system32\notepad.exe"; 
    const string param = ""; 

    Task.Factory.StartNew(() => 
          { 
           Process pp = CreateProcessAsUser(path, param); 
           pp.WaitForExit(); 
          }, 
          TaskCreationOptions.AttachedToParent | TaskCreationOptions.LongRunning); 

    Console.ReadLine(); 
} 

如果我運行它CSRSS.EXE顯示一個錯誤信息的窗口:「該應用程序無法正常啓動(0xc0000142)」 。如果我將其更改爲以下代碼,則一切正常:

Task.Factory.StartNew(() => 
         { 
          Task task = Task.Factory.StartNew(() => 
                   { 
                    Process pp = CreateProcessAsUser(path, param); 
                    pp.WaitForExit(); 
                   }); 
           task.Wait(); 
          }, 
          TaskCreationOptions.AttachedToParent | TaskCreationOptions.LongRunning); 

您有什麼想法嗎?

這裏是CreateProcessAsUser代碼:

public static Process CreateProcessAsUser(string filename, string args) 
{ 
    IntPtr hToken = WindowsIdentity.GetCurrent().Token; 
    IntPtr hDupedToken = IntPtr.Zero; 

    ProcessInformation pi = new ProcessInformation(); 
    SecurityAttributes sa = new SecurityAttributes(); 
    sa.Length = Marshal.SizeOf(sa); 

    DuplicateTokenEx(hToken, 
        genericAllAccess, 
        ref sa, 
        (int)SecurityImpersonationLevel.SecurityIdentification, 
        (int)TokenType.TokenPrimary, 
        ref hDupedToken); 

    STARTUPINFO si = new STARTUPINFO(); 
    si.cb = Marshal.SizeOf(si); 
    si.lpDesktop = string.Empty; 

    string path = Path.GetFullPath(filename); 

    using (WindowsIdentity.Impersonate(IntPtr.Zero)) 
    { 
     CreateProcessAsUser(hDupedToken, 
          path, 
          string.Format("\"{0}\" {1}", filename.Replace("\"", "\"\""), args), 
          ref sa, 
          ref sa, 
          false, 
          0, 
          IntPtr.Zero, 
          @".\", 
          ref si, 
          ref pi); 
    } 

    return Process.GetProcessById(pi.dwProcessID); 
} 

[DllImport("advapi32.dll", EntryPoint = "CreateProcessAsUser", SetLastError = true, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] 
private static extern bool CreateProcessAsUser(...) 
+1

TaskCreationOptions.AttachedToParent需要父級任務附加到。 – Lev

+0

@usr如果你讀了這個,你會找到所有問題的答案。應用程序沒有任何例外,但在描述的情況下,系統無法啓動該進程並通過CSRSS.exe的錯誤消息窗口告知該進程。不幸的是,我無法縮短這篇文章。 –

回答

1

我耳光this在一起,試圖重現你的錯誤,但它正常工作與兩個通話。

相關問題