提交 5ac0f8a4 authored 作者: wangqiang's avatar wangqiang

客户端更新

上级 4d8ce8f1
package com.priusis.controller;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.priusis.lib.R;
import com.priusis.utils.MacAddrUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 设备表控制器
* </p>
*/
@RestController
@RequestMapping("/facility")
@Validated
public class FacilityController {
@Value(value = "${apq.iot-gateway}")
private String gateway;
@Value(value = "${apq.url.voiceCall}")
private String voiceCallUrl;
@PostMapping("voiceCall")
public R voiceCall() {
String reqUrl = gateway + voiceCallUrl;
String mac = MacAddrUtil.get();
JSONObject rsp = JSONUtil.parseObj(HttpUtil.post(reqUrl,
JSONUtil.createObj().set("macAddress", mac).toString()));
if (ObjectUtil.notEqual(rsp.getInt("code"), 0)) return R.error(rsp.getStr("msg"));
return R.success(mac);
}
}
......@@ -288,6 +288,9 @@ public class ProgramController {
@GetMapping(value = "get_exe_path")
public R<String> getVersion(@RequestParam @NotBlank String name) throws IOException {
if (null == installedProgramCache || null == installedProgramCache.getPrograms()) {
return R.success();
}
return installedProgramCache.getPrograms().stream()
.filter(p -> p.get("name").equalsIgnoreCase(name))
.findFirst()
......@@ -323,7 +326,7 @@ public class ProgramController {
while ((line = reader.readLine()) != null) {
// 去除注册表的数据
String taskProcess = line.substring(1, line.indexOf("\",\""));
if (!containsOfCache(taskProcess) && excludePrograms.contains(taskProcess)) {
if (!containsOfCache(taskProcess) && !excludePrograms.contains(taskProcess)) {
processNames.add(taskProcess);
}
}
......
package com.priusis.dto;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* @author xls
*/
@Data
public class VoiceCallDto {
/**
* 设备MAC地址
*/
private String macAddress;
}
......@@ -47,6 +47,7 @@ apq:
tenantId: 156
url:
# device_info: /facility/facility/getByMacAddress?macAddress={}
voiceCall: /facility/facility/voiceCall
device_info: /facility/facility/pcAdd
install: /ops/install/getClientList?macAddress={}&pageNum={}&pageSize={}
upgrade: /ops/upgrade/getClientList?macAddress={}&pageNum={}&pageSize={}
......
......@@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.priusis.service.antivirus.AntivirusDoService;
import com.priusis.utils.ProcessExtensionsApqUtil;
import com.priusis.utils.WinExecuteUtils;
import com.priusis.vo.MqttRpcDataMessage;
......@@ -39,85 +40,14 @@ public class ApqAntivirusJob {
@Autowired
private RestTemplate restTemplate;
// 杀毒程序
@Value("${apq.antivirus.type}") // P360
private AntivirusProcessEnum antivirusProcess;
// https://blog.csdn.net/weixin_43145361/article/details/90667636
enum AntivirusProcessEnum {
// 360安全卫士 360sd.exe <file_name>
P360("360", "360杀毒", "s360sd.bat", "未发现威胁文件", "Log\\VirusScanLog", "\\d{14}.log", Arrays.asList(0, 2, 3, 4, 5, 6, 7, 8, -1)),
// 腾讯电脑管家
TENCENT,
// Norton(诺顿)
NORTON,
// 卡巴斯基 avp.com SCAN /i0 <file_name>
KASPERSKY,
// 趋势科技
trendmicro("trendmicro", "趋势科技", "sqssd.bat", "未发现威胁文件", "Log\\VirusScanLog", "\\d{14}.log", Arrays.asList(0, 2, 3, 4, 5, 6, 7, 8, -1)),
;
private String code;
private String name;
private String exeName;
private String exePath;
private String rightStr;
private String logPath;
private String logNamePattern;
private List<Integer> logLines;
AntivirusProcessEnum() {
}
AntivirusProcessEnum(String code, String name, String exeName, String rightStr, String logPath, String logNamePattern, List<Integer> logLines) {
this.code = code;
this.name = name;
this.exeName = exeName;
this.rightStr = rightStr;
// this.exePath = exePath;
this.logPath = logPath;
this.logNamePattern = logNamePattern;
this.logLines = logLines;
}
public void exePath(String exePath) {
this.exePath = exePath;
}
String logPath() {
return exePath + "\\" + logPath;
}
}
@Autowired
private AntivirusDoService antivirusDoService;
public boolean initExePath() {
if (StrUtil.isBlank(antivirusProcess.exePath)) {
try {
String reqUrl = "http://localhost:8765/program/get_exe_path?name=" + antivirusProcess.name;
JSONObject rsp = JSONUtil.parseObj(HttpUtil.get(reqUrl));
if (ObjectUtil.notEqual(rsp.getInt("code"), 0) || null == rsp.getStr("data")) {
log.error("病毒查杀初始化路径异常,msg:{}", rsp.getStr("msg"));
return false;
}
antivirusProcess.exePath(rsp.getStr("data"));
} catch (Exception e) {
log.error("病毒查杀初始化路径异常", e);
}
}
return true;
}
@Scheduled(fixedDelay = 60000L)
protected void antivirusProgramTask() {
log.info("病毒查杀请求=================");
if (!initExePath()) {
return;
}
// 获取病毒查杀监控配置 params == data
ResponseEntity<MqttRpcDataMessage> forEntity = null;
try {
......@@ -131,20 +61,13 @@ public class ApqAntivirusJob {
Long sendTime = body.getSendTime();
long current = System.currentTimeMillis();
// RegisterParamDto registerParamDto = JSONUtil.toBean(params, RegisterParamDto.class);
// RegisterParamDto registerParamDto = JSONUtil.toBean(params, RegisterParamDto.class);
if (current - sendTime <= FIXED_DELAY) {
// 收到病毒查杀下发请求
log.info("收到病毒查杀下发请求, sendTime:{}, params:{}", sendTime, params);
try {
// WinExecuteUtils.executeExe(antivirusProcess.exePath + File.separator + antivirusProcess.exeName);
String pNameStr = antivirusProcess.exeName + " \"" + antivirusProcess.exePath + "\" c:\\windows";
ProcessExtensionsApqUtil.apq_CreateProcessAsUser(pNameStr);
} catch (Exception e) {
log.error("病毒查杀异常,杀毒程序可能未安装,或者配置错误, antivirusProcess:{}, exePath:{}", antivirusProcess.name, antivirusProcess.exePath, e);
}
antivirusDoService.doAntivirus("c:\\windows");
// antivirusDoService.doAntivirus("C:\\Program Files");
log.info("毒查杀下发请求接收.....");
}
} else {
......@@ -157,28 +80,28 @@ public class ApqAntivirusJob {
protected void antivirusProgramLogTask() {
log.info("病毒查杀日志上报=================");
if (!initExePath()) {
if (!antivirusDoService.initExePath()) {
return;
}
// 读取日志
long current = System.currentTimeMillis();
String logPath = antivirusProcess.logPath();
String logPath = antivirusDoService.antivirusProcess.logPath();
// current - FIXED_DELAY
List<File> files = FileUtil.loopFiles(Paths.get(logPath), 1, file -> (file.isFile() && (file.lastModified() >= current - FIXED_DELAY)
&& file.getName().matches(antivirusProcess.logNamePattern)));
&& file.getName().matches(antivirusDoService.antivirusProcess.logNamePattern())));
for (File file : files) {
// String logDataSb = FileUtil.readString(file, "gbk");
StringBuffer logDataSb = new StringBuffer();
List<String> logDatas = FileUtil.readLines(file, "gbk");
for (Integer logLine : antivirusProcess.logLines) {
for (Integer logLine : antivirusDoService.antivirusProcess.logLines()) {
if (logLine < 0) {
logLine = logDatas.size() + logLine;
}
logDataSb.append(logDatas.get(logLine)).append("\n");
}
String logDataStr = logDataSb.toString();
if (!StrUtil.isBlank(logDataStr) && !logDataStr.contains(antivirusProcess.rightStr)) {
if (!StrUtil.isBlank(logDataStr) && !logDataStr.contains(antivirusDoService.antivirusProcess.rightStr())) {
log.info("存在病毒查杀接口扫描告警: logData:{}", logDataSb);
// 上报病毒查杀监控数据
List<String> mapSoftRequest = new ArrayList<>();
......
......@@ -5,10 +5,7 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.priusis.dto.HwPortControllerDto;
import com.priusis.service.control.DeviceChangeCallbackImpl;
import com.priusis.utils.IHwPortController;
import com.priusis.utils.ProcessExtensions;
import com.priusis.utils.ProcessExtensionsApqUtil;
import com.priusis.utils.WinExecuteUtils;
import com.priusis.utils.*;
import com.priusis.vo.MqttRpcDataMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -52,6 +49,9 @@ public class ApqControlJob {
// ProcessExtensionsApqUtil.apq_CreateProcessAsUser(pNameStr);
// ProcessExtensionsApqUtil.apq_CreateProcessAsUser(pNameStr2);
// 初始化USB信息
USBCheck.getAddUSB();
scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.submit(() -> {
// 初始化硬件接口管理模块
......
package com.priusis.service.antivirus;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.priusis.utils.ProcessExtensionsApqUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
@Slf4j
@Component
public class AntivirusDoService {
// 杀毒程序
@Value("${apq.antivirus.type}") // P360
public AntivirusProcessEnum antivirusProcess;
// https://blog.csdn.net/weixin_43145361/article/details/90667636
public enum AntivirusProcessEnum {
// 360安全卫士 360sd.exe <file_name>
P360("360", "360杀毒", "s360sd.bat", "未发现威胁文件", "Log\\VirusScanLog", "\\d{14}.log", Arrays.asList(0, 2, 3, 4, 5, 6, 7, 8, -1)),
// 腾讯电脑管家
TENCENT,
// Norton(诺顿)
NORTON,
// 卡巴斯基 avp.com SCAN /i0 <file_name>
KASPERSKY,
// 趋势科技
trendmicro("trendmicro", "趋势科技", "sqssd.bat", "未发现威胁文件", "Log\\VirusScanLog", "\\d{14}.log", Arrays.asList(0, 2, 3, 4, 5, 6, 7, 8, -1)),
;
private String code;
private String name;
private String exeName;
private String exePath;
private String rightStr;
private String logPath;
private String logNamePattern;
private List<Integer> logLines;
AntivirusProcessEnum() {
}
AntivirusProcessEnum(String code, String name, String exeName, String rightStr, String logPath, String logNamePattern, List<Integer> logLines) {
this.code = code;
this.name = name;
this.exeName = exeName;
this.rightStr = rightStr;
// this.exePath = exePath;
this.logPath = logPath;
this.logNamePattern = logNamePattern;
this.logLines = logLines;
}
public void exePath(String exePath) {
this.exePath = exePath;
}
public String logPath() {
return exePath + "\\" + logPath;
}
public String logNamePattern() {
return logNamePattern;
}
public String rightStr() {
return rightStr;
}
public List<Integer> logLines() {
return logLines;
}
}
public boolean initExePath() {
if (StrUtil.isBlank(antivirusProcess.exePath)) {
try {
String reqUrl = "http://localhost:8765/program/get_exe_path?name=" + antivirusProcess.name;
JSONObject rsp = JSONUtil.parseObj(HttpUtil.get(reqUrl));
if (ObjectUtil.notEqual(rsp.getInt("code"), 0) || null == rsp.getStr("data")) {
log.error("病毒查杀初始化路径异常,msg:{}", rsp.getStr("msg"));
return false;
}
antivirusProcess.exePath(rsp.getStr("data"));
} catch (Exception e) {
log.error("病毒查杀初始化路径异常", e);
}
}
return true;
}
public void doAntivirus(String antivirusTargetPath) {
if (!initExePath()) {
log.error("病毒查杀异常,杀毒程序可能未安装,或者配置错误, antivirusProcess:{}, exePath:{}", antivirusProcess.name, antivirusProcess.exePath);
return;
}
try {
// WinExecuteUtils.executeExe(antivirusProcess.exePath + File.separator + antivirusProcess.exeName);
String pNameStr = antivirusProcess.exeName + " \"" + antivirusProcess.exePath + "\" " + antivirusTargetPath;
ProcessExtensionsApqUtil.apq_CreateProcessAsUser(pNameStr);
} catch (Exception e) {
log.error("病毒查杀异常,杀毒程序可能未安装,或者配置错误, antivirusProcess:{}, exePath:{}", antivirusProcess.name, antivirusProcess.exePath, e);
}
}
}
package com.priusis.service.control;
import cn.hutool.core.util.StrUtil;
import com.priusis.job.ApqAntivirusJob;
import com.priusis.service.antivirus.AntivirusDoService;
import com.priusis.utils.USBCheck;
import com.sun.jna.Pointer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
......@@ -17,6 +22,9 @@ public class DeviceChangeCallbackImpl implements IDeviceChangeCallback {
@Autowired
private RestTemplate restTemplate;
@Autowired
private AntivirusDoService antivirusDoService;
@Override
public void P_DEVICE_CHANGE_CB(int changeType, Pointer data) {
String changeData = data.getString(0);
......@@ -43,6 +51,12 @@ public class DeviceChangeCallbackImpl implements IDeviceChangeCallback {
changeDataDesc = "鼠标";
} else if (StrUtil.equalsIgnoreCase("class=DiskDrive", classData)) {
changeDataDesc = "USB";
List<String> addUSBs = USBCheck.getAddUSB();
if (null != addUSBs) {
for (String addUSB : addUSBs) {
antivirusDoService.doAntivirus(addUSB + ":");
}
}
}
String changeContent = String.format("%s%s", changeType == 1 ? "插入" : "拔出", changeDataDesc);
......
......@@ -89,9 +89,9 @@ public class CoreTempUtil {
}
public static void main(String[] args) throws Exception {
// System.out.println(CoreTempUtil.getCpuTemp());
OperatingSystem os = OshiUtil.getOs();
String osValue = os.getManufacturer() + " " + os.getFamily() + " " + os.getVersionInfo().getVersion() + "(" + os.getBitness() + ")";
System.out.println(osValue);
System.out.println(CoreTempUtil.getCpuTemp());
// OperatingSystem os = OshiUtil.getOs();
// String osValue = os.getManufacturer() + " " + os.getFamily() + " " + os.getVersionInfo().getVersion() + "(" + os.getBitness() + ")";
// System.out.println(osValue);
}
}
......@@ -23,7 +23,7 @@ public class ProcessExtensionsApqUtil {
public static int apq_CreateProcessAsUser(String pNameStr) {
int i = 0;
try {
log.info("=============================== s");
log.info("=============================== s {}", pNameStr);
Pointer pName = new Memory(pNameStr.length() + 1); // WARNING: assumes ascii-only string
pName.setString(0, pNameStr);
i = CP_API_INSTANCE.apq_CreateProcessAsUser(pName);
......
package com.priusis.utils;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@Slf4j
public class USBCheck {
static File[] files = File.listRoots();//列出当前所有盘符
//准备好集合,把所有盘符数据添加进去
public static List<String> getAddUSB() {
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
log.error("", e);
}
List<File> f1 = new ArrayList<>();
List<File> f2 = new ArrayList<>();
List<String> addFiles = new ArrayList<>();
File[] newfiles = File.listRoots();//获得到新盘符
if (newfiles.length > files.length) {//如果新的盘符大于原来盘符
//用Arrays工具把数组转换成集合在添加进集合
f1.addAll(Arrays.asList(files));
f2.addAll(Arrays.asList(newfiles));
f2.removeAll(f1);//在f2和f1里面找到相同的数据进行删除掉
for (File file : f2) {
char[] c = file.getPath().toCharArray();//把路径拆分成字符
log.info("插入:" + c[0] + " 盘");
addFiles.add(c[0] + "");
}
files = newfiles;//更新盘符
} else if (newfiles.length < files.length) {//如果新的盘符小于了原来的盘符
//说明U盘已经拔出
log.info("U盘已拔出");
files = newfiles;
}
return addFiles;
}
public static void main(String[] args) throws InterruptedException {
while (true) {
USBCheck.getAddUSB();
Thread.sleep(2000);
}
}
}
\ No newline at end of file
......@@ -44,9 +44,9 @@ public class SigarUtil {
// who();
// System.out.println("----------------------------------");
// // 文件系统信息
file();
// file();
System.out.println("----------------------------------");
// disk(sigar);
disk(sigar);
// // 网络信息
// net();
// System.out.println("----------------------------------");
......
/*
物联网告警规则示例:
硬盘容量预警:
{"C盘":"30.42%","D盘":"93.72%"}
return Number(msg['C盘'].split('%')[0]) >= 10
======================================================
硬盘异常:
{"type":"hard_disk","PHYSICALDRIVE1":{"name":"PHYSICALDRIVE1","type":"Add","value":"Samsung Flash Drive USB Device(AA00000000000489)"}}
插入硬盘事件:
if(msg.type != "hard_disk") {
return false;
}
for(var key in msg){
if(key != "type" && msg[key].type == "Add") {
// console.info("插入硬盘事件");
return true;
}
}
return false;
-------------------------------------------------
拔出硬盘事件
if(msg.type != "hard_disk") {
return false;
}
for(var key in msg){
if(key != "type" && msg[key].type == "Reduce") {
// console.info("拔出硬盘事件");
return true;
}
}
return false;*/
......@@ -4,10 +4,10 @@
#define MyAppName "阿普奇检测客户端"
#define MyAppVersion "V1.0"
#define MyAppPublisher "阿普奇"
#define MyAppURL "https://www.apq.com/"
#define MyAppURL "https://www.apq.com/"
#define MyAppDirName "apq-client"
#define MyAppEnName "apq-client"
#define MyAppExeName "apq-client.exe"
#define MyAppExeName "apq-client.exe"
; apq-iot-client
#define MyAppInstallPwd "2a96d11973c7caa1a72eb816d7db6d17"
; hk-remove2022
......@@ -59,6 +59,7 @@ Name: "chinese"; MessagesFile: "compiler:Languages/Chinese.isl"
Source: "../apq-client/*"; Excludes: "bak,*.iss"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs;
Source: "../../java/x32/jre/*"; DestDir: "{app}/jre"; Flags: ignoreversion recursesubdirs createallsubdirs;
Source: "../../dact/x32/*"; DestDir: "{app}/service/dact"; Flags: ignoreversion recursesubdirs createallsubdirs;
Source: "../../runtime/VC_redist.x86.exe"; DestDir: "{app}/service/runtime"; Flags: ignoreversion recursesubdirs createallsubdirs;
Source: "../../core/*"; DestDir: "{app}/service/core"; Flags: ignoreversion recursesubdirs createallsubdirs;
Source: "../../vnc/x32/*"; DestDir: "{app}/vnc"; Flags: ignoreversion recursesubdirs createallsubdirs;
Source: "../../client/x32/*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs;
......@@ -72,6 +73,7 @@ Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\client-soft\apq.exe";
Filename: "{app}\Set_Env.bat"; Flags: runhidden;
Filename: "{app}\service\启动服务.bat"; Flags: runhidden runascurrentuser waituntilterminated;
Filename: "{app}\vnc\setup.bat"; Flags: skipifdoesntexist runhidden
Filename: {app}\service\runtime\VC_redist.x86.exe; Parameters: /q; WorkingDir: {tmp}; Flags: skipifdoesntexist; StatusMsg: "Installing Microsoft Visual C++ Runtime ..."; Check: NeedInstallVC9SP1
;卸载后执行的操作(停止、删除各种服务)
[UninstallRun]
......@@ -87,6 +89,14 @@ Type: dirifempty; Name: "{app}"
Root: HKLM; Subkey: "Software\{#MyAppEnName}"; Flags: uninsdeletekey;
[Code]
var
vc9SP1Missing: Boolean;
function NeedInstallVC9SP1(): Boolean;
begin
Result := vc9SP1Missing;
end;
function GetMD5OfStringApq(Password: String): string;
begin
Result := GetMD5OfString(Password);
......@@ -220,6 +230,9 @@ end;
// Perform some initializations. Return False to abort setup
function InitializeSetup: Boolean;
var
CurVer: string;
CurVerStr: string;
begin
// Do not use any user defined vars in here such as {app}
// Result := not ( CheckProcessRunning( 'apq-client-service.exe', 'apq-client-service' ));
......@@ -227,5 +240,17 @@ begin
CheckProcessRunning( 'apq-info.exe', 'apq客户端插件' )
CheckProcessRunning( 'apq-register.exe', 'apq客户端插件' )
CheckProcessRunning( 'apq.exe', 'apq客户端桌面' )
RegQueryStringValue(HKLM, 'SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x64', 'Version', CurVer);
CurVerStr := Copy(CurVer,2,2);
if CurVerStr = '14' then
begin
vc9SP1Missing := false;
end
else begin
vc9SP1Missing := true;
end;
Result := not ( CheckProcessRunning( 'apq-client.exe', 'apq-client客户端' ));
end;
\ No newline at end of file
......@@ -62,6 +62,7 @@ Name: "chinese"; MessagesFile: "compiler:Languages/Chinese.isl"
Source: "../apq-client/*"; Excludes: "bak,*.iss"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs;
Source: "../../java/x64/jre/*"; DestDir: "{app}/jre"; Flags: ignoreversion recursesubdirs createallsubdirs;
Source: "../../dact/x64/*"; DestDir: "{app}/service/dact"; Flags: ignoreversion recursesubdirs createallsubdirs;
Source: "../../runtime/VC_redist.x64.exe"; DestDir: "{app}/service/runtime"; Flags: ignoreversion recursesubdirs createallsubdirs;
Source: "../../core/*"; DestDir: "{app}/service/core"; Flags: ignoreversion recursesubdirs createallsubdirs;
Source: "../../vnc/x64/*"; DestDir: "{app}/vnc"; Flags: ignoreversion recursesubdirs createallsubdirs;
Source: "../../client/x64/*"; Excludes: "apq.exe"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs;
......@@ -77,6 +78,7 @@ Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\client-soft\apq.exe";
Filename: "{app}\Set_Env.bat"; Flags: runhidden;
Filename: "{app}\service\启动服务.bat"; Flags: runhidden runascurrentuser waituntilterminated;
Filename: "{app}\vnc\setup.bat"; Flags: skipifdoesntexist runhidden
Filename: {app}\service\runtime\VC_redist.x64.exe; Parameters: /q; WorkingDir: {tmp}; Flags: skipifdoesntexist; StatusMsg: "Installing Microsoft Visual C++ Runtime ..."; Check: NeedInstallVC9SP1
;Filename: "{app}\vnc\UltraVNC_1_2_40_X64_Setup.exe"; Flags: skipifdoesntexist runhidden
;Filename:"{cmd}";Parameters:"/c REG ADD ""HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"" /v ""{app}\example.exe"" -t REG_SZ /d RUNASADMIN /f "; StatusMsg: "注册管理员权限...";
;Filename:"{cmd}";Parameters:"/c ""{app}\vnc\UltraVNC_1_2_40_X64_Setup.exe"" /loadinf=""{app}\vnc\vnc.ini"" /silent"; Flags: skipifdoesntexist runhidden;
......@@ -96,6 +98,14 @@ Root: HKLM; Subkey: "Software\{#MyAppEnName}"; Flags: uninsdeletekey;
;Root: HKCU; Subkey: "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"; ValueType:string;ValueName:"{app}/vnc/UltraVNC_1_2_40_X64_Setup.exe";ValueData:"RUNASADMIN"
[Code]
var
vc9SP1Missing: Boolean;
function NeedInstallVC9SP1(): Boolean;
begin
Result := vc9SP1Missing;
end;
function GetMD5OfStringApq(Password: String): string;
begin
Result := GetMD5OfString(Password);
......@@ -230,6 +240,9 @@ end;
// Perform some initializations. Return False to abort setup
function InitializeSetup: Boolean;
var
CurVer: string;
CurVerStr: string;
begin
// Do not use any user defined vars in here such as {app}
// Result := not ( CheckProcessRunning( 'apq-client-service.exe', 'apq-client-service' ));
......@@ -237,5 +250,17 @@ begin
CheckProcessRunning( 'apq-info.exe', 'apq客户端插件' )
CheckProcessRunning( 'apq-register.exe', 'apq客户端插件' )
CheckProcessRunning( 'apq.exe', 'apq客户端桌面' )
RegQueryStringValue(HKLM, 'SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x64', 'Version', CurVer);
CurVerStr := Copy(CurVer,2,2);
if CurVerStr = '14' then
begin
vc9SP1Missing := false;
end
else begin
vc9SP1Missing := true;
end;
Result := not ( CheckProcessRunning( 'apq-client.exe', 'apq-client客户端' ));
end;
\ No newline at end of file
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "阿普奇检测客户端T"
#define MyAppVersion "V1.0"
#define MyAppPublisher "阿普奇"
#define MyAppURL "https://www.apq.com/"
#define MyAppDirName "apq-client2"
#define MyAppEnName "apq-client2"
#define MyAppExeName "apq-client2.exe"
; apq-iot-client
#define MyAppInstallPwd "2a96d11973c7caa1a72eb816d7db6d17"
; hk-remove2022
#define MyAppUnInstallPwd "5b559ab76c08f97b5bd6c3a852e44141"
[Setup]
; 注: AppId的值为单独标识该应用程序。
; 不要为其他安装程序使用相同的AppId值。
; (生成新的GUID,点击 工具|在IDE中生成GUID。)
; Tell Windows Explorer to reload the environment
ChangesEnvironment=yes
DisableDirPage=no
; AlwaysRestart=yes
AppId={{1394783A-5D3C-48CD-111-E2DFBB844E42}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppVerName={#MyAppName}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppDirName}
DefaultGroupName={#MyAppName}
SetupIconFile=logo.ico
;安装包文件输出目录
OutputDir=..\dist\
;安装包文件名
OutputBaseFilename={#MyAppName}_x32
;压缩文件
Compression=lzma
SolidCompression=yes
;以管理员权限运行
PrivilegesRequired=admin
UninstallDisplayIcon={app}/{#MyAppExeName}
//CreateUninstallRegKey=no
//UpdateUninstallLogAppName=no
VersionInfoVersion=1.0.0.1
[Languages]
Name: "chinese"; MessagesFile: "compiler:Languages/Chinese.isl"
[Files]
Source: "../apq-client/*"; Excludes: "bak,*.iss"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs;
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\client-soft\apq.exe";
;卸载后执行的操作(停止、删除各种服务)
[UninstallRun]
Filename: "{app}\service\删除服务.bat"; Flags: runhidden;
;卸载后删除目录所有文件,删除空目录
[UninstallDelete]
Type: filesandordirs; Name: "{app}\*"
Type: dirifempty; Name: "{app}"
;操作注册表
[Registry]
Root: HKLM; Subkey: "Software\{#MyAppEnName}"; Flags: uninsdeletekey;
[Code]
function InitializeSetup: Boolean;
var
Path,tmppath:string ;
ResultCode: Integer;
dotNetV2RegPath:string;
dotNetV2DownUrl:string;
dotNetV2PackFile:string;
begin
dotNetV2RegPath:='SOFTWARE\Microsoft\.NETFramework\Policy\v4.0';
dotNetV2DownUrl:='http://dl1sw.baidu.com/soft/9b/15910/Microsoft.NET.exe?version=585709662';
dotNetV2PackFile:='{src}\dotNetFx40_Full_x86_x64.exe';
//先在注册表查找.net4.0是否存在
if RegKeyExists(HKLM, dotNetV2RegPath) then
begin
Result := true;
end
//如果注册表里面没有发现.net4.0
else
begin
if MsgBox('系统检测到您没有安装.Net Framework4.0运行环境,是否立即安装?', mbConfirmation, MB_YESNO) = idYes then
begin
//和setup同级目录下的donet安装包
Path := ExpandConstant(dotNetV2PackFile);
//先抽取到临时目录
tmppath := ExpandConstant('{tmp}\dotNetFx40_Full_x86_x64.exe');
ExtractTemporaryFile('dotNetFx40_Full_x86_x64.exe');
msgbox(tmppath, mbConfirmation, MB_YESNO);
Exec(tmppath, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
if(FileOrDirExists(tmppath)) then
begin
Exec(tmppath, '/q', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
if RegKeyExists(HKLM, dotNetV2RegPath) then
begin
Result := true;
end
else
begin
MsgBox('未能成功安装.Net Framework4.0运行环境,系统将无法运行,本安装程序即将退出!',mbInformation,MB_OK);
end
end
else
begin
if MsgBox('软件安装目录中没有包含.Net Framework4.0的安装程序,是否立即下载后安装?', mbConfirmation, MB_YESNO) = idYes then
begin
Path := ExpandConstant('{pf}/Internet Explorer/iexplore.exe');
Exec(Path, dotNetV2DownUrl , '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
MsgBox('请安装好.Net Framework4.0环境后,再运行本安装包程序!',mbInformation,MB_OK);
Result := false;
end
else
begin
MsgBox('不下载安装.Net Framework4.0运行环境,系统将无法运行,本安装程序即将退出!',mbInformation,MB_OK);
Result := false;
end
end
end
else
begin
MsgBox('没有安装.Net Framework2.0运行环境,系统将无法运行,本安装程序即将退出!',mbInformation,MB_OK);
Result := false;
end;
end;
end;
\ No newline at end of file
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "My Program"
#define MyAppVersion "1.5"
#define MyAppPublisher "My Company, Inc."
#define MyAppURL "http://www.example.com/"
[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{1247B7CA-0724-4AD0-A70B-1E92242D3AA7}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputDir=E:\proTest
OutputBaseFilename=setup100x86
Compression=lzma
SolidCompression=yes
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
[Files]
Source: "E:\proTest\vcredist_x86.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "E:\proTest\vcredist_x64.exe"; DestDir: "{app}"; Flags: ignoreversion
;Source: "E:\proTest\apache-tomcat-7.0.85\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
;Ĭװvcredist_x86.exe
[Run]
Filename: {app}\vcredist_x86.exe; Parameters: /q; WorkingDir: {tmp}; Flags: skipifdoesntexist; StatusMsg: "Installing Microsoft Visual C++ Runtime ..."; Check: NeedInstallVC9SP1
Filename: {app}\vcredist_x64.exe; Parameters: /q; WorkingDir: {tmp}; Flags: skipifdoesntexist; StatusMsg: "Installing Microsoft Visual C++ Runtime ..."; Check: NeedInstallVC9SP2
[Code]
var
vc9SP1Missing: Boolean;
vc9SP2Missing: Boolean;
function NeedInstallVC9SP1(): Boolean;
begin
Result := vc9SP1Missing;
end;
function NeedInstallVC9SP2(): Boolean;
begin
Result := vc9SP2Missing;
end;
function InitializeSetup(): Boolean;
var
version: Cardinal;
begin
if RegQueryDWordValue(HKLM, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{196BB40D-1578-3D01-B289-BEFC77A11A1E}', 'Version', version) = false
then
begin
vc9SP1Missing := true;
end;
if RegQueryDWordValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}', 'Version', version) = false
then
begin
vc9SP2Missing := true;
end;
result := true;
end;
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论