C#编写WINNT服务,随便解决安卓开发遇到的5037被众多程序无节操占用的问题
需求分析:
最近重新开始学习安卓开发,好久不用的ADT集成开发环境频繁遇到不能在仿真机和真机上调试的问题,也就是本人另一篇博文描述的ADB(Android Debug Bridge)监控的5037被金山词霸暗自集成的金山手机助手、腾讯手机管家、豌豆荚等众多软件围攻的情形。需要详细了解,请移步:金山词霸你占我5037端口干嘛,费了你。那些流氓软件给我们安卓开发人员带来了很多烦恼啊,它们凭什么那么没节操?手动结束进程还真麻烦,有时还不知道是那个程序在作怪呢。所以想了下,写个WINNT服务检查当前活动的进程,如果有?adb这样的进程,且进程的运行目录有adb的必须依赖的几个dll文件时,就说明一定要费了它。
WINNT服务科普:
NT服务程序可随操作系统启动而启动,没有图形界面,资源占用小。注册安装好服务后可在系统服务控制台启动、停止等。
关键代码说明:
1、工作线程每隔1秒检查一下,系统当前活动的进程,把非adb的假adb进程终止掉。
/// <summary>
/// 检测当前进程
/// </summary>
private void Guard_adb_Work()
{
while (true)
{
var processes = Process.GetProcesses().Where(p => p.ProcessName.Contains("adb") && p.ProcessName.Length > ).ToList();
if (processes.Count > )
{
processes.ForEach(delegate(Process p)
{
var fileInfo = new FileInfo(p.MainModule.FileName);
//检查程序目录是否有adb的api dll类库,防止误杀
bool apiLibExists = fileInfo.Directory.GetFiles().Where(f => f.Name.Equals("AdbWinApi.dll")).Count() > ;
if (apiLibExists)
{
WinCommand.startcmd(fileInfo.FullName, "kill-server");
//p.Kill();
//你可恶我比你更可恶,但是Win7一般拿不到管理员权限,可能会删除失败
try
{
if (!EventLog.SourceExists(ServiceName))
{
EventLog.CreateEventSource(ServiceName, "应用程序");
}
EventLog.WriteEntry(string.Format("进程【{0}】非法占用5037端口。已经被消灭。", fileInfo.Name), EventLogEntryType.Warning);
fileInfo.Delete();
}
catch
{ }
}
});
}
System.Threading.Thread.Sleep();
}
}
2、adb命名终止adb server端,狡猾的众流氓软件会检查adb.exe是否运行,如果运行了,就直接使用adb的api获取当前已经通过USB等接口连接到PC的安卓手机。
可是ADT就不行了,它只认adb.exe这个进程。所以奇怪的是我把腾讯的手机管家的tadb.exe进程干掉了之后,插上手机腾讯手机管家还是会弹框说已经连接了安卓手机,是否启用手机管家这样的提示框。
C#运行命名行:
/// <summary>
/// 执行命令行
/// </summary>
public class WinCommand
{
public static string startcmd(string command)
{
string output = "";
try
{
Process cmd = new Process();
cmd.StartInfo.FileName = command;
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.CreateNoWindow = true;
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cmd.Start();
output = cmd.StandardOutput.ReadToEnd();
Console.WriteLine(output);
cmd.WaitForExit();
cmd.Close();
}
catch (Exception e)
{
Console.WriteLine(e);
}
return output;
}
public static string startcmd(string command, string argument)
{
string output = "";
try
{
Process cmd = new Process();
cmd.StartInfo.FileName = command;
cmd.StartInfo.Arguments = argument;
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.CreateNoWindow = true;
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cmd.Start();
output = cmd.StandardOutput.ReadToEnd();
Console.WriteLine(output);
cmd.WaitForExit();
cmd.Close();
}
catch (Exception e)
{
Console.WriteLine(e);
}
return output;
}
}
执行adb kill-server命名之后,流氓软件启动的?adb.exe的进程会停止。
3、WINNT服务程序的调试
a.使用“附加到进程”功能来调试以及部署的服务程序,这里不解释。这个比较烦。
b.将服务的OnStart()方法改成public new 关键字标识,然后在Program应用程序入口处将 "ServiceBase.Run(ServicesToRun)"相关代码注释掉,改为new ????Service().OnStart()。这样就是变成普通控制台程序的调试了。
4、WINNT服务程序的安装
a、启动服务程序带传递参数的办法:
/// <summary>
/// 应用程序的主入口点。
/// </summary>
static void Main(string[] args)
{
#region 处理传参数,安装、卸载服务
if (args.Length > 0)
{
AssemblyInstaller myAssemblyInstaller;
myAssemblyInstaller = new AssemblyInstaller();
myAssemblyInstaller.UseNewContext = true;
myAssemblyInstaller.Path = System.AppDomain.CurrentDomain.BaseDirectory + "\\" + System.AppDomain.CurrentDomain.FriendlyName;
System.Collections.Hashtable mySavedState = new System.Collections.Hashtable();
switch (args[0].ToLower())
{
case "-i":
myAssemblyInstaller.Install(mySavedState);
myAssemblyInstaller.Commit(mySavedState);
myAssemblyInstaller.Dispose();
return;
case "-u":
myAssemblyInstaller.CommandLine = new string[1] { "/u" };
myAssemblyInstaller.Uninstall(null);
myAssemblyInstaller.Dispose();
return;
default:
System.Console.WriteLine("------参数说明------");
System.Console.WriteLine("- i 安装服务!");
System.Console.WriteLine("- u 卸载服务!");
System.Console.ReadKey();
return;
}
}
#endregion
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new AdbGuardWinntService()
};
ServiceBase.Run(ServicesToRun);
//new AdbGuardWinntService().OnStart(null);
}
b、Installutil.exe:安装程序(Installer)工具,该工具允许你在一个指定的程序集中执行安装程序组件来安装和卸载服务器资源。Installutil命令方式安装也很麻烦不推荐。
c、使用bat加传参数方法:
安装服务就是“服务程序.exe -i”,卸载就是“服务程序.exe -u”,启动服务是:“net start 服务名。”,停止服务是::“net stop 服务名。"将这些命令写成bat文件即可。如果是Win7需要以管理员权限运行。
补充(服务程序支持安装操作还需要执行的步骤):
设置服务运行时的系统账户类型,自动启动还是手动启动还是禁用等。
最后晒成果:
全部源码及可执行文件下载(需要.net 4 vs2010环境):
C#编写WINNT服务,随便解决安卓开发遇到的5037被众多程序无节操占用的问题的更多相关文章
- C#编写WINNT服务
C#编写WINNT服务,随便解决安卓开发遇到的5037被众多程序无节操占用的问题 需求分析: 最近重新开始学习安卓开发,好久不用的ADT集成开发环境频繁遇到不能在仿真机和真机上调试的问题,也就是本人另 ...
- 【安卓开发】一个简单快递查询APP实例的实现摘要
前言 做毕业设计涉及到安卓开发,决定好好学习安卓开发.在正式做毕业设计之前,有必要先设计和完成一个与毕业设计最终成果相关的demo或者说样例APP.最终毕业设计需要实现的功能包括通过调用PHP端API ...
- Android模拟器使用笔记,学习head_first python 安卓开发章节
学习head_first python 安卓开发那一章需要的程序android-sdk_r23.0.2-windows.zip //模拟器 PythonForAndroid_r4.apk sl4a_r ...
- XAMPP打不开Apache服务的解决办法
XAMPP打不开Apache服务的解决办法 不用修改设置,应该是80端口被占用了,直接先IIS的网站给停了就OK
- Eclipse配置安卓开发环境(解决SDK manager下载慢问题)
Android新手在eclipse搭建安卓开发环境基本都会遇到Android SDK manager下载慢,ADT下载慢的问题,本文将带大家完整的安装一遍开发环境 工具:eclipse SDK ...
- 编写WCF服务时右击配置文件无“Edit WCF Configuration”(编辑 WCF 配置)远程的解决办法
原文:编写WCF服务时右击配置文件无“Edit WCF Configuration”远程的解决办法 今天在看<WCF揭秘>书中看到作者提出可以在一个WCF Host应用程序的App.Con ...
- 安卓开发解决android.os.NetworkOnMainThreadException异常方法(主线程不能直接调用webservice)
安卓开发解决android.os.NetworkOnMainThreadException异常方法 2013-01-07 14:01:04| 分类: 技术 | 标签:安卓 技术 java | ...
- 安卓开发——WebView+Recyclerview文章详情页,解决高度问题
安卓开发--WebView+Recyclerview文章详情页,解决高度问题 最近在写一个APP时,需要显示文章详情页,准备使用WebView和RecyclerView实现上面文章,下面评论.出现了W ...
- 搭建phonegap开发环境,搭建安卓开发环境
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
随机推荐
- [软件逆向]实战Mac系统下的软件分析+Mac QQ和微信的防撤回
0x00 一点废话 最近因为Mac软件收费的比较多,所以买了几款正版软件,但是有的软件卖的有点贵,买了感觉不值,不买吧,又觉得不方便,用别人的吧,又怕不安全.于是我就买了正版的Hopper Di ...
- Excel快捷键大全 Excel2013/2010/2007/2003常用快捷键大全
一个软件最大的用处是提高工作效率,衡量一个软件的好坏,除了是否出名之外,最主就是能否让一个新手更快的学会这个软件和提高工作速度.就拿Excel表格来说吧,平常办公中我们经常会用它来制作表格,统计数据或 ...
- php中编码转换方法
php里经常用到编码转换,在这记录一个常用的编码转换方法,字符串.数组.对象都可以使用,使用了递归来解决,比较普通 /* * php中编码转换 * @param $param 需要转换的数据 * @p ...
- 系统运维|IIS的日志设置
摘要: 1.服务器告警,磁盘资源不足 2.检查发现是IIS日志没有清理并且设置有误.在E盘占用了200G的空间 3.原则上IIS日志不能放在C盘,避免C盘写满了导致操作系统异常 4.附上IIS日志按天 ...
- 如何创建一个 mongo 数据库并为它添加一个认证用户?
0.登录 admin 库,开启一个 mongo shell mongo --port 27017 -u "adminUser" -p "adminPass" - ...
- Nginx禁止目录执行php文件权限
location ~ /dir/.*.(php|php5)?$ { deny all; } 禁止dir目录执行php文件权限 .csharpcode, .csharpcode pre { font-s ...
- 百度、高德、谷歌、火星、wgs84(2000)地图坐标相互转换的JS实现
一.调用例子: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- 【BZOJ3930】选数
[BZOJ3930]选数 Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选 ...
- 转载 .Net多线程编程—并发集合 https://www.cnblogs.com/hdwgxz/p/6258014.html
集合 1 为什么使用并发集合? 原因主要有以下几点: System.Collections和System.Collections.Generic名称空间中所提供的经典列表.集合和数组都不是线程安全的, ...
- solidity fallback函数
什么是fallback函数: 出处:http://me.tryblockchain.org/blockchain-solidity-fallback.html 回退函数是合约里的特殊函数,没有名字,不 ...