关于windows进程问题? C# .NET 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Process.Start可以啊,你看看你的那个exe能直接双击打开看到gui吗?http://msdn.microsoft.com/zh-cn/library/53ezey2s.aspx 正常情况下Process 类可以直接调用的,有可能是其他地方的问题 这个是你的exe的问题吧什么exe 比如: Process.Start("explorer.exe", "http://www.baidu.com"); 这样就可以直接打开一个浏览器并且导航到百度首页。 不行的,根本不是一个SESSION,UI不可能出现的。可以考虑随用户登录时自动启动一个无UI的程序来做这件事。 Process.Start这个方法在普通窗体应用上是可以实现打开别一个exe 程序的窗体的,但在window服务里无法show出窗体,只能启动了exe程序的进程! 实际上windows service都可以在没有用户登录的情况下工作,你让它执行的程序显示在哪里呢? Process.Start这个方法在普通窗体应用上是可以实现打开别一个exe 程序的窗体的,但在window服务里无法show出窗体,只能启动了exe程序的进程!晕,答题太快,没注意你是windows service程序。http://www.cnblogs.com/furenjun/archive/2009/05/14/windowsservice.html 对的根本不是一个session 所以UI没出现,只是后台进程启动了,请问随用户登录时启动一个无UI的程序来做这事?是什么意思另外我之所以要用服务来启动exe是因为 exe设置在自动启动里,要用户登录了桌面才能显示窗体所以我想在用户没有登录的情况下就把窗体给启动,或者说我在服务里看见那窗体进程死了,我得把它启动起来 无UI的后台进程要么是服务要么是控制台还有其它的什么无UI的进程吗?你是不是想说启动一个线程,线程再去启动那应用程序 呵呵,一个普通的WIN FORM程序,可以ShowWindow(SW_HIDE)也可以在启动时指定无UI的 ProcessStartInfo ps = new ProcessStartInfo(); ps.CreateNoWindow = true; ps.UseShellExecute = false; ps.LoadUserProfile = true; ps.WindowStyle = ProcessWindowStyle.Hidden; Process.Start(ps); 问题是你这个无UI的程序被system用户启动了,再在这个无UI的程序里能启动起带窗体的吗?我试一试先 前提:在服务的属性中勾选“允许与用户桌面交互”(可以用注册表或者WMI)//写在服务的安装类中 protected override void OnCommitted(IDictionary savedState) { base.OnCommitted(savedState); try { base.OnCommitted(savedState); using (ManagementObject wmiService = new ManagementObject(string.Format("Win32_Service.Name='{0}'", serviceName))) { using (ManagementBaseObject changeMethod = wmiService.GetMethodParameters("Change")) { changeMethod["DesktopInteract"] = true; using (ManagementBaseObject OutParam = wmiService.InvokeMethod("Change", changeMethod, null)) { } } } //安装后由命令行启动,不需要自启动 //StartService(this.serviceInstaller.ServiceName, 2); } catch //(Exception exp) { //WriteEventLog(exp); } }在此前提下,Process.Start在XP系统的第一个登陆的用户下可以直接弹出窗口在Vista以上系统均不行(会弹出警告并且导致服务被挂起直至用户响应) 不过也不是完全不可以,对于System服务是完全可以的。不过不推荐参考 http://bbs.csdn.net/topics/390508459最后那个方法小改下,先用API查,再用explore查,双保险public static bool CreateProcess(int sessionId, string appFullName, string args) { if (!System.IO.File.Exists(appFullName)) { throw new System.IO.FileNotFoundException(appFullName); } bool sucess = false; IntPtr hToken = IntPtr.Zero, hDupedToken = IntPtr.Zero, lpEnvironment = IntPtr.Zero; Process_Information pi = new Mapper.Process_Information(); SecurityAttributes sa; try { //获取指定会话的用户令牌,须具备System权限 sucess = WTSQueryUserToken(sessionId, out hToken); if(!sucess) { //服务程序中,获取指定会话的桌面进程 var explorer = Process.GetProcesses().FirstOrDefault(p => p.SessionId == sessionId && string.Equals(p.ProcessName, Setting.ExplorerProcess, StringComparison.OrdinalIgnoreCase)); if (explorer == null) { return false; } sucess = OpenProcessToken(explorer.Handle, TokenAccessLevels.AllAccess, ref hToken); if (!sucess) { TraceWin32Error("CreateProcessAs Session" + sessionId.ToString(), "WTSQueryUserToken"); return false; } } //复制桌面进程的句柄 sa = new SecurityAttributes(); sa.Length = Marshal.SizeOf(sa); var si = new StartUpInfo(); si.cb = Marshal.SizeOf(si); sucess = DuplicateTokenEx( hToken, GENERIC_ALL_ACCESS, ref sa, (int)Mapper.SecurityImpersonationLevel.SecurityIdentification, (int)Mapper.TokenType.TokenPrimary, ref hDupedToken ); if (!sucess) { TraceWin32Error("CreateProcessAs Session" + sessionId.ToString(), "DuplicateTokenEx"); return false; } //利用复制的句柄在指定的会话中初始化运行环境 sucess = CreateEnvironmentBlock(out lpEnvironment, hDupedToken, false); if (!sucess) { TraceWin32Error("CreateProcessAs Session" + sessionId.ToString(), "CreateEnvironmentBlock"); return false; } //在指定会话中开启进程 if (!string.IsNullOrEmpty(args)) { args = string.Format("\"{0}\" {1}", appFullName, args); appFullName = null; } sucess = CreateProcessAsUser( hDupedToken, appFullName, args, ref sa, ref sa, false, 0, IntPtr.Zero, null, ref si, ref pi ); if (!sucess) { TraceWin32Error("CreateProcessAs Session" + sessionId.ToString(), "CreateProcessAsUser"); } return sucess; } catch (Exception exp) { TraceWin32Error("CreateProcessAs Session" + sessionId.ToString(), exp.Message); return false; } finally { if (hDupedToken != IntPtr.Zero) CloseHandle(hDupedToken); if (lpEnvironment != IntPtr.Zero) DestroyEnvironmentBlock(lpEnvironment); if (pi.hProcess != INVALID_HANDLE_VALUE) Mapper.CloseHandle(pi.hProcess); if (pi.hThread != INVALID_HANDLE_VALUE) Mapper.CloseHandle(pi.hThread); }//调用int sessionId = WTSGetActiveConsoleSessionId();CreateProcess(sessionId, @"D:\abc.exe", "参数列表") PsExechttp://technet.microsoft.com/en-us/sysinternals/bb897553后台运行这个批处理脚本 path\psexec.exe \\cn -d -i console SESSION ID -s xxxx C#问题 数据改变事件? 设计一个简单的 应用程序服务器 称重,谁没称过,可是未必你会知道怎么做? 请帮我看看进程可以这样重启吗 如何获取select里边的值2 winform上DataGrid设置固定行或者固定列的问题? 如何得到DataGrid在页面上的Html代码 datagrid问题! 请问.pdg是什么格式,需要什么样的工具打开? C# 时间对比 aspxgridview里chekbox取值问题
什么exe
Process.Start这个方法在普通窗体应用上是可以实现打开别一个exe 程序的窗体的,但在window服务里
无法show出窗体,只能启动了exe程序的进程!
Process.Start这个方法在普通窗体应用上是可以实现打开别一个exe 程序的窗体的,但在window服务里
无法show出窗体,只能启动了exe程序的进程!
晕,答题太快,没注意你是windows service程序。http://www.cnblogs.com/furenjun/archive/2009/05/14/windowsservice.html
对的根本不是一个session 所以UI没出现,只是后台进程启动了,
请问随用户登录时启动一个无UI的程序来做这事?是什么意思另外我之所以要用服务来启动exe是因为 exe设置在自动启动里,要用户登录了桌面才能显示窗体
所以我想在用户没有登录的情况下就把窗体给启动,或者说我在服务里看见那窗体进程死了,我得把它启动起来
你是不是想说启动一个线程,线程再去启动那应用程序
ProcessStartInfo ps = new ProcessStartInfo();
ps.CreateNoWindow = true;
ps.UseShellExecute = false;
ps.LoadUserProfile = true;
ps.WindowStyle = ProcessWindowStyle.Hidden;
Process.Start(ps);
问题是你这个无UI的程序被system用户启动了,再在这个无UI的程序里能启动起带窗体的吗?
我试一试先
//写在服务的安装类中 protected override void OnCommitted(IDictionary savedState)
{
base.OnCommitted(savedState);
try
{
base.OnCommitted(savedState);
using (ManagementObject wmiService = new ManagementObject(string.Format("Win32_Service.Name='{0}'", serviceName)))
{
using (ManagementBaseObject changeMethod = wmiService.GetMethodParameters("Change"))
{
changeMethod["DesktopInteract"] = true;
using (ManagementBaseObject OutParam = wmiService.InvokeMethod("Change", changeMethod, null))
{ }
}
}
//安装后由命令行启动,不需要自启动
//StartService(this.serviceInstaller.ServiceName, 2);
}
catch //(Exception exp)
{
//WriteEventLog(exp);
}
}在此前提下,Process.Start在XP系统的第一个登陆的用户下可以直接弹出窗口
在Vista以上系统均不行(会弹出警告并且导致服务被挂起直至用户响应)
参考 http://bbs.csdn.net/topics/390508459
最后那个方法小改下,先用API查,再用explore查,双保险public static bool CreateProcess(int sessionId, string appFullName, string args)
{
if (!System.IO.File.Exists(appFullName))
{
throw new System.IO.FileNotFoundException(appFullName);
}
bool sucess = false;
IntPtr hToken = IntPtr.Zero,
hDupedToken = IntPtr.Zero,
lpEnvironment = IntPtr.Zero;
Process_Information pi = new Mapper.Process_Information();
SecurityAttributes sa;
try
{
//获取指定会话的用户令牌,须具备System权限
sucess = WTSQueryUserToken(sessionId, out hToken);
if(!sucess)
{
//服务程序中,获取指定会话的桌面进程
var explorer = Process.GetProcesses().FirstOrDefault(p => p.SessionId == sessionId && string.Equals(p.ProcessName, Setting.ExplorerProcess, StringComparison.OrdinalIgnoreCase));
if (explorer == null)
{
return false;
}
sucess = OpenProcessToken(explorer.Handle, TokenAccessLevels.AllAccess, ref hToken);
if (!sucess)
{
TraceWin32Error("CreateProcessAs Session" + sessionId.ToString(), "WTSQueryUserToken");
return false;
}
}
//复制桌面进程的句柄
sa = new SecurityAttributes();
sa.Length = Marshal.SizeOf(sa);
var si = new StartUpInfo();
si.cb = Marshal.SizeOf(si);
sucess = DuplicateTokenEx(
hToken,
GENERIC_ALL_ACCESS,
ref sa,
(int)Mapper.SecurityImpersonationLevel.SecurityIdentification,
(int)Mapper.TokenType.TokenPrimary,
ref hDupedToken
);
if (!sucess)
{
TraceWin32Error("CreateProcessAs Session" + sessionId.ToString(), "DuplicateTokenEx");
return false;
}
//利用复制的句柄在指定的会话中初始化运行环境
sucess = CreateEnvironmentBlock(out lpEnvironment, hDupedToken, false);
if (!sucess)
{
TraceWin32Error("CreateProcessAs Session" + sessionId.ToString(), "CreateEnvironmentBlock");
return false;
}
//在指定会话中开启进程
if (!string.IsNullOrEmpty(args))
{
args = string.Format("\"{0}\" {1}", appFullName, args);
appFullName = null;
}
sucess = CreateProcessAsUser(
hDupedToken,
appFullName,
args,
ref sa, ref sa,
false, 0, IntPtr.Zero,
null,
ref si,
ref pi
);
if (!sucess)
{
TraceWin32Error("CreateProcessAs Session" + sessionId.ToString(), "CreateProcessAsUser");
}
return sucess;
}
catch (Exception exp)
{
TraceWin32Error("CreateProcessAs Session" + sessionId.ToString(), exp.Message);
return false;
}
finally
{
if (hDupedToken != IntPtr.Zero) CloseHandle(hDupedToken);
if (lpEnvironment != IntPtr.Zero) DestroyEnvironmentBlock(lpEnvironment);
if (pi.hProcess != INVALID_HANDLE_VALUE) Mapper.CloseHandle(pi.hProcess);
if (pi.hThread != INVALID_HANDLE_VALUE) Mapper.CloseHandle(pi.hThread);
}//调用
int sessionId = WTSGetActiveConsoleSessionId();
CreateProcess(sessionId, @"D:\abc.exe", "参数列表")
http://technet.microsoft.com/en-us/sysinternals/bb897553后台运行这个批处理脚本 path\psexec.exe \\cn -d -i console SESSION ID -s xxxx