需求分析

最近重新开始学习安卓开发,好久不用的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被众多程序无节操占用的问题的更多相关文章

  1. C#编写WINNT服务

    C#编写WINNT服务,随便解决安卓开发遇到的5037被众多程序无节操占用的问题 需求分析: 最近重新开始学习安卓开发,好久不用的ADT集成开发环境频繁遇到不能在仿真机和真机上调试的问题,也就是本人另 ...

  2. 【安卓开发】一个简单快递查询APP实例的实现摘要

    前言 做毕业设计涉及到安卓开发,决定好好学习安卓开发.在正式做毕业设计之前,有必要先设计和完成一个与毕业设计最终成果相关的demo或者说样例APP.最终毕业设计需要实现的功能包括通过调用PHP端API ...

  3. Android模拟器使用笔记,学习head_first python 安卓开发章节

    学习head_first python 安卓开发那一章需要的程序android-sdk_r23.0.2-windows.zip //模拟器 PythonForAndroid_r4.apk sl4a_r ...

  4. XAMPP打不开Apache服务的解决办法

    XAMPP打不开Apache服务的解决办法 不用修改设置,应该是80端口被占用了,直接先IIS的网站给停了就OK

  5. Eclipse配置安卓开发环境(解决SDK manager下载慢问题)

    Android新手在eclipse搭建安卓开发环境基本都会遇到Android SDK manager下载慢,ADT下载慢的问题,本文将带大家完整的安装一遍开发环境 工具:eclipse     SDK ...

  6. 编写WCF服务时右击配置文件无“Edit WCF Configuration”(编辑 WCF 配置)远程的解决办法

    原文:编写WCF服务时右击配置文件无“Edit WCF Configuration”远程的解决办法 今天在看<WCF揭秘>书中看到作者提出可以在一个WCF Host应用程序的App.Con ...

  7. 安卓开发解决android.os.NetworkOnMainThreadException异常方法(主线程不能直接调用webservice)

    安卓开发解决android.os.NetworkOnMainThreadException异常方法 2013-01-07 14:01:04|  分类: 技术 |  标签:安卓  技术  java  | ...

  8. 安卓开发——WebView+Recyclerview文章详情页,解决高度问题

    安卓开发--WebView+Recyclerview文章详情页,解决高度问题 最近在写一个APP时,需要显示文章详情页,准备使用WebView和RecyclerView实现上面文章,下面评论.出现了W ...

  9. 搭建phonegap开发环境,搭建安卓开发环境

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

随机推荐

  1. Appium学习——安装appium Server

    安装appium Server 下载地址:百度网盘的下载链接:https://pan.baidu.com/s/1pKMwdfX 下载后, AppiumForWindows.zip 进行解压,点击 ap ...

  2. 使用mysqladmin extended-status查看MySQL的运行状态脚本

    一个好用的使用mysqladmin extended-status查看MySQL的运行状态脚本: mysqladmin -P3306 -uroot -p -h127. -r -i extended-s ...

  3. 比较分析C++、Java、Python、R语言的面向对象特征,这些特征如何实现的?有什么相同点?

    一门课的课后题答案,在这里备份一下: 面向对象程序设计语言 –  比较分析C++.Java.Python.R语言的面向对象特征,这些特征如何实现的?有什么相同点? C++ 语言的面向对象特征: 对象模 ...

  4. fedora 使用 vnc 远程 fedora 28 主机

    问题重述: 最近环境中需要使用 fedora 28 来进行远程桌面,于是就重新配置了一下vnc 在这里面做一下记录. 过程: yum 安装: 工作机上安装 vncviewer 远程主机上安装: vnc ...

  5. Linux运维平台工具:pstree、ps、top、htop、free、vmstat、dstat、kill、killall

    1.pstree命令 查看进程树,centos7下统一由systemd进行管理 [root@ELK-chaofeng systemd]# pstree systemd─┬─AliYunDun───*[ ...

  6. JDBC学习笔记之SQLException介绍

    1. SQLException 的概述 当使用 JDBC 与数据源(在本文中的数据源表示我们实际使用的数据库)进行交互的时候遇见错误的时候,将会抛出名为 SQLException 的异常.一个 SQL ...

  7. keil uvision4不能显示中文

    打开编辑-配置 选择字体和颜色如下图 去掉右边 在注释中使用颜色 就可以了

  8. MyBatis实现模糊查询的几种方式

    在学习MyBatis过程中想实现模糊查询,可惜失败了.后来上百度上查了一下,算是解决了.记录一下MyBatis实现模糊查询的几种方式. 数据库表名为test_student,初始化了几条记录,如图: ...

  9. pb中遍历查询数据库数据问题(数据库为 sql server)

    指针可以实现但是不推荐 例如:(部分代码) for ll_a = 1 to ll_count    ll_b = ll_i +  ll_a  //插入行行号先下移一位    dw_main.inser ...

  10. el-table复选框分页记忆

    el-table 结合 el-pagination 实现分页后默认是没有复选框记忆功能的,对于这样的需求,无奈又只能硬着头皮上,试了网上的一些方法,没奏效,便自己上了. 简单的用法如下: <te ...