[C#]做服务使用Process启动外部程序没窗体
这几天会到一个需要,要时时侦测文件生成,并上传到Server上,侦测文件生成使用的FileSystemWatch。但是时时运行遇到了问题,程序可能会人为退出或者意外终止,使用一个进程监控程序的监程,也有意外关掉的情况,想来想去,还是Windows服务比较可靠,只要开机就在运行,而且服务是系统高级应用,一般人不知道关闭。
一切都差多的时候,发现Windows服务调用外部程序(Process),程序竟然没有界面,只有进程,试了好多方法,原因是Win10为了安全,拿掉之前Win7&XP的交互式Windows服务,所以Win10下直接调用是不行的,在网上找到有大神写的Cjwdev.WindowsApi.dll,真的可以
在WinXP和Win2003环境中,安装服务后,右键单击服务“属性”-“登录”选项卡-选择“本地系统帐户”并勾选“允许服务与桌面交互”即可.
在Win7及以后的环境中,由于微软加强了权限管理,将此功能禁用,需要引用第三方dll,
Cjwdev.WindowsApi.dll下载路径:链接:http://pan.baidu.com/s/1c2xfJNE 密码:w4nf
public void AppStart(string appPath)
{
try
{ string appStartPath = appPath;
IntPtr userTokenHandle = IntPtr.Zero;
ApiDefinitions.WTSQueryUserToken(ApiDefinitions.WTSGetActiveConsoleSessionId(), ref userTokenHandle); ApiDefinitions.PROCESS_INFORMATION procInfo = new ApiDefinitions.PROCESS_INFORMATION();
ApiDefinitions.STARTUPINFO startInfo = new ApiDefinitions.STARTUPINFO();
startInfo.cb = (uint)Marshal.SizeOf(startInfo); ApiDefinitions.CreateProcessAsUser(
userTokenHandle,
appStartPath,
"",
IntPtr.Zero,
IntPtr.Zero,
false,
,
IntPtr.Zero,
null,
ref startInfo,
out procInfo); if (userTokenHandle != IntPtr.Zero)
ApiDefinitions.CloseHandle(userTokenHandle); int _currentAquariusProcessId = (int)procInfo.dwProcessId;
}
catch (Exception ex)
{
}
}
最近想写一个进程守护程序并把它做成服务,结果发现在服务中启动带窗体的应用程序,只有进程看不到窗体。
找了很多文章,最后选择了一个答案:
网上也有叫session0穿透的,具体的大家可以找找。
(我单独写的程序启动和服务都没有问题,但是当而二者放到一起就出现问题了)
下面我把我的程序启动代码粘出来给大家看一下,并把我找的几篇好一点的文章分享给大家。
static void Main(string[] args)
{
string appName = "QQ";//the path of the exe file
string appPath = @"C:\Program Files (x86)\Tencent\QQ\Bin\QQ.exe";//the path of the exe file
bool runFlag = false; Process[] myProcesses = Process.GetProcesses();
foreach (Process myProcess in myProcesses)
{
if (myProcess.ProcessName.CompareTo(appName) == )
{
runFlag = true;
}
} if (!runFlag) //如果程序没有启动
{
Process proc = new Process();
proc.StartInfo.FileName = appName;
proc.StartInfo.WorkingDirectory = Path.GetDirectoryName(appPath);
proc.Start(); }
else if (runFlag) //如果程序已经启动
{
Process[] myPro = Process.GetProcessesByName(appName);
myPro[].Kill(); //删除进程 Process proc = new Process();
proc.StartInfo.FileName = appName;
proc.StartInfo.WorkingDirectory = Path.GetDirectoryName(appPath);
proc.Start(); }
}
C#写windows服务:http://www.cnblogs.com/knowledgesea/p/3616127.htmlhttp://bbs.csdn.net/topics/380030333
C#做服务使用Process启动外部程序没窗体?:http://bbs.csdn.net/topics/380030333:
穿透Session 0 隔离(一):http://www.cnblogs.com/gnielee/archive/2010/04/07/session0-isolation-part1.html
PS:在win10下或者windows 2012R2及以上知道怎么用windows服务做守护进程的去那个告诉我一声,不胜感激!!!
MSDN:
C#通过Windows服务启动其他窗体程序 https://q.cnblogs.com/q/77666/
c#用服务实现开机自动启动程序
交互式 Windows 服务 (CSCreateProcessAsUserFromService)
[C#]做服务使用Process启动外部程序没窗体的更多相关文章
- 通过Process启动外部程序
#region Process //声明一个程序类 System.Diagnostics.Process Proc; try { //声明一个程序信息类 System.Diagnostics.Proc ...
- windows 服务启动外部程序
服务使用Process启动外部程序没窗体 在WinXP和Win2003环境中,安装服务后,右键单击服务“属性”-“登录”选项卡-选择“本地系统帐户”并勾选“允许服务与桌面交互”即可. 在Win7及以后 ...
- ZooKeeper单机服务端的启动源码阅读
程序的入口QuorumPeerMain public static void main(String[] args) { // QuorumPeerMain main = new QuorumPeer ...
- 批处理启动vm虚拟机服务 vm12启动无界面启动vm虚拟机系统 windows上如何操作服务 sc net启动关闭服务
windows(win10)批处理脚本 打开vm虚拟机的服务,并且开启无界面虚拟机 @echo off net start "vds" net start "VMAuth ...
- [C#.Net]启动外部程序的几种常用方法汇总
本文汇总了C#启动外部程序的几种常用方法,非常具有实用价值,主要包括如下几种方法: 1. 启动外部程序,不等待其退出. 2. 启动外部程序,等待其退出. 3. 启动外部程序,无限等待其退出. 4. 启 ...
- 使用Consul做服务发现的若干姿势
从2016年起就开始接触Consul,使用的主要目的就是做服务发现,后来逐步应用于生产环境,并总结了少许使用经验.最开始使用Consul的人不多,为了方便交流创建了一个QQ群,这两年微服务越来越火,使 ...
- Consul做服务发现
使用Consul做服务发现的若干姿势 https://www.cnblogs.com/bossma/p/9756809.html 从2016年起就开始接触Consul,使用的主要目的就是做服务发现,后 ...
- Netty服务端的启动源码分析
ServerBootstrap的构造: public class ServerBootstrap extends AbstractBootstrap<ServerBootstrap, Serve ...
- C#Process调用外部程序
前言 使用C#调用外部程序,一种是通过Process类,一种是通过命令行,本文主要说一下使用C#中的Process类调用外部程序的方式. 过程: 1. 创建Process对象 2. 配置启动选项(输入 ...
随机推荐
- Excel学习之图表创建
前言:由于工作的需要,现在需要恶补Excel知识,温故而知新,不记录下来自己的学习的点点滴滴怎么能行 Excel版本:2016 一.插入如下图所示的数据源: 1.勾选图表区域范围 2.选中区域范围后直 ...
- 五 shutil模块
高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length])将文件内容拷贝到另一个文件中 1 import shutil 2 3 shuti ...
- python websocket网页实时显示远程服务器日志信息
功能:用websocket技术,在运维工具的浏览器上实时显示远程服务器上的日志信息 一般我们在运维工具部署环境的时候,需要实时展现部署过程中的信息,或者在浏览器中实时显示程序日志给开发人员看.你还在用 ...
- PHP连接数据库(mysql)
前端链接后台,数据库几乎必不可少.所以本文总结了PHP链接数据库的常用方法步骤. 首先 链接数据库:mysqli_connect参数①主机地址 ②mysql用户名③nysql密码④选择连接的数据库⑤端 ...
- MYSQL中替换oracle中runum用法
一 . SELECT * FROM (SELECT A.*, rownum AS RN FROM (SELECT (@rownum := @rownum + 1) AS rownum, B.LL11, ...
- 支付宝小程序开发之与微信小程序不同的地方
前言: 本文仅汇总微信小程序移植支付宝小程序过程中遇到的一些不同的地方,详细请参考官方开发文档. 网络请求: 对于网络请求,基本上改动不大,也就支付宝小程序没有responseType属性及响应码字段 ...
- 【校招面试 之 C/C++】第32题 C++ 11新特性(三)之for关键字
1.for循环的一般写法: int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; for (int i = 0; i < 10; i++) cout ...
- sql2000三个表的级联删除
sql2000中三个表级联删除 create table a( id int primary key, Content varchar(50)) create table b( id ...
- java 编解码
decoder:解码--> 将文件内容转换为字符对象: encoder:编码-->将字符对象转换为字节或者字节数组: ASCII (American Standard for Infor ...
- JS编程题练习
JS编程题练习 1. 两个数组合并成一个数组排序返回 先依次比较两个数组,按照小的就传入新的数组.当这次比较完之后可能有一个数组的长度很长,留下一些数组,然后在新数组的末尾插入即可. function ...