如何在Windows服务里面调用exe程序并显示出来
假设我有一个已写好的EXE (名称 A.EXE)需要WINDOWS服务启动的时候来启动A.EXE自己写了一个WINDOWS服务 服务也添加到woindwos上了
例如:
在WINDOWS服务的OnStart里面写了
System.Diagnostics.Process.Start("C:\\A.EXE");
但是启动windows服务后A.exe并没有调出来;
如何能让A.exe调出来 求高手解答 --------------------编程问答-------------------- 遇到同样的问题了。。楼主最后怎么解决的,求分享。。 --------------------编程问答-------------------- mark,时间在流逝啊,我也不会。 --------------------编程问答-------------------- "Windows服务"和"用户桌面程序"各自运行在不同的‘世界’下。由服务启动的程序,默认运行在‘Windows服务’的世界里,而不是用户桌面。程序是运行了,但用户看不见。
因此,这种Windows服务启动用户交互程序的设计,一般不是好的选择。 --------------------编程问答--------------------
是的,看资源管理器就可以看出差异,
服务后面的用户名是System。 --------------------编程问答-------------------- 但是 发现这个EXE文件并没有执行 --------------------编程问答-------------------- http://bbs.csdn.net/topics/390508459
调用方具备system权限时,最后面那方法可以改成
不过,服务中弹窗的确不算是好设计
public static bool CreateProcess(int sessionId, string appFullName, string args)--------------------编程问答-------------------- 用CMD去调用
{
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 Process_Information();
SecurityAttributes sa;
try
{
//获取指定会话的用户令牌,须具备System权限
sucess = WTSQueryUserToken(sessionId, out hToken);
if (!sucess)
{
//TraceWin32Error("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)SecurityImpersonationLevel.SecurityIdentification,
(int)TokenType.TokenPrimary,
ref hDupedToken
);
if (!sucess)
{
//TraceWin32Error("DuplicateTokenEx");
return false;
}
//利用复制的句柄在指定的会话中初始化运行环境
sucess = CreateEnvironmentBlock(out lpEnvironment, hDupedToken, false);
if (!sucess)
{
//TraceWin32Error("CreateEnvironmentBlock");
return false;
}
//在指定会话中开启进程
sucess = CreateProcessAsUser(
hDupedToken,
appFullName,
args,
ref sa, ref sa,
false, 0, IntPtr.Zero,
null,
ref si,
ref pi
);
if (!sucess)
{
//TraceWin32Error("CreateProcessAsUser");
}
}
finally
{
if (hDupedToken != IntPtr.Zero) CloseHandle(hDupedToken);
if (lpEnvironment != IntPtr.Zero) DestroyEnvironmentBlock(lpEnvironment);
if (pi.hProcess != IntPtr.Zero) CloseHandle(pi.hProcess);
if (pi.hThread != IntPtr.Zero) CloseHandle(pi.hThread);
}
return sucess;
}
补充:.NET技术 , C#