自动更新.检测外部程序版本号.管理员权限.禁止多次启动.代码混淆

自动更新.启动a程序.检测b程序版本号.然后在服务器上上传下载.由于要控制别人程序.所以还要检测别人程序的版本号.不一致会发短信到开发人员

ICSharpCode.SharpZipLib.dll 解压缩工具

private string GetRequestDownFile(string url, string path)//HTTP下载
{
try
{
// 设置参数
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
//发送请求并获取相应回应数据
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才开始向目标网页发送Post请求
Stream responseStream = response.GetResponseStream();
//创建本地文件写入流
Stream stream = new FileStream(path, FileMode.Create);
byte[] bArr = new byte[1024];
int size = responseStream.Read(bArr, 0, (int)bArr.Length);
while (size > 0)
{
stream.Write(bArr, 0, size);
size = responseStream.Read(bArr, 0, (int)bArr.Length);
}
stream.Close();
responseStream.Close();
return path;
}
catch (Exception ef)
{

if (ef.Message == "未能解析此远程名称: ‘ekaipiao.gingkoo.com‘")
{

}
if (ef.Message == "远程服务器返回错误: (404) 未找到。")
{

}
return null;
}
}

网址对应服务器地址.http://ekaipiao.gingkoo.com/clients/GingkooPrint(14).exe

Client后面是相对路径

private void start()
{
Process p = new Process();//新建进程
p.StartInfo.FileName = Application.StartupPath + @"\Print.exe";//设置进程名字
p.StartInfo.CreateNoWindow = true;
p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
p.Start();
}

B程序启动A程序

file = GetRequestDownFile("http://ekaipiao.gingkoo.com/clients/Service.ini", Application.StartupPath + @"\Service.ini");

下载服务器版本号.如果大于.下载最新版本覆盖

保证速度.服务器上存放新版的ZIP.客户端下载后台解压启动.

FastZip fastZip = new FastZip();//解压缩对象

fastZip.ExtractZip(Application.StartupPath + @"\relase for Win7 or above.zip", Application.StartupPath, null);

//fastZip.ExtractZip(@"D:\test1.zip", @"D:\解压目录", null);//解压

//fastZip.CreateZip(@"D:\文档.zip", @"D:\来源目录", true, null);//压缩

无损喔

start();
Process[] proc = Process.GetProcesses();
foreach (var item in proc)
{
if (item.ProcessName.Contains("AutoUpdate"))//vshost
{
item.Kill();
}
}

启动目标程序.就可以杀死自己了

如何去检测外部程序.检测注册表.如果是绿色软件就读取桌面快捷方式.满电脑搜索就算了

private List<string> DesktopSean()//桌面搜索
{
List<string> data = new List<string>();

string dir = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop);

DirectoryInfo dirInfo = new DirectoryInfo(dir);

FileInfo[] files = dirInfo.GetFiles("*.lnk", SearchOption.TopDirectoryOnly);//当前目录
List<int> test = new List<int>();
foreach (FileInfo file in files)
{
data.Add(file.DirectoryName + "\\" + file.Name);
// data.Add(AppDomain.CurrentDomain.SetupInformation.ApplicationBase+file);
}

return data;

}

会把电脑上所有的快捷方式找出来.桌面上的EXE实际也是lnk

private string VersionSean(string item)//检测版本号
{
IWshShortcut _shortcut = null;
IWshShell_Class shell = new IWshShell_Class();
if (System.IO.File.Exists(item) == true)
_shortcut = shell.CreateShortcut(item) as IWshShortcut;//通过快捷方式获取物理路径

var path1 = _shortcut.TargetPath;

FileVersionInfo.GetVersionInfo(Path.Combine(path1));
FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo(path1);//通过物理路径获取版本号

return myFileVersionInfo.FileVersion;

}

private string WindowsVersionSean()
{
string windowsversion = null;
OperatingSystem os = Environment.OSVersion;
switch (os.Platform)
{
case PlatformID.Win32Windows:
switch (os.Version.Minor)
{
case 0:
windowsversion = "Windows 95 ";
break;
case 10:
if (os.Version.Revision.ToString() == "2222A ")
windowsversion = "Windows 98 第二版 ";
else
windowsversion = "Windows 98 ";
break;
case 90:
windowsversion = "Windows Me ";
break;
}
break;
case PlatformID.Win32NT:
switch (os.Version.Major)
{
case 3:
windowsversion = "Windows NT 3.51 ";
break;
case 4:
windowsversion = "Windows NT 4.0 ";
break;
case 5:
switch (os.Version.Minor)
{
case 0:
windowsversion = "Windows 200 ";
break;
case 1:
windowsversion = "Windows XP ";
break;
case 2:
windowsversion = "Windows 2003 ";
break;
}
break;
case 6:
switch (os.Version.Minor)
{
case 0:
windowsversion = "Windows Vista ";
break;
case 1:
windowsversion = "Windows 7 ";
break;
}
break;
}
break;
}
return windowsversion;
}//检测Win版本

为什么要检测Win版本号呢。这个是自动更新的部分.因为WIN7和xp暂时不能用同一套源码.

var a = DesktopSean();

foreach (string item in a)
{
if (item.Contains("增值税发票税控开票软件(税控盘版).lnk"))//百旺
{
Baiwang = VersionSean(item);
}
if (item.Contains("开票软件.lnk"))//航信
{
Hangxin = VersionSean(item);
}
}

这样就可以读取到外部程序的版本号了

[DllImport("kernel32")]
public static extern long WritePrivateProfileString(string section, string key, string val, string filePath); 
[DllImport("kernel32")]
public static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);

GetPrivateProfileString("VersionData", "Key", "", temp, 500, file);//读

WritePrivateProfileString("VersionData", "Key", temp.ToString(), Application.StartupPath + @"\Client.ini");//写

这种方法可以操作INI文件

为什么要说呢.因为版本号在服务器的INI中

如果检测到客户端外部程序的版本号和服务器上存储的版本号不一致就准备发短信呀发邮件呀告诉我们的开发人员外部程序升级啦。看看有啥影响没~

public static string GetHtmlFromUrl(string url)
{
string strRet = null;
if (url == null || url.Trim().ToString() == "")
{
return strRet;
}
string targeturl = url.Trim().ToString();
try
{
HttpWebRequest hr = (HttpWebRequest)WebRequest.Create(targeturl);
hr.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
hr.Method = "GET";
hr.Timeout = 30 * 60 * 1000;
WebResponse hs = hr.GetResponse();
Stream sr = hs.GetResponseStream();
StreamReader ser = new StreamReader(sr, Encoding.Default);
strRet = ser.ReadToEnd();
}
catch (Exception ex)
{
strRet = null;
}
return strRet;
}

调的是SMS的接口

每个人可以免费发五条短信~

string name = GetHtmlFromUrl(" http://gbk.sms.webchinese.cn/?Uid=账号&Key=密钥&smsMob=收信人&smsText=内容 ");

public bool SendEmail(string StrTo, string strFrom, string StrBody, string strSubject, string name, string pwd, string path)
{
#region 检查邮箱的类别
string sHos = "smtp.qq.com";//根据发送邮箱地址获取你的smtp主机
if (name.Contains("@163"))
{
sHos = "smtp.163.com";
}
else if (name.Contains("@126"))
{
sHos = "smtp.126.com";
}
else if (name.Contains("@qq"))
{
sHos = "smtp.qq.com";
}
else if (name.Contains("@sohu"))
{
sHos = "smtp.sohu.com";
}
else if (name.Contains("@sina"))
{
sHos = "smtp.sina.com";
}
else if (name.Contains("@tom"))
{
sHos = "smtp.tom.com.cn";
}
else if (name.Contains("@foxmail"))
{
sHos = "smtp.foxmail.com";
}
else if (name.Contains("@139"))
{
sHos = "smtp.139.com";
}
#endregion

//设置收发邮件人的地址
System.Net.Mail.MailAddress fromEmail = new System.Net.Mail.MailAddress(strFrom);
System.Net.Mail.MailAddress toEmail = new System.Net.Mail.MailAddress(StrTo);

//创建电子邮件对象
System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage(fromEmail, toEmail);

mail.Body = StrBody; //邮件内容
mail.Subject = strSubject; //邮件标题
mail.IsBodyHtml = true; //邮件是否包含html格式
mail.BodyEncoding = Encoding.UTF8; //邮件内容的编码方式
mail.Priority = System.Net.Mail.MailPriority.Normal; //邮件的发送优先级别

//邮递员
System.Net.Mail.SmtpClient smtpClient = new System.Net.Mail.SmtpClient();
smtpClient.Host = sHos;//设置成发件人的smtp主机名或者ip地址
smtpClient.Port = 25; //默认端口号
smtpClient.UseDefaultCredentials = false; //不使用当前用户的默认凭据进行身份验证,用Credentials进行身份验证
smtpClient.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
smtpClient.Credentials = new System.Net.NetworkCredential(name, pwd);//你的用户名和密码

//以下是邮件附件部分,path是附件的客户端路径含文件名
if (path != "")
{
if (File.Exists(path))
{
//设置附件的类型可以是任何类型的文件
Attachment attachment = new Attachment(path, System.Net.Mime.MediaTypeNames.Application.Octet);
mail.Attachments.Add(attachment);
}
}
try
{
smtpClient.Send(mail);
}
catch (Exception e)
{
//String s = e.Message;
return false;
}
return true;
}

SendEmail("收件人邮箱", "发件人邮箱", "标题", "内容", "发件人账号", "发件人密码", "附件");

就这样,如果客户端的软件检测到外部程序的版本号升级了。就会哭着闹着告诉开发人员

using System;
using System.Diagnostics;
using System.Reflection;
using System.Windows.Forms;

namespace AutoUpdate
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] Args)
{
//Application.EnableVisualStyles();
//Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new Update());
Process instance = RunningInstance();
if (instance == null)
{
//没有实例在运行
//Application.Run(new Login());
System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
//创建Windows用户主题
Application.EnableVisualStyles();

System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
//判断当前登录用户是否为管理员
if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator))
{
//如果是管理员,则直接运行

Application.EnableVisualStyles();
Application.Run(new Update());
}
else
{
//创建启动对象
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
//设置运行文件 Z
startInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
//设置启动参数
startInfo.Arguments = String.Join(" ", Args);
//设置启动动作,确保以管理员身份运行
startInfo.Verb = "runas";
//如果不是管理员,则启动UAC
System.Diagnostics.Process.Start(startInfo);
//退出
System.Windows.Forms.Application.Exit();
}
}
else
{
//已经有一个实例在运行
HandleRunningInstance(instance);
}
}
private static Process RunningInstance()
{
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(current.ProcessName);
//遍历与当前进程名称相同的进程列表
foreach (Process process in processes)
{
//如果实例已经存在则忽略当前进程
if (process.Id != current.Id)
{
//保证要打开的进程同已经存在的进程来自同一文件路径
if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
{
//返回已经存在的进程
return process;

}
}
}
return null;
}

private static void HandleRunningInstance(Process instance)
{
// MessageBox.Show("已经在运行!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
//ShowWindowAsync(instance.MainWindowHandle, 1); //调用api函数,正常显示窗口
//SetForegroundWindow(instance.MainWindowHandle); //将窗口放置最前端
}
}
}

简单点 .上面的Program包含了管理员启动和禁止多次启动.

误删重写的浮躁~

代码是如何混淆并不关心.微软推出了DotNet REACTOR.EXE会用就行

open 添加主程序EXE

File添加其他程序

anti ildasm 是防止反编译

obfuscation 是代码混淆

string encryption 是 字符串加密

时间: 2024-08-25 16:26:34

自动更新.检测外部程序版本号.管理员权限.禁止多次启动.代码混淆的相关文章

如何禁止和关闭windows自动更新

链接地址:http://jingyan.baidu.com/article/455a99508fb1c9a1662778b3.html 1.点电脑左下角的开始,然后在弹出菜单中点击运行,打开运行程序,或者找不到在左边菜单附件文件夹中: 2.在打开后面的输入框中输入gpedit.msc,然后回车或者点下面的确定按钮,执行gpedit.msc程序 3.执行gpedit.msc后,就打开本地组策略编辑器,如下图所示 4.在本地组策略编辑器的左边设置菜单列表中依次点击打开“用户配置”=====>“管理模

易语言等软件自动获取管理员权限,在64位Windows7系统非管理员帐户中执行

昨天有易语言开发者向我求助,说他用易语言编译的32位程序软件,发布给64位操作系统Win 7用户使用,因为该用户确定没有管理员权限,而程序启动时又要求必须输入管理员密码,如此陷入困境. 目标企业用户管理严格,要求为普通用户分配管理员权限是不切实际的,只能开发人员从软件开发的角度在技术上解决. 我听到这个问题后,第一感觉是微软用户帐户控制(UAC)引发的,估计通过给 exe 添加特定的 manifest 资源应该可以解决.于是我给了他一段代码,让他用 ResHacker 之类的软件添加到软件里面去

友盟更新 自动更新替换方案

自动更新替换方案 这个服务因为目前面临N多非技术的挑战,导致我们很难再维护好这个服务: iOS的自动更新已经被苹果官方严格禁止了,苹果官方也数次联系友盟,要求我们及早把iOS的更新服务停掉: Android面临的问题更多,比如应用市场(集成友盟自动更新插件会导致市场审核被拒).部分系统厂商(部分厂商系统上,增量更新功能不能正常工作)以及部分运营商的拦截(比如有开发者反馈我们的下载CDN链接在某些地区的运营商会被禁止访问). 4.1日起,我们已经停止向新用户透出该服务:今年10.15以后,老用户也

友盟集成自动更新版本功能

以下是从友盟SDK文档中摘录出来的一些说明: iOS自动更新SDK集成指南 :http://dev.umeng.com/auto-update/ios/quick-start 1. 集成友盟iOS统计分析SDK 友盟自动更新功能在统计分析SDK中实现,请点击下面链接,先集成统计分析SDK 统计分析iOS SDK集成指南 2. 使用按渠道自动更新检测 在网站上分渠道提交app的版本号,更新日志及openURL后,您只需添加一行代码来完成自动更新检查. 请将下面代码添加到[MobClick star

大话Electron应用自动更新

一.Windows下更新特有的问题 软件更新在Linux和macOS还好说,但是在Windows上可能会遇到UAC问题,常用的方法是:Windows计划任务.Windows Service,本质上这两种方式还是提权,Windows Service 与 Windows计划任务相比最大的特点就是可以与应用交互,Windows的更新就是使用Windows Update服务,即使在macOS的Edge浏览器也是使用的Microsoft Update服务. 二.手动更新 手动更新是下载完整的安装包,用户手

C# 应用程序单例(禁止多开) 获取.net版本号 以及 管理员权限

Mutex不仅提供跨线程的服务,还提供跨进程的服务.当在构造函数中为Mutex指定名称时,则会创建一个命名了的Mutex.其他线程创建Mutex时,如果指定的名称相同,则返回同一个互斥体,不论该线程位于哪个进程或者应用程序域中. 使用命名互斥体的一个例子是创建Singleton应用程序,即只能打开一个实例的应用程序.显然,我们创建的控制台应用程序是可以同时打开多个实例的.下面的代码使用Mutex实现了只能同时开启一个Console控制台程序. string asm = Assembly.GetE

Word 文档插入时间日期禁止自动更新

前些天写了点总结并插入时间和日期,记得勾掉了那个自动更新的,但是刚才打开时发现当时的日期和时间变成现在的了,我就纳闷了,然后我去看那插入日期和时间的那个框,里面确实没有勾选自动更新,于是百度, 百度都说只要把那个自动更新的勾去掉了就不会自动更新了,但是我的怎么就自动更新了呢? 是这样的,在你完成插入操作之前要把那个自动更新的勾去掉,再去插入时间和日期,这样插入的时间和日期就不会自动更新了,我当时是用的快捷键插入的时间和日期, 然后再去去掉那个自动更新的勾,这样其实没用了,记住在不需要自动更新时间

编译一次自动更新版本号

http://blog.csdn.net/gqqnb/article/details/7213611 安装与运行 复制IncBuildNo.exe到你的硬盘,例如 C:\windows\IncBuildNo.exe      在Visual Studio中打开任意一个项目或解决方案, 在菜单上选择 项目 - >XXX属性- >生成事件 在后期生成事件命令行中输入命令:IncBuildNo "$(ProjectDir)Properties\AssemblyInfo.cs" &

自动更新 -- 版本号比较(2)

版本号比较 在实现自动更新的时候,需要进行版本号的比较. 例如: 1.0.6 和1.0.7比较大小 解决方案: 将版本号的字符串转换成整数来比较. 步骤: 1. 去除字符串中的小数点.(使用正则表达式) 2. 比较两个字符串的长度,长度短的后尾补0,直到两个字符串长度相同.(为了实现 1.0.5.1与1.0.6的比较). 3. 将两个字符串转换成整数比较. 代码如下: // 正则表达式去除小数点 //String str1 = "1.0.6".replaceAll("[.]&