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(...)
TaskCreationOptions.AttachedToParent需要父級任務附加到。 – Lev
@usr如果你讀了這個,你會找到所有問題的答案。應用程序沒有任何例外,但在描述的情況下,系統無法啓動該進程並通過CSRSS.exe的錯誤消息窗口告知該進程。不幸的是,我無法縮短這篇文章。 –