提交 75c88562 authored 作者: wangqiang's avatar wangqiang

客户端更新

上级 d2b3d16a
......@@ -24,7 +24,7 @@ public class InstalledProgramCache {
private static List<Map<String, String>> programList;
private static final List<String> programInfoKey4NameCache = new ArrayList<>();
private static final Map<String, String> programInfoKey4NameCache = new HashMap<>();
public List<Map<String, String>> getPrograms() throws IOException {
// if (programList == null) loadProgramListJob();
......@@ -32,8 +32,7 @@ public class InstalledProgramCache {
}
// @Scheduled(fixedDelay = 1800000)
@Scheduled(fixedDelay = 180000)
@Scheduled(fixedDelay = 240000)
public void loadProgramListJob() {
log.info("load安装程序开始");
programInfoKey4NameCache.clear();
......@@ -64,13 +63,12 @@ public class InstalledProgramCache {
log.info("load安装程序结束,programs:{}", programs);
}
private static final Map<String, Map<String, String>> programInfoCache = new ConcurrentHashMap<>();
private static Map<String, Map<String, String>> programInfoCache = new ConcurrentHashMap<>();
private Map<String, String> queryProgramInfo(String key) throws IOException {
if (programInfoCache.containsKey(key)) {
Map<String, String> infoCache = programInfoCache.get(key);
if (infoCache.containsKey("name") && !programInfoKey4NameCache.contains(infoCache.get("name"))) {
programInfoKey4NameCache.add(infoCache.get("name"));
if (infoCache.containsKey("name") && !programInfoKey4NameCache.containsKey(infoCache.get("name"))) {
return infoCache;
}
return null;
......@@ -102,17 +100,81 @@ public class InstalledProgramCache {
process.destroy();
}
// if (!Objects.equals(MapUtil.getStr(info, "publisher"), "Microsoft Corporation") && !Objects.equals(MapUtil.getStr(info, "systemComponent"), "0x1")) {
programInfoCache.put(key, info);
// }
if (info.containsKey("name") && !programInfoKey4NameCache.contains(info.get("name"))) {
programInfoKey4NameCache.add(info.get("name"));
if (info.containsKey("name")/* && !programInfoKey4NameCache.containsKey(info.get("name"))*/) {
programInfoKey4NameCache.put(info.get("name"), key);
return info;
}
return null;
}
public void updateProgramInfoCacheByName(String name) throws Exception {
if (programInfoKey4NameCache.containsKey(name)) {
String nameForKey = programInfoKey4NameCache.get(name);
programInfoCache.remove(nameForKey);
Map<String, String> queryProgramInfoMap = queryProgramInfo(nameForKey);
if (null != queryProgramInfoMap) {
Integer removeIndex = null;
for (int i = 0; i < programList.size(); i++) {
Map<String, String> programListOneMap = programList.get(i);
if (StrUtil.equals(programListOneMap.get("name"), name)) {
removeIndex = i;
break;
}
}
if (null != removeIndex) {
programList.remove(removeIndex);
}
programList.add(queryProgramInfoMap);
} else {
clearProgramInfoCache();
loadProgramListJob();
}
}
}
public void updateProgramInfoCacheByNameAndVersion(String name, String version) throws Exception {
if (programInfoKey4NameCache.containsKey(name)) {
String nameForKey = programInfoKey4NameCache.get(name);
programInfoCache.remove(nameForKey);
Map<String, String> queryProgramInfoMap = new HashMap<>();
Integer removeIndex = null;
for (int i = 0; i < programList.size(); i++) {
Map<String, String> programListOneMap = programList.get(i);
if (StrUtil.equals(programListOneMap.get("name"), name)) {
removeIndex = i;
break;
}
}
if (null != removeIndex) {
programList.remove(removeIndex);
}
queryProgramInfoMap.put("name", name);
queryProgramInfoMap.put("version", version);
programList.add(queryProgramInfoMap);
}
}
public void clearProgramInfoCacheByName(String name) throws Exception {
if (programInfoKey4NameCache.containsKey(name)) {
String nameForKey = programInfoKey4NameCache.get(name);
programInfoCache.remove(nameForKey);
Integer removeIndex = null;
for (int i = 0; i < programList.size(); i++) {
Map<String, String> programListOneMap = programList.get(i);
if (StrUtil.equals(programListOneMap.get("name"), name)) {
removeIndex = i;
break;
}
}
if (null != removeIndex) {
programList.remove(removeIndex);
}
}
}
// 30分钟清除一次缓存
@Scheduled(fixedDelay = 1800000)
public void clearProgramInfoCache() {
......
......@@ -408,7 +408,7 @@ public class MqttServiceImpl implements MqttService, MqttHandler, MqttClientCall
log.info("收到语音通话请求");
try {
boolean hasApqExeProcess = WinExecuteUtils.findProcess("apq.exe");
if(!hasApqExeProcess) {
if (!hasApqExeProcess) {
String apqExePath = ParseUrlUtil.parseAbsolutePath("apq.exe", "../../../tools/install-package/client/x64/client-soft", "../client-soft");
ProcessExtensionsApqUtil.apq_CreateProcessAsUser(apqExePath);
}
......@@ -763,9 +763,10 @@ public class MqttServiceImpl implements MqttService, MqttHandler, MqttClientCall
params.put("macAddress", mac);
Map<String, String> map = System.getenv();
String userName = map.get("USERNAME");// 获取用户名
String computerName = map.get("COMPUTERNAME");// 获取计算机名
params.put("name", computerName + "-" + userName);
params.put("name", computerName);
// String userName = map.get("USERNAME");// 获取用户名
// params.put("name", computerName + "-" + userName);
String remoteDeviceVoJson = HttpUtil.post(gateway + deviceInfo, JSONUtil.toJsonStr(params), 5000);
RemoteDeviceVoResult remoteDeviceVo = JSONUtil.toBean(remoteDeviceVoJson, RemoteDeviceVoResult.class);
......
......@@ -93,10 +93,12 @@ public class ConfigController {
"{\"code\":\"gpuTemp\",\"name\":\"GPU温度\",\"frequency\":60}," +
"{\"code\":\"mac\",\"name\":\"MAC地址\",\"frequency\":60}," +
"{\"code\":\"ethernet\",\"name\":\"网络网卡\",\"frequency\":60}," +
"{\"code\":\"memoryAvailable\",\"name\":\"内存使用率\",\"frequency\":60}," +
"{\"code\":\"memoryAvailable\",\"name\":\"内存剩余\",\"frequency\":60}," +
"{\"code\":\"memoryCap\",\"name\":\"内存容量\",\"frequency\":60}," +
"{\"code\":\"memoryOccupyRate\",\"name\":\"内存占用率\",\"frequency\":60}," +
"{\"code\":\"diskModel\",\"name\":\"磁盘型号\",\"frequency\":60}," +
"{\"code\":\"diskCap\",\"name\":\"磁盘容量\",\"frequency\":60}," +
"{\"code\":\"diskSpeed\",\"name\":\"磁盘传输速度\",\"frequency\":60}," +
"{\"code\":\"diskTemp\",\"name\":\"磁盘温度\",\"frequency\":60}," +
"{\"code\":\"diskFree\",\"name\":\"磁盘剩余量\",\"frequency\":60}" +
"]");
......
......@@ -52,7 +52,7 @@ public class DeviceInfoController {
FileSystem[] diskStores;
try {
String diskStoresFromOshiJson = Oshi4NoneSigarUtil.getDiskStoresModelFromOshiJson();
String diskStoresFromOshiJson = Oshi4NoneSigarUtil.getDiskStoresModelJsonFromOshi();
if (null != diskStoresFromOshiJson) {
diskModel = JSONUtil.parseObj(diskStoresFromOshiJson);
}
......
......@@ -401,45 +401,43 @@ public class ProgramController {
System.out.println(11);
}
@Scheduled(fixedDelay = 120000)
@Scheduled(fixedDelay = 360000)
protected void autoUpgradeJob() {
try {
String controlRequestTimeStr = SysConfigUtil.getProperty("control.request.time");
if (StrUtil.isNotBlank(controlRequestTimeStr) && System.currentTimeMillis() - NumberUtil.toBigDecimal(controlRequestTimeStr).longValue() < 120 * 1000) {
boolean autoUpgrade = Convert.toBool(SysConfigUtil.getProperty("auto.upgrade"), true);
if (!autoUpgrade) return;
String downloadPath = SysConfigUtil.getProperty("download.path",
System.getProperty("user.dir").substring(0, 3) + "apqdownloads");
File dir = new File(downloadPath);
if (!dir.exists()) dir.mkdirs();
list("upgrade", 1, 10000).getData().getRecords()
.parallelStream()
.filter(m -> ObjectUtil.notEqual(m.get("version"), m.get("localVersion")))
.forEach(m -> {
String url = m.get("url");
String fileName = url.substring(url.lastIndexOf("/") + 1);
File fileE = new File(downloadPath + File.separator + fileName);
if (!fileE.exists()) {
HttpResponse rsp = HttpUtil.createGet(url).execute(true);
fileE = rsp.writeBodyForFile(dir, null);
}
int exitVal = -1;
try {
String exeCmd = "autoExe.bat \"" + fileE.getPath() + "\"";
ProcessExtensionsApqUtil.apq_CreateProcessAsUser(exeCmd);
log.info("执行安装文件 {} ", exeCmd);
boolean autoUpgrade = Convert.toBool(SysConfigUtil.getProperty("auto.upgrade"), true);
if (!autoUpgrade) return;
String downloadPath = SysConfigUtil.getProperty("download.path",
System.getProperty("user.dir").substring(0, 3) + "apqdownloads");
File dir = new File(downloadPath);
if (!dir.exists()) dir.mkdirs();
list("upgrade", 1, 10000).getData().getRecords()
.parallelStream()
.filter(m -> ObjectUtil.notEqual(m.get("version"), m.get("localVersion")))
.forEach(m -> {
String url = m.get("url");
String fileName = url.substring(url.lastIndexOf("/") + 1);
File fileE = new File(downloadPath + File.separator + fileName);
if (!fileE.exists()) {
HttpResponse rsp = HttpUtil.createGet(url).execute(true);
fileE = rsp.writeBodyForFile(dir, null);
}
int exitVal = -1;
try {
String exeCmd = "autoExe.bat \"" + fileE.getPath() + "\"";
ProcessExtensionsApqUtil.apq_CreateProcessAsUser(exeCmd);
log.info("执行安装文件 {} ", exeCmd);
// Runtime.getRuntime().exec("cmd /c \"C:\\apqdownloads\\f65fe478633c43f493a0b60d13717504.exe\" /sp- /silent /norestart /suppressmsgboxes");
} catch (Exception e) {
log.error("执行安装文件 {} 失败", fileE.getPath(), e);
}
log.info("执行安装文件 ==============");
if (exitVal == 0) {
String reqUrl = gateway + StrUtil.format(upgradeStatusUpIssueUrl, MacAddrUtil.get(), m.get("id"));
HttpUtil.post(reqUrl, (String) null);
}
});
}
installedProgramCache.updateProgramInfoCacheByNameAndVersion(m.get("name"), m.get("version"));
} catch (Exception e) {
log.error("执行安装文件 {} 失败", fileE.getPath(), e);
}
log.info("执行安装文件 ==============");
if (exitVal == 0) {
String reqUrl = gateway + StrUtil.format(upgradeStatusUpIssueUrl, MacAddrUtil.get(), m.get("id"));
HttpUtil.post(reqUrl, (String) null);
}
});
} catch (Exception e) {
log.error("自动升级任务执行异常", e);
}
......
VID_0471&PID_485D 深思洛克(senseLock) SenseIV2.x 深思洛克 sense4 senseIV 深思4 有驱
VID_0471&PID_485E 深思洛克(senseLock) SenseIV2.x 深思洛克 sense4 senseIV 深思4 无驱
VID_04B4&PID_4A58 深思洛克(SenseLock) 深思 3(sense3)加密狗, 无驱型
VID_04B4&PID_4A59 深思洛克(SenseLock) 深思 3(sense3)加密狗, 有驱型
VID_04B9&PID_0300 赛耐孚(SafeNet) USB SuperPro / UltraPro
VID_04B9&PID_0301 赛耐孚(SafeNet) USB Security Security Token
VID_04B9&PID_0302 赛耐孚(SafeNet) USB Security Security Token
VID_04B9&PID_0303 赛耐孚(SafeNet) USB Security Security Token
VID_04B9&PID_0304 赛耐孚(SafeNet) USB Security Security Token
VID_04B9&PID_8000 赛耐孚(SafeNet) Sentinel Hardware Key
VID_04B9&PID_8001 赛耐孚(SafeNet) Sentinel Hardware Key RTC
VID_04B9&PID_8002 赛耐孚(SafeNet) Sentinel Hardware Key Mega - Memory
VID_04B9&PID_8003 赛耐孚(SafeNet) Sentinel Hardware Key Mega - Memory RTC
VID_04B9&PID_8004 赛耐孚(SafeNet) Sentinel Dual Hardware Key
VID_04B9&PID_8005 赛耐孚(SafeNet) Sentinel Dual Hardware Key RTC
VID_0529&PID_0001 阿拉丁(Aladdin) HASP HL Time 有驱型
VID_064F&PID_0BD7 WIBU WIBU U + 加密狗, 有驱型
VID_064F&PID_0BD8 WIBU WIBU RU + 加密狗, 有驱型
VID_064F&PID_OBD8 WIBU WIBURU + 加密狗, 有驱型
VID_0830&PID_2002 和升达 SK - USB180 无驱型
VID_08E2&PID_0002 赛孚耐(SafeNet) safenet microdog UMI 彩虹加密狗 微狗
VID_08E2&PID_0004 赛孚耐(SafeNet) safenet softdog UDA 彩虹加密狗 软件狗
VID_08E2&PID_0005 赛孚耐(SafeNet) 精灵狗UGA(GeniusDog), 有驱型
VID_08E2&PID_0006 赛孚耐(SafeNet) safenet GrandDog 宏狗UGRA, 有驱型
VID_08E2&PID_0008 赛孚耐(SafeNet) safenet SuperDog 超级狗
VID_0925&PID_5624 世纪龙脉(Century Longmai) DAM2 加密狗, 无驱型
VID_0925&PID_5906 世纪龙脉(Century Longmai) NOX 定制狗, 无驱型
VID_0925&PID_6B05 世纪龙脉(Century Longmai) NOX 加密狗, 无驱型
VID_0925&PID_7122 世纪龙脉(Century Longmai) DAM2 + 加密狗, 无驱型
VID_0925&PID_7504 世纪龙脉(Century Longmai) NOX5 主锁
VID_0925&PID_7816 世纪龙脉(Century Longmai) NOX 时钟狗, 无驱型
VID_0925&PID_7A13 世纪龙脉(Century Longmai) DAM2 + 网络狗, 无驱型
VID_0925&PID_7A21 世纪龙脉(Century Longmai) NOX2 加密狗, 无驱型
VID_0925&PID_8705 世纪龙脉(Century Longmai) NOX5 加密狗 智能狗, 无驱型
VID_0925&PID_9627 世纪龙脉(Century Longmai) NOX + 单机狗, 无驱型
VID_0925&PID_A508 北京磐石诚信NT系列加密狗
VID_096E&PID_0001 飞天诚信(ftsafe) 飞天4有驱型 加密锁 ROCKEY 4 Rockey4 R4
VID_096E&PID_0006 飞天诚信(ftsafe) 飞天4无驱型 加密锁 rockey 4 nd ROCKEY4ND R4nd
VID_096E&PID_0201 飞天诚信(ftsafe) 飞天2无驱型 加密锁 rockey 2 ROCKEY2 R2
VID_096E&PID_0202 飞天诚信(FTSafe) Rockey 3 智能狗, 无驱型
VID_096E&PID_0205 飞天诚信(FTSafe) Rockey 1 智能狗, 无驱型
VID_096E&PID_0207 飞天诚信(FTSafe) Rockey 1 智慧型, 无驱型
VID_096E&PID_0209 坚石诚信(FTSafe) ARM 时钟智能狗
VID_096E&PID_0303 坚石诚信(Rockey) ET99 Token ET99 / ET299 加密狗, 无驱型
VID_096E&PID_0304 坚石诚信(Rockey) ET199 Token ET199 智能狗, 无驱型
VID_096E&PID_0403 飞天诚信(ftsafe) 飞天6无驱型 加密锁 rockey6 smart R6
VID_10F7&PID_8469 MegaLock 无驱型
VID_1199&PID_8282 域天(域之天) 域之天 域天 简单型 加密锁
VID_1312&PID_1912 域天(域之天)域之天 域天 32位智能型(有驱型)
VID_1312&PID_2012 域天(域之天)域之天 域天 32位智能型 易用型智能锁 加密锁 无驱
VID_1BC0&PID_1001 深思洛克(SenseLock) 灵锐 I(Living) 加密狗, 无驱型
VID_1BC0&PID_8013 深思洛克(SenseLock) 精锐 E(Elite - E)智能狗, 无驱型
VID_1BC0&PID_8101 深思洛克(SenseLock) 灵锐 定制加密狗, 无驱型
VID_1BC0&PID_8113 深思洛克(SenseLock) OME速达3000 Pro, 无驱型
VID_3689&PID_3689 EncryptPE 订制型(域天)EPE OEM加密狗 域天密码型 EncryptPE订制型
VID_3689&PID_8762 域天(域之天) 域之天 域天 密码型 加密锁
VID_5042&PID_???? 江波龙(NetCom) 安全芯(SChip) 加密狗, 有驱型
VID_5042&PID_FFFF 安全芯 schip 安全芯UKF - 002
VID_5149&PID_???? 江波龙(NetCom) 易锁(SimpleKey)加密狗, 无驱型
VID_5149&PID_EACE 杭州唯赛 易锁(Simple Key) 无驱型
VID_6A75&PID_9801 上海十条电子 JSP - C USB Key 有驱型
VID_7F5E&PID_DE5D 广州飞盾NT系列加密锁
VID_83D3&PID_3773 域天(域之天) 域之天 域天 专业型 / 经济易用型 加密锁
\ No newline at end of file
VID_0471&PID_485D 深思洛克(senseLock) SenseIV2.x 深思洛克 sense4 senseIV 深思4 有驱
VID_0471&PID_485E 深思洛克(senseLock) SenseIV2.x 深思洛克 sense4 senseIV 深思4 无驱
VID_04B4&PID_4A58 深思洛克(SenseLock) 深思 3(sense3)加密狗, 无驱型
VID_04B4&PID_4A59 深思洛克(SenseLock) 深思 3(sense3)加密狗, 有驱型
VID_04B9&PID_0300 赛耐孚(SafeNet) USB SuperPro / UltraPro
VID_04B9&PID_0301 赛耐孚(SafeNet) USB Security Security Token
VID_04B9&PID_0302 赛耐孚(SafeNet) USB Security Security Token
VID_04B9&PID_0303 赛耐孚(SafeNet) USB Security Security Token
VID_04B9&PID_0304 赛耐孚(SafeNet) USB Security Security Token
VID_04B9&PID_8000 赛耐孚(SafeNet) Sentinel Hardware Key
VID_04B9&PID_8001 赛耐孚(SafeNet) Sentinel Hardware Key RTC
VID_04B9&PID_8002 赛耐孚(SafeNet) Sentinel Hardware Key Mega - Memory
VID_04B9&PID_8003 赛耐孚(SafeNet) Sentinel Hardware Key Mega - Memory RTC
VID_04B9&PID_8004 赛耐孚(SafeNet) Sentinel Dual Hardware Key
VID_04B9&PID_8005 赛耐孚(SafeNet) Sentinel Dual Hardware Key RTC
VID_0529&PID_0001 阿拉丁(Aladdin) HASP HL Time 有驱型
VID_064F&PID_0BD7 WIBU WIBU U + 加密狗, 有驱型
VID_064F&PID_0BD8 WIBU WIBU RU + 加密狗, 有驱型
VID_064F&PID_OBD8 WIBU WIBURU + 加密狗, 有驱型
VID_0830&PID_2002 和升达 SK - USB180 无驱型
VID_08E2&PID_0002 赛孚耐(SafeNet) safenet microdog UMI 彩虹加密狗 微狗
VID_08E2&PID_0004 赛孚耐(SafeNet) safenet softdog UDA 彩虹加密狗 软件狗
VID_08E2&PID_0005 赛孚耐(SafeNet) 精灵狗UGA(GeniusDog), 有驱型
VID_08E2&PID_0006 赛孚耐(SafeNet) safenet GrandDog 宏狗UGRA, 有驱型
VID_08E2&PID_0008 赛孚耐(SafeNet) safenet SuperDog 超级狗
VID_0925&PID_5624 世纪龙脉(Century Longmai) DAM2 加密狗, 无驱型
VID_0925&PID_5906 世纪龙脉(Century Longmai) NOX 定制狗, 无驱型
VID_0925&PID_6B05 世纪龙脉(Century Longmai) NOX 加密狗, 无驱型
VID_0925&PID_7122 世纪龙脉(Century Longmai) DAM2 + 加密狗, 无驱型
VID_0925&PID_7504 世纪龙脉(Century Longmai) NOX5 主锁
VID_0925&PID_7816 世纪龙脉(Century Longmai) NOX 时钟狗, 无驱型
VID_0925&PID_7A13 世纪龙脉(Century Longmai) DAM2 + 网络狗, 无驱型
VID_0925&PID_7A21 世纪龙脉(Century Longmai) NOX2 加密狗, 无驱型
VID_0925&PID_8705 世纪龙脉(Century Longmai) NOX5 加密狗 智能狗, 无驱型
VID_0925&PID_9627 世纪龙脉(Century Longmai) NOX + 单机狗, 无驱型
VID_0925&PID_A508 北京磐石诚信NT系列加密狗
VID_096E&PID_0001 飞天诚信(ftsafe) 飞天4有驱型 加密锁 ROCKEY 4 Rockey4 R4
VID_096E&PID_0006 飞天诚信(ftsafe) 飞天4无驱型 加密锁 rockey 4 nd ROCKEY4ND R4nd
VID_096E&PID_0201 飞天诚信(ftsafe) 飞天2无驱型 加密锁 rockey 2 ROCKEY2 R2
VID_096E&PID_0202 飞天诚信(FTSafe) Rockey 3 智能狗, 无驱型
VID_096E&PID_0205 飞天诚信(FTSafe) Rockey 1 智能狗, 无驱型
VID_096E&PID_0207 飞天诚信(FTSafe) Rockey 1 智慧型, 无驱型
VID_096E&PID_0209 坚石诚信(FTSafe) ARM 时钟智能狗
VID_096E&PID_0303 坚石诚信(Rockey) ET99 Token ET99 / ET299 加密狗, 无驱型
VID_096E&PID_0304 坚石诚信(Rockey) ET199 Token ET199 智能狗, 无驱型
VID_096E&PID_0403 飞天诚信(ftsafe) 飞天6无驱型 加密锁 rockey6 smart R6
VID_10F7&PID_8469 MegaLock 无驱型
VID_1199&PID_8282 域天(域之天) 域之天 域天 简单型 加密锁
VID_1312&PID_1912 域天(域之天)域之天 域天 32位智能型(有驱型)
VID_1312&PID_2012 域天(域之天)域之天 域天 32位智能型 易用型智能锁 加密锁 无驱
VID_1BC0&PID_1001 深思洛克(SenseLock) 灵锐 I(Living) 加密狗, 无驱型
VID_1BC0&PID_8013 深思洛克(SenseLock) 精锐 E(Elite - E)智能狗, 无驱型
VID_1BC0&PID_8101 深思洛克(SenseLock) 灵锐 定制加密狗, 无驱型
VID_1BC0&PID_8113 深思洛克(SenseLock) OME速达3000 Pro, 无驱型
VID_3689&PID_3689 EncryptPE 订制型(域天)EPE OEM加密狗 域天密码型 EncryptPE订制型
VID_3689&PID_8762 域天(域之天) 域之天 域天 密码型 加密锁
VID_5042&PID_???? 江波龙(NetCom) 安全芯(SChip) 加密狗, 有驱型
VID_5042&PID_FFFF 安全芯 schip 安全芯UKF - 002
VID_5149&PID_???? 江波龙(NetCom) 易锁(SimpleKey)加密狗, 无驱型
VID_5149&PID_EACE 杭州唯赛 易锁(Simple Key) 无驱型
VID_6A75&PID_9801 上海十条电子 JSP - C USB Key 有驱型
VID_7F5E&PID_DE5D 广州飞盾NT系列加密锁
VID_83D3&PID_3773 域天(域之天) 域之天 域天 专业型 / 经济易用型 加密锁
\ No newline at end of file
......@@ -17,11 +17,7 @@ import org.springframework.web.client.RestTemplate;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.*;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
......@@ -226,12 +222,30 @@ public class ApqControlJob {
}
}
public void testUsb() {
public static void testHwPort() {
// APQ_HWPORT_STORAGE_PERM_ALLOW APQ_HWPORT_STORAGE_PERM_DENY
int result32 = IHwPortController.instanceDll.APQ_HWPORT_set_storage_device_permit(IHwPortController.HwportStorageDevidEnum.APQ_HWPORT_STORAGE_DEVID_UDISK.getCode(), IHwPortController.HwportStoragePermEnum.APQ_HWPORT_STORAGE_PERM_ALLOW.getCode(), null);
// int result32 = IHwPortController.instanceDll.APQ_HWPORT_set_storage_device_permit(IHwPortController.HwportStorageDevidEnum.APQ_HWPORT_STORAGE_DEVID_UDISK.getCode(), IHwPortController.HwportStoragePermEnum.APQ_HWPORT_STORAGE_PERM_ALLOW.getCode(), null);
int result32 = IHwPortController.instanceDll.APQ_HWPORT_set_normal_device_permit(IHwPortController.HwportNormalDevidEnum.APQ_HWPORT_NORMAL_DEVID_DONGLE.getCode(), IHwPortController.HwportNormalPermEnum.APQ_HWPORT_NORMAL_PERM_DENY.getCode(), null);
log.info("APQ_HWPORT_set_storage_device_permit ret:{}", result32);
// int result32 = IHwPortController.instanceDll.APQ_HWPORT_get_normal_device_permit(IHwPortController.HwportNormalDevidEnum.APQ_HWPORT_NORMAL_DEVID_DONGLE.getCode());
// log.info("APQ_HWPORT_get_normal_device_permit ret:{}", result32);
//应用硬件接口管理模块的配置内容
int result5 = IHwPortController.instanceDll.APQ_HWPORT_Apply();
log.info("APQ_HWPORT_Apply ret:{}", result5);
}
public static void main(String[] args) {
// 初始化硬件接口管理模块
int result = IHwPortController.instanceDll.APQ_HWPORT_Initialize();
log.info("APQ_HWPORT_Initialize ret:{}", result);
testHwPort();
//清理硬件接口管理模块
result = IHwPortController.instanceDll.APQ_HWPORT_Uninitialize();
log.info("APQ_HWPORT_Uninitialize ret:{}", result);
}
}
......@@ -8,7 +8,7 @@ import cn.hutool.json.JSONUtil;
import cn.hutool.system.oshi.CpuInfo;
import cn.hutool.system.oshi.OshiUtil;
import com.priusis.utils.CoreTempUtil;
import com.priusis.utils.DiskTempUtil;
import com.priusis.utils.DiskSmartUtil;
import com.priusis.utils.MacAddrUtil;
import com.priusis.utils.Oshi4NoneSigarUtil;
import com.priusis.utils.sigar.SigarUtil;
......@@ -89,6 +89,7 @@ public class ApqInfoJob {
String gpuTemp = "gpuTemp";
String memoryCap = "memoryCap";
String memoryAvailable = "memoryAvailable";
String memoryOccupyRate = "memoryOccupyRate";
String diskSpeed = "diskSpeed";
String diskModel = "diskModel";
String diskCap = "diskCap";
......@@ -99,9 +100,10 @@ public class ApqInfoJob {
Map<String, Object> data = null;
try {
// 上报PC实时信息
String collect = Oshi4NoneSigarUtil.getDiskStoresModelFromOshiJson();
String collect = Oshi4NoneSigarUtil.getDiskStoresModelFromOshi();
String collectForCheck = Oshi4NoneSigarUtil.getDiskStoresModelJsonFromOshi();
// 硬盘型号/ID变化后报警
Map<String, String> hardwareCacheRefresh = JSONUtil.toBean(collect, Map.class);
Map<String, String> hardwareCacheRefresh = JSONUtil.toBean(collectForCheck, Map.class);
checkDiskHardware("hard_disk", hardwareCacheRefresh);
String collect1 = null;
......@@ -130,7 +132,7 @@ public class ApqInfoJob {
try {
FileSystemUsage usage = sigar.getFileSystemUsage(partition.getDirName());
return "\"" + StrUtil.removeSuffix(partition.getDevName(), ":\\") + "盘\":\"" +
new DecimalFormat("#.00").format(100d * usage.getFree() / usage.getTotal()) + "%\"";
new DecimalFormat("#.00").format(100d * (usage.getTotal() - usage.getFree()) / usage.getTotal()) + "%\"";
} catch (SigarException e) {
log.error("SigarException: {}", e.getMessage());
}
......@@ -147,6 +149,7 @@ public class ApqInfoJob {
String cpuModelV = "";
double cpuLoadV = 0;
String memoryAvailableV = "";
double memoryOccupyRateV = 0;
double cpuTempV = 0;
double gpuTempV = 0;
String operatingSystemV = "";
......@@ -158,7 +161,7 @@ public class ApqInfoJob {
baseboardV = Oshi4NoneSigarUtil.getBaseboardWithCache(); // 获取主板信息 缓存;
ipV = InetAddress.getLocalHost().getHostAddress();
ethernetV = SigarUtil.ethernet(sigar);
diskTempV = DiskTempUtil.getDiskTempFromSmart();
diskTempV = DiskSmartUtil.getDeviceTemp();
org.hyperic.sigar.CpuInfo cpuInfo = sigar.getCpuInfoList()[0];
cpuModelV = cpuInfo.getVendor() + " " + cpuInfo.getModel();
......@@ -168,7 +171,12 @@ public class ApqInfoJob {
cpuLoadV = Double.parseDouble(new DecimalFormat("#.00").format(sigar.getCpuPerc().getCombined() * 100));
memoryAvailableV = new DecimalFormat("#,##0.###").format(mem.getFree() / Math.pow(1024, 3));
double memFreeRate = Double.parseDouble(new DecimalFormat("#.00").format(mem.getFree() * 1.0 / mem.getTotal() * 100));
memoryOccupyRateV = Double.parseDouble(new DecimalFormat("#.00").format(100 - memFreeRate));
memoryAvailableV = DataSizeUtil.format(mem.getFree()) + "/" + DataSizeUtil.format(mem.getTotal())
+ "(" + memFreeRate + "%)";
// OperatingSystem OS = OperatingSystem.getInstance();
operatingSystemV = Oshi4NoneSigarUtil.getOsWithCache();
......@@ -199,6 +207,7 @@ public class ApqInfoJob {
.put(isNeedCollection(isNoneEven, gpuTemp, mapParams), gpuTemp, gpuTempV)
.put(isNeedCollection(isNoneEven, memoryCap, mapParams), memoryCap, memoryCapV)
.put(isNeedCollection(isNoneEven, memoryAvailable, mapParams), memoryAvailable, memoryAvailableV)
.put(isNeedCollection(isNoneEven, memoryOccupyRate, mapParams), memoryOccupyRate, memoryOccupyRateV)
.put(isNeedCollection(isNoneEven, diskSpeed, mapParams), diskSpeed, diskSpeedV)
.put(isNeedCollection(isNoneEven, diskTemp, mapParams), diskTemp, diskTempV)
.put(isNeedCollection(isNoneEven, diskModel, mapParams), diskModel, collect)
......@@ -312,7 +321,7 @@ public class ApqInfoJob {
return isNoneEven;
}
public static void main2(String[] args) throws InterruptedException {
public static void main2(String[] args) throws InterruptedException, SigarException {
/*String data = "[" +
"{\"code\":\"cpuLoad\",\"name\":\"CPU负载\",\"frequency\":30}," +
"{\"code\":\"cpuTemp\",\"name\":\"CPU温度\",\"frequency\":30}," +
......@@ -340,20 +349,21 @@ public class ApqInfoJob {
List<ApqInfoDataVo> apqInfoDataVos = JSONUtil.toList(data, ApqInfoDataVo.class);
List<Map> apqInfoDataVos2 = JSONUtil.toList(data, Map.class);*/
System.out.println(OshiUtil.getSensors().getCpuTemperature());
System.out.println(OshiUtil.getHardware().getDiskStores()[0].getModel());
System.out.println(DataSizeUtil.format(OshiUtil.getHardware().getDiskStores()[0].getReads()));
// System.out.println(OshiUtil.getSensors().getCpuTemperature());
// System.out.println(OshiUtil.getHardware().getDiskStores()[0].getModel());
// System.out.println(DataSizeUtil.format(OshiUtil.getHardware().getDiskStores()[0].getReads()));
//System.out.println("CPU内存使用率:" + new DecimalFormat("#.##%").format((OshiUtil.getMemory().getAvailable() * 1.0 / OshiUtil.getMemory().getTotal())));
while (true) {
/*while (true) {
//System.out.println("CPU负载:" + new DecimalFormat("#.##%").format(OshiUtil.getCpuInfo().getUsed() / 100));
//System.out.println("硬盘剩余:" + OshiUtil.getHardware().getDiskStores()[0].getWriteBytes());
System.out.println(getCpuUsed());
Thread.sleep(3);
}
}*/
}
public static double getCpuUsed() {
......@@ -410,9 +420,15 @@ public class ApqInfoJob {
public static void main(String[] args) throws SigarException {
Sigar sigar = new Sigar();
System.out.println(sigar.getCpu().toString());
org.hyperic.sigar.CpuInfo cpuInfo = sigar.getCpuInfoList()[0];
String cpuModelV = cpuInfo.getVendor() + " " + cpuInfo.getModel();
System.out.println(cpuModelV);
// System.out.println(sigar.getCpu().toString());
// org.hyperic.sigar.CpuInfo cpuInfo = sigar.getCpuInfoList()[0];
// String cpuModelV = cpuInfo.getVendor() + " " + cpuInfo.getModel();
// System.out.println(cpuModelV);
Mem mem = sigar.getMem();
String memoryAvailableV = FormatUtil.formatBytesDecimal(mem.getFree()) + "/" + FormatUtil.formatBytesDecimal(mem.getTotal())
+ "(" + Double.parseDouble(new DecimalFormat("#.00").format(mem.getFree() * 1.0 / mem.getTotal() * 100)) + ")";
System.out.println(mem.getFree() * 1.0 / mem.getTotal());
System.out.println(memoryAvailableV);
}
}
package com.priusis.utils;
import cn.hutool.system.oshi.OshiUtil;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.ptr.IntByReference;
import java.util.Arrays;
......@@ -13,9 +15,8 @@ import java.util.Arrays;
*/
public class CoreTemp1Util {
// static final String WR0_DLL_NAME = "CoreTemp";
static final String WR0_DLL_NAME = ParseUrlUtil.parseAbsolutePath("/core/CoreTemp.dll", System.getProperty("user.dir") + "/apq-pc-common");
// static final String WR0_DLL_NAME = "CoreTemp" + (Platform.is64Bit() ? "x64" : "");
static final String coreFromOs = "CoreTemp" + (OshiUtil.getOs().getBitness() == 64 ? "x64" : "");
static final String WR0_DLL_NAME = ParseUrlUtil.parseAbsolutePath("/core/" + coreFromOs + ".dll", System.getProperty("user.dir") + "/apq-pc-common");
static CoreTemp WR0_INSTANCE = Native.loadLibrary(WR0_DLL_NAME, CoreTemp.class);
/**
......
package com.priusis.utils;
import com.sun.jna.NativeLibrary;
import com.sun.jna.ptr.IntByReference;
import java.util.Arrays;
/**
* Java通过JNA调用CoreTemp.dll实现温度采集 方式2
* https://blog.csdn.net/qq_36874292/article/details/89467749
*/
public class CoreTemp2Util {
static final String WR0_DLL_NAME = ParseUrlUtil.parseAbsolutePath("/core/CoreTemp.dll", System.getProperty("user.dir") + "/apq-pc-common");
/**
* CPU温度
*/
public static int getCpuTemp() throws Exception {
NativeLibrary instance = NativeLibrary.getInstance(WR0_DLL_NAME);
IntByReference cpuCoreNum = new IntByReference(0);
int[] cpuTemp = new int[64];
//WinRing0初始化
instance.getFunction("GetCpuTemp").invoke(new Object[]{cpuCoreNum, cpuTemp});
return Arrays.stream(cpuTemp).max().getAsInt();
}
/**
* GPU温度
*/
public static int getGpuTemp() throws Exception {
NativeLibrary instance = NativeLibrary.getInstance(WR0_DLL_NAME);
IntByReference pSensorNum = new IntByReference(0);
int[] gpuTemp = new int[64];
instance.getFunction("GetGpuTemp").invoke(new Object[]{pSensorNum, gpuTemp});
return Arrays.stream(gpuTemp).max().getAsInt();
}
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
while (true) {
NativeLibrary instance = NativeLibrary.getInstance(WR0_DLL_NAME);
IntByReference cpuCoreNum = new IntByReference(0);
int[] cpuTemp = new int[64];
//WinRing0初始化
instance.getFunction("GetCpuTemp").invoke(new Object[]{cpuCoreNum, cpuTemp});
int value = cpuCoreNum.getValue();
System.out.println(value);
for (int i = 0; i < value; i++) {
System.out.println(cpuTemp[i]);
}
IntByReference pSensorNum = new IntByReference(0);
int[] gpuTemp = new int[64];
instance.getFunction("GetGpuTemp").invoke(new Object[]{pSensorNum, gpuTemp});
System.out.println("CPU温度:" + Arrays.stream(cpuTemp).max().getAsInt()); // cpu温度
System.out.println("GPU温度:" + Arrays.stream(gpuTemp).max().getAsInt()); // gpu温度
instance.dispose();
System.out.println("===============================");
Thread.sleep(1500);
}
}
}
......@@ -3,7 +3,7 @@ package com.priusis.utils;
import cn.hutool.system.oshi.OshiUtil;
import com.sun.jna.NativeLibrary;
import com.sun.jna.ptr.IntByReference;
import oshi.software.os.OperatingSystem;
import lombok.extern.slf4j.Slf4j;
import java.util.Arrays;
......@@ -12,30 +12,38 @@ import java.util.Arrays;
* Java通过JNA调用CoreTemp.dll实现温度采集
* https://github.com/boyang987/BLHWScaner
*/
@Slf4j
public class CoreTempUtil {
static final String WR0_DLL_NAME = ParseUrlUtil.parseAbsolutePath("/core/CoreTemp.dll", System.getProperty("user.dir") + "/apq-pc-common");
static final String coreFromOs = "CoreTemp" + (OshiUtil.getOs().getBitness() == 64 ? "x64" : "");
static final String WR0_DLL_NAME = ParseUrlUtil.parseAbsolutePath("/core/" + coreFromOs + ".dll", System.getProperty("user.dir") + "/apq-pc-common");
/**
* CPU温度
*/
public static int[] getCpuAndGpuTemp() throws Exception {
NativeLibrary instance = null;
int[] cpuAndGpuTemp = new int[2];
try {
instance = NativeLibrary.getInstance(WR0_DLL_NAME);
IntByReference cpuCoreNum = new IntByReference(0);
int[] cpuAndGpuTemp = new int[2];
int[] cpuTemp = new int[64];
int[] gpuTemp = new int[64];
//WinRing0初始化
instance.getFunction("GetCpuTemp").invoke(new Object[]{cpuCoreNum, cpuTemp});
int cpuTempV = Arrays.stream(cpuTemp).max().getAsInt();
instance.getFunction("GetGpuTemp").invoke(new Object[]{cpuCoreNum, cpuTemp});
instance.getFunction("GetGpuTemp").invoke(new Object[]{cpuCoreNum, gpuTemp});
int gpuTempV = Arrays.stream(gpuTemp).max().getAsInt();
cpuAndGpuTemp[0] = cpuTempV;
cpuAndGpuTemp[1] = gpuTempV;
return cpuAndGpuTemp;
} catch (Exception e) {
log.error("获取CPU温度异常", e);
cpuAndGpuTemp[0] = 0;
cpuAndGpuTemp[1] = 0;
return cpuAndGpuTemp;
} finally {
if (null != instance) {
WinRing0Util.doDeinitializeOls();
......@@ -57,6 +65,9 @@ public class CoreTempUtil {
//WinRing0初始化
instance.getFunction("GetCpuTemp").invoke(new Object[]{cpuCoreNum, cpuTemp});
return Arrays.stream(cpuTemp).max().getAsInt();
} catch (Exception e) {
log.error("获取CPU温度异常", e);
return 0;
} finally {
if (null != instance) {
WinRing0Util.doDeinitializeOls();
......@@ -79,6 +90,9 @@ public class CoreTempUtil {
instance.getFunction("GetGpuTemp").invoke(new Object[]{pSensorNum, gpuTemp});
return Arrays.stream(gpuTemp).max().getAsInt();
} catch (Exception e) {
log.error("GPU温度", e);
return 0;
} finally {
if (null != instance) {
WinRing0Util.doDeinitializeOls();
......@@ -88,10 +102,43 @@ public class CoreTempUtil {
}
}
/**
* @param args
* @throws Exception
*/
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);
/*while (true) {
NativeLibrary instance = NativeLibrary.getInstance(WR0_DLL_NAME);
IntByReference cpuCoreNum = new IntByReference(0);
int[] cpuTemp = new int[64];
//WinRing0初始化
instance.getFunction("GetCpuTemp").invoke(new Object[]{cpuCoreNum, cpuTemp});
int value = cpuCoreNum.getValue();
System.out.println(value);
for (int i = 0; i < value; i++) {
System.out.println(cpuTemp[i]);
}
IntByReference pSensorNum = new IntByReference(0);
int[] gpuTemp = new int[64];
instance.getFunction("GetGpuTemp").invoke(new Object[]{pSensorNum, gpuTemp});
System.out.println("CPU温度:" + Arrays.stream(cpuTemp).max().getAsInt()); // cpu温度
System.out.println("GPU温度:" + Arrays.stream(gpuTemp).max().getAsInt()); // gpu温度
instance.dispose();
System.out.println("===============================");
Thread.sleep(1500);
}*/
while (true) {
int[] cpuAndGpuTemp = CoreTempUtil.getCpuAndGpuTemp();
System.out.println(cpuAndGpuTemp[0]);
System.out.println(cpuAndGpuTemp[1]);
System.out.println("===============================");
Thread.sleep(1500);
}
}
}
package com.priusis.utils;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.ptr.IntByReference;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import oshi.util.FormatUtil;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
......@@ -22,7 +20,7 @@ import java.util.List;
* https://www.smartmontools.org/
*/
@Slf4j
public class DiskTempUtil {
public class DiskSmartUtil {
static final String SMARTCTL_EXE_PATH = ParseUrlUtil.parseAbsolutePath("/core/smartctl.exe", System.getProperty("user.dir") + "/apq-pc-client");
......@@ -32,12 +30,10 @@ public class DiskTempUtil {
* @return
* @throws IOException
*/
public static String getDiskTempFromSmart() throws IOException {
StringBuffer sb = new StringBuffer();
sb.append("[");
public static Map<String, String> getDiskInfoFromSmart() throws IOException {
Map<String, String> result = new HashMap<>();
Process process = null;
String smartScan = "";
String result = "";
try {
process = Runtime.getRuntime().exec(SMARTCTL_EXE_PATH + " --scan -j"); // AHCI ATA NVMe https://blog.csdn.net/u012459957/article/details/51226658
try (InputStream inputStream = process.getInputStream()) {
......@@ -56,32 +52,36 @@ public class DiskTempUtil {
}
JSONObject smartctlInfoJsonObject = JSONUtil.parseObj(smartctlAinfo);
JSONObject temperature = smartctlInfoJsonObject.getJSONObject("temperature");
if(null == temperature) {
continue;
String diskTemp = "?";
if (null != temperature) {
diskTemp = temperature.getInt("current") + "";
}
Integer diskTemp = temperature.getInt("current");
String serialNumber = smartctlInfoJsonObject.getStr("serial_number");
String modelName = smartctlInfoJsonObject.getStr("model_name");
if (!deviceDataEList.contains(modelName)) {
if (index != 0) {
sb.append(",");
StringBuffer sb = new StringBuffer();
String diskType = "";
if (smartctlAinfo.contains("HHD") || smartctlAinfo.contains("Head_Flying_Hours") || smartctlAinfo.contains("Load_Cycle_Count")) {
diskType = "机械硬盘";
} else if (smartctlAinfo.contains("SSD") || smartctlAinfo.contains("Solid State Device")) {
diskType = "固态硬盘";
}
sb.append("{");
sb.append("\"diskTemp\":\"").append(diskTemp).append("\",");
sb.append("\"modelName\":\"").append(modelName).append("\",");
sb.append("\"diskType\":\"").append(diskType).append("\",");
sb.append("\"serialNumber\":\"").append(serialNumber).append("\"");
sb.append("}");
deviceDataEList.add(modelName);
index++;
result.put(modelName, sb.toString());
}
}
} catch (Exception e) {
log.error("获取硬盘温度smart信息异常", e);
log.error("获取硬盘smart信息异常", e);
}
sb.append("]");
result = sb.toString();
if (null != process && process.isAlive()) {
process.destroy();
......@@ -89,8 +89,39 @@ public class DiskTempUtil {
return result;
}
public static String getDeviceTemp() {
try {
Map<String, String> diskInfoFromSmartMap = DiskSmartUtil.getDiskInfoFromSmart();
StringBuilder sb = new StringBuilder();
for (String key : diskInfoFromSmartMap.keySet()) {
JSONObject diskInfoFromJson = JSONUtil.parseObj(diskInfoFromSmartMap.get(key));
String diskTemp = diskInfoFromJson.getStr("diskTemp");
if (!StrUtil.equals("?", diskTemp)) {
sb.append(key).append(":").append(diskTemp).append("℃");
sb.append(",");
}
}
return sb.substring(0, sb.length() - 1);
} catch (IOException e) {
log.error("获取硬盘温度smart信息异常", e);
}
return "";
}
public static void main(String[] args) throws IOException {
System.out.println(DiskTempUtil.getDiskTempFromSmart());
Map<String, String> diskInfoFromSmartMap = DiskSmartUtil.getDiskInfoFromSmart();
System.out.println(diskInfoFromSmartMap);
StringBuilder sb = new StringBuilder();
for (String key : diskInfoFromSmartMap.keySet()) {
JSONObject diskInfoFromJson = JSONUtil.parseObj(diskInfoFromSmartMap.get(key));
sb.append(key).append(":").append(diskInfoFromJson.getStr("diskTemp")).append("℃");
sb.append(",");
}
System.out.println(sb.substring(0, sb.length() - 1).toString());
}
}
package com.priusis.utils;
import cn.hutool.system.oshi.OshiUtil;
import com.sun.jna.Callback;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import lombok.Getter;
......@@ -67,7 +69,7 @@ public interface IHwPortController extends Library {
*/
//如果本地类库不是线程安全的,可用Native.synchronizedLibrary
IHwPortController instanceDll = (IHwPortController) Native.loadLibrary(ParseUrlUtil.parseAbsolutePath("/dact/Release/HwPortController.dll", System.getProperty("user.dir") + "/apq-pc-common"), IHwPortController.class);
IHwPortController instanceDll = (IHwPortController) Native.loadLibrary(ParseUrlUtil.parseAbsolutePath("/dact/" + (OshiUtil.getOs().getBitness() == 64 ? "x64" : "x32") + "/HwPortController.dll", System.getProperty("user.dir") + "/apq-pc-common"), IHwPortController.class);
/**
* 初始化硬件接口管理模块
......
......@@ -3,12 +3,13 @@ package com.priusis.utils;
import cn.hutool.core.util.StrUtil;
import cn.hutool.system.oshi.OshiUtil;
import lombok.extern.slf4j.Slf4j;
import oshi.SystemInfo;
import org.hyperic.sigar.SigarException;
import oshi.hardware.HWDiskStore;
import oshi.hardware.HWPartition;
import oshi.software.os.OperatingSystem;
import oshi.util.FormatUtil;
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j
......@@ -32,20 +33,61 @@ public class Oshi4NoneSigarUtil {
return os;
}
public static String getDiskStoresModelFromOshiJson() {
public static String getDiskStoresModelFromOshi() {
try {
HWDiskStore[] diskStoresFromOshi = OshiUtil.getHardware().getDiskStores();
// ADATA_IMSS314-128GM(128GB/固态硬盘)
Map<String, String> diskInfoFromSmartMap = DiskSmartUtil.getDiskInfoFromSmart();
diskStoresModel = Arrays.stream(diskStoresFromOshi)
.map(diskStoreFromOshi -> StrUtil.removeSuffix(StrUtil.removeSuffix(diskStoreFromOshi.getModel(), " (标准磁盘驱动器)"), " (Standard disk drives)")
+ "("
+ FormatUtil.formatBytesDecimal(diskStoreFromOshi.getSize())
+ diskTypeFromSmart(diskInfoFromSmartMap, StrUtil.removeSuffix(StrUtil.removeSuffix(diskStoreFromOshi.getModel(), " (标准磁盘驱动器)"), " (Standard disk drives)"))
+ ")")
.collect(Collectors.joining(","));
} catch (Exception e) {
log.error("硬盘型号数据获取失败", e);
}
return diskStoresModel;
}
public static String getDiskStoresModelJsonFromOshi() {
try {
HWDiskStore[] diskStoresFromOshi = OshiUtil.getHardware().getDiskStores();
// {"PHYSICALDRIVE0":"BIWIN SSD (Standard disk drives)(1904051301056)"}
diskStoresModel = Arrays.stream(diskStoresFromOshi)
.map(diskStoreFromOshi -> "\"" + diskStoreFromOshi.getName().replace("\\\\.\\", "") + "\":\"" +
StrUtil.removeSuffix(diskStoreFromOshi.getModel(), " (标准磁盘驱动器)") + "(" + diskStoreFromOshi.getSerial().trim() + ")\"")
.collect(Collectors.joining(",", "{", "}"));
} catch (Exception e) {
log.error("硬盘型号数据获取失败", e);
}
return diskStoresModel;
}
public static void main(String[] args) {
System.out.println(Oshi4NoneSigarUtil.getDiskStoresModelFromOshiJson());
public static String diskTypeFromSmart(Map<String, String> diskInfoFromSmartMap, String diskModel) {
String diskInfoFromSmart = diskInfoFromSmartMap.get(diskModel);
String diskType = "/固态硬盘";
if (null != diskInfoFromSmart) {
if (diskInfoFromSmart.contains("机械硬盘")) {
diskType = "/机械硬盘";
} else if (diskInfoFromSmart.contains("固态硬盘")) {
diskType = "/固态硬盘";
}
}
return diskType;
}
public static void main(String[] args) throws SigarException {
System.out.println(Oshi4NoneSigarUtil.getDiskStoresModelFromOshi());
/*Sigar sigar = new Sigar();
FileSystem[] diskStores = sigar.getFileSystemList();
for (FileSystem diskStore : diskStores) {
System.out.println(diskStore.getSysTypeName());
}*/
}
}
package com.priusis.utils;
import cn.hutool.system.oshi.OshiUtil;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
......@@ -14,7 +15,7 @@ import java.util.Map;
* Java通过JNA调用WinRing0.dll实现模拟驱动级别按键
*/
public class WinRing0Util {
static final String WR0_DLL_NAME = ParseUrlUtil.parseAbsolutePath("/core/WinRing0" + (Platform.is64Bit() ? "x64" : "") + ".dll",
static final String WR0_DLL_NAME = ParseUrlUtil.parseAbsolutePath("/core/WinRing0" + (OshiUtil.getOs().getBitness() == 64 ? "x64" : "") + ".dll",
System.getProperty("user.dir") + "/apq-pc-common");
static WR0 WR0_INSTANCE = Native.loadLibrary(WR0_DLL_NAME, WR0.class);
......
......@@ -4,6 +4,7 @@ import cn.hutool.core.util.NumberUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.hutool.system.oshi.OshiUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.hyperic.sigar.*;
......@@ -38,15 +39,15 @@ public class SigarUtil {
// memory();
// System.out.println("----------------------------------");
// // 操作系统信息
// os();
os();
// System.out.println("----------------------------------");
// // 用户信息
// who();
// System.out.println("----------------------------------");
// // 文件系统信息
// file();
System.out.println("----------------------------------");
disk(sigar);
// System.out.println("----------------------------------");
// disk(sigar);
// // 网络信息
// net();
// System.out.println("----------------------------------");
......@@ -203,6 +204,7 @@ public class SigarUtil {
}
public static void os() {
OperatingSystem OS = OperatingSystem.getInstance();
// 操作系统内核类型如: 386、486、586等x86
System.out.println("操作系统: " + OS.getArch());
......
package com.priusis.controller;
import cn.hutool.core.io.unit.DataSizeUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import cn.hutool.system.oshi.CpuInfo;
import cn.hutool.system.oshi.OshiUtil;
import com.priusis.lib.R;
import com.priusis.utils.MacAddrUtil;
import com.priusis.utils.Oshi4NoneSigarUtil;
import com.priusis.vo.ApqInfoDataVo;
import com.priusis.vo.MqttRpcDataMessage;
import lombok.extern.slf4j.Slf4j;
import org.hyperic.sigar.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.io.IOException;
import java.net.InetAddress;
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author yangli
* @since 2021/09/10
*/
@Slf4j
@Validated
@RestController
@RequestMapping(value = "info")
public class InfoController {
@Autowired
private RestTemplate restTemplate;
Sigar sigar = new Sigar();
@GetMapping(value = "read_post")
public R<Map<String, Object>> getDownloadPath() throws IOException {
boolean isNoneEven = false;
// 获取采集配置,数据上报频率 params == data
ResponseEntity<MqttRpcDataMessage> forEntity = null;
Map<String, Integer> mapParams = null;
try {
forEntity = restTemplate.getForEntity("http://localhost:8765/rpc_cmd/info", MqttRpcDataMessage.class);
if (null != forEntity) {
MqttRpcDataMessage body = forEntity.getBody();
String params = body.getParams();
if (StrUtil.isNotBlank(params)) {
List<ApqInfoDataVo> apqInfoDataVos = JSONUtil.toList(params, ApqInfoDataVo.class);
mapParams = new HashMap<>();
for (ApqInfoDataVo apqInfoDataVo : apqInfoDataVos) {
mapParams.put(apqInfoDataVo.getCode(), apqInfoDataVo.getFrequency());
}
}
}
} catch (Exception e) {
log.error("采集数据异常", e);
}
String operatingSystem = "operatingSystem";
String mac = "mac";
String baseboard = "baseboard";
String ip = "ip";
String cpuModel = "cpuModel";
String cpuLoad = "cpuLoad";
String cpuTemp = "cpuTemp";
String memoryCap = "memoryCap";
String memoryAvailable = "memoryAvailable";
String diskModel = "diskModel";
String diskCap = "diskCap";
String diskFree = "diskFree";
Map<String, Object> data = null;
try {
// 上报PC实时信息
String collect = Oshi4NoneSigarUtil.getDiskStoresModelFromOshiJson();
String collect1 = null;
String collect2 = null;
FileSystem[] diskStores;
try {
diskStores = sigar.getFileSystemList();
collect1 = Arrays.stream(diskStores)
.filter(partition -> StrUtil.isNotBlank(partition.getDevName()))
.filter(partition -> 2 == partition.getType())
.map(partition -> {
try {
FileSystemUsage usage = sigar.getFileSystemUsage(partition.getDirName());
return "\"" + StrUtil.removeSuffix(partition.getDevName(), ":\\") + "盘\":\"" +
DataSizeUtil.format(usage.getTotal() * 1024) + "\"";
} catch (SigarException e) {
log.error("SigarException: {}", e.getMessage());
}
return "";
})
.collect(Collectors.joining(",", "{", "}"));
collect2 = Arrays.stream(diskStores)
.filter(partition -> StrUtil.isNotBlank(partition.getDevName()))
.filter(partition -> 2 == partition.getType())
.map(partition -> {
try {
FileSystemUsage usage = sigar.getFileSystemUsage(partition.getDirName());
return "\"" + StrUtil.removeSuffix(partition.getDevName(), ":\\") + "盘\":\"" +
new DecimalFormat("#.00").format(100d * usage.getFree() / usage.getTotal()) + "%\"";
} catch (SigarException e) {
log.error("SigarException: {}", e.getMessage());
}
return "";
})
.collect(Collectors.joining(",", "{", "}"));
} catch (Exception e) {
log.error("硬盘数据获取失败", e);
}
String memoryCapV = "";
String cpuModelV = "";
double cpuLoadV = 0;
String memoryAvailableV = "";
double cpuTempV = 0;
String operatingSystemV = "";
String baseboardV = "";
String ipV = "";
try {
baseboardV = Oshi4NoneSigarUtil.getBaseboardWithCache(); // 获取主板信息 缓存;
ipV = InetAddress.getLocalHost().getHostAddress();
org.hyperic.sigar.CpuInfo cpuInfo = sigar.getCpuInfoList()[0];
cpuModelV = cpuInfo.getVendor() + " " + cpuInfo.getModel();
Mem mem = sigar.getMem();
memoryCapV = DataSizeUtil.format(mem.getTotal());
cpuLoadV = Double.parseDouble(new DecimalFormat("#.00").format(sigar.getCpuPerc().getCombined() * 100));
memoryAvailableV = new DecimalFormat("#,##0.###").format(mem.getFree() / Math.pow(1024, 3));
OperatingSystem OS = OperatingSystem.getInstance();
operatingSystemV = OS.getVendor() + " " + OS.getName().replace("Win32", "Windows") + " " + OS.getVersion() + "(" + OS.getArch() + ")";
// cpuTempV = Double.parseDouble(new DecimalFormat("#.00").format(OshiUtil.getSensors().getCpuTemperature()));
} catch (Exception e) {
log.error("SigarException", e);
}
data = MapUtil.<String, Object>builder()
.put(isNeedCollection(isNoneEven, operatingSystem, mapParams), operatingSystem, operatingSystemV)
.put(isNeedCollection(isNoneEven, mac, mapParams), mac, MacAddrUtil.get())
.put(isNeedCollection(isNoneEven, baseboard, mapParams), baseboard, baseboardV)
.put(isNeedCollection(isNoneEven, ip, mapParams), ip, ipV)
.put(isNeedCollection(isNoneEven, cpuModel, mapParams), cpuModel, cpuModelV)
.put(isNeedCollection(isNoneEven, cpuTemp, mapParams), cpuTemp, cpuTempV)
.put(isNeedCollection(isNoneEven, cpuLoad, mapParams), cpuLoad, cpuLoadV)
.put(isNeedCollection(isNoneEven, memoryCap, mapParams), memoryCap, memoryCapV)
.put(isNeedCollection(isNoneEven, memoryAvailable, mapParams), memoryAvailable, memoryAvailableV)
.put(isNeedCollection(isNoneEven, diskModel, mapParams), diskModel, collect)
.put(isNeedCollection(isNoneEven, diskCap, mapParams), diskCap, collect1)
.put(isNeedCollection(isNoneEven, diskFree, mapParams), diskFree, collect2)
.build();
log.info("采集数据,上报属性: mapData:{}", data);
Map mapR = restTemplate.postForObject("http://localhost:8765/uplink/oc-client", data, Map.class);
log.info("采集数据,上报属性: ret:{}", mapR);
} catch (Exception e) {
log.error("采集数据异常", e);
data = MapUtil.<String, Object>builder().put("ERROR", e.getMessage()).build();
}
return R.success(data);
}
private boolean isNeedCollection(boolean isNoneEven, String key, Map<String, Integer> mapParams) {
if (null != mapParams && mapParams.containsKey(key)) {
return (!isNoneEven || mapParams.get(key) != 30);
} else {
return isNoneEven;
}
}
}
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "阿普奇检测客户端"
#define MyAppVersion "V1.0"
#define MyAppPublisher "阿普奇"
#define MyAppURL "https://www.apq.com/"
#define MyAppDirName "apq-client"
#define MyAppEnName "apq-client"
#define MyAppExeName "apq-client.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-0000-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}
;压缩文件
Compression=lzma
SolidCompression=yes
;以管理员权限运行
PrivilegesRequired=admin
;数字签名
;SignTool=apqsigntool
;SignedUninstaller=no
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;
Source: "../../java/x64/jre/*"; DestDir: "{app}/jre"; Flags: ignoreversion recursesubdirs createallsubdirs;
Source: "../../dact/*"; 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/*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs;
Source: "../../../../apq-pc-client/target/apq-pc-client-0.0.1-SNAPSHOT-boot.jar"; DestDir: "{app}/service"; Flags: ignoreversion;
;signonce;SignCode: Yes;
; 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";
[Run]
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;
;卸载后执行的操作(停止、删除各种服务)
[UninstallRun]
Filename: "{app}\service\删除服务.bat"; Flags: runhidden;
;卸载后删除目录所有文件,删除空目录
[UninstallDelete]
Type: filesandordirs; Name: "{app}\*"
Type: dirifempty; Name: "{app}"
;操作注册表
[Registry]
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);
//Result := Password;
end;
function CheckPassword(Password: String): Boolean;
begin
if GetMD5OfStringApq(Password)='{#MyAppInstallPwd}' then
result:=true;
end;
function CheckProcessRunning( aProcName,
aProcDesc: string ): boolean;
var
ShellResult: boolean;
ResultCode: integer;
cmd: string;
sl: TStringList;
f: string;
d: string;
cmd2: string;
f2: string;
sl2: TStringList;
begin
cmd := 'for /f "delims=," %%i ' +
'in (''tasklist /FI "IMAGENAME eq ' + aProcName + '" /FO CSV'') ' +
'do if "%%~i"=="' + aProcName + '" exit 1';
f := 'CheckProc.cmd';
cmd2 := 'taskkill -f -t -im ' + aProcName;
f2 := 'KillProc.cmd';
d := AddBackSlash( ExpandConstant( '{tmp}' ));
sl := TStringList.Create;
sl.Add( cmd );
sl.Add( 'exit /0' );
sl.SaveToFile( d + f );
sl.Free;
sl2 := TStringList.Create;
sl2.Add( cmd2 );
sl2.Add( 'exit /0' );
sl2.SaveToFile( d + f2 );
sl2.Free;
Result := true;
while ( Result ) do
begin
ResultCode := 1;
ShellResult := Exec( f,
'',
d,
SW_HIDE,
ewWaitUntilTerminated,
ResultCode );
Result := ResultCode > 0;
if Result then
begin
// Msgbox('已关闭正在运行' + aProcDesc + '客户端!', mbInformation, MB_OK);
ShellResult := Exec( f2,
'',
d,
SW_HIDE,
ewWaitUntilTerminated,
ResultCode );
end;
end;
DeleteFile( d + f );
DeleteFile( d + f2 );
end;
function AskPassword(): Boolean;
var
Form: TSetupForm;
OKButton, CancelButton: TButton;
PwdEdit: TPasswordEdit;
begin
Result := false;
Form := CreateCustomForm();
try
Form.ClientWidth := ScaleX(256);
Form.ClientHeight := ScaleY(100);
Form.Caption := '密码验证';
Form.BorderIcons := [biSystemMenu];
Form.BorderStyle := bsDialog;
OKButton := TButton.Create(Form);
OKButton.Parent := Form;
OKButton.Width := ScaleX(75);
OKButton.Height := ScaleY(23);
OKButton.Left := Form.ClientWidth - ScaleX(75 + 6 + 75 + 50);
OKButton.Top := Form.ClientHeight - ScaleY(23 + 10);
OKButton.Caption := '确定';
OKButton.ModalResult := mrOk;
OKButton.Default := true;
CancelButton := TButton.Create(Form);
CancelButton.Parent := Form;
CancelButton.Width := ScaleX(75);
CancelButton.Height := ScaleY(23);
CancelButton.Left := Form.ClientWidth - ScaleX(75 + 50);
CancelButton.Top := Form.ClientHeight - ScaleY(23 + 10);
CancelButton.Caption := '取消';
CancelButton.ModalResult := mrCancel;
CancelButton.Cancel := True;
PwdEdit := TPasswordEdit.Create(Form);
PwdEdit.Parent := Form;
PwdEdit.Width := ScaleX(210);
PwdEdit.Height := ScaleY(23);
PwdEdit.Left := ScaleX(23);
PwdEdit.Top := ScaleY(23);
Form.ActiveControl := PwdEdit;
if Form.ShowModal() = mrOk then
begin
Result := GetMD5OfStringApq(PwdEdit.Text) = '{#MyAppUnInstallPwd}';
if not Result then
MsgBox('密码错误', mbInformation, MB_OK);
end;
finally
Form.Free();
end;
end;
function InitializeUninstall(): Boolean;
begin
Result := AskPassword();
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' ));
CheckProcessRunning( 'apq-control.exe', 'apq客户端插件' )
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
......@@ -2,7 +2,7 @@
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "阿普奇检测客户端"
#define MyAppVersion "V1.2.1"
#define MyAppVersion "V1.3"
#define MyAppPublisher "阿普奇"
#define MyAppURL "https://www.apq.com/"
#define MyAppDirName "apq-client"
......@@ -20,7 +20,7 @@
; Tell Windows Explorer to reload the environment
ChangesEnvironment=yes
DisableDirPage=yes
; AlwaysRestart=yes
AlwaysRestart=no
AppId={{1394783A-5D3C-48CD-0000-E2DFBB844E42}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
......@@ -37,7 +37,7 @@ SetupIconFile=logo.ico
OutputDir=..\dist\
;安装包文件名
OutputBaseFilename={#MyAppName}
OutputBaseFilename={#MyAppName}_x32
;压缩文件
Compression=lzma
......@@ -47,23 +47,23 @@ SolidCompression=yes
PrivilegesRequired=admin
UninstallDisplayIcon={app}/{#MyAppExeName}
UninstallDisplayIcon={app}/{#MyAppExeName}
//CreateUninstallRegKey=no
//UpdateUninstallLogAppName=no
//UpdateUninstallLogAppName=no
VersionInfoVersion=1.0.0.1
[Languages]
Name: "chinese"; MessagesFile: "compiler:Languages/Chinese.isl"
Name: "chinese"; MessagesFile: "compiler:Languages/Chinese.isl"
[Files]
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: "../../dact/*"; 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;
Source: "../../../../apq-pc-client/target/apq-pc-client-0.0.1-SNAPSHOT-boot.jar"; DestDir: "{app}/service"; Flags: ignoreversion recursesubdirs createallsubdirs;
Source: "../../../../apq-pc-client/target/apq-pc-client-0.0.1-SNAPSHOT-boot.jar"; DestDir: "{app}/service"; Flags: ignoreversion;
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]
......@@ -127,7 +127,7 @@ begin
'in (''tasklist /FI "IMAGENAME eq ' + aProcName + '" /FO CSV'') ' +
'do if "%%~i"=="' + aProcName + '" exit 1';
f := 'CheckProc.cmd';
cmd2 := 'taskkill -f -t -im ' + aProcName;
cmd2 := 'taskkill -f -t -im ' + aProcName;
f2 := 'KillProc.cmd';
d := AddBackSlash( ExpandConstant( '{tmp}' ));
sl := TStringList.Create;
......
......@@ -2,27 +2,27 @@
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "阿普奇检测客户端"
#define MyAppVersion "V1.0"
#define MyAppPublisher "阿普奇"
#define MyAppURL "https://www.apq.com/"
#define MyAppDirName "apq-client"
#define MyAppVersion "V1.3"
#define MyAppPublisher "阿普奇"
#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
#define MyAppUnInstallPwd "5b559ab76c08f97b5bd6c3a852e44141"
#define MyAppUnInstallPwd "5b559ab76c08f97b5bd6c3a852e44141"
[Setup]
; 注: AppId的值为单独标识该应用程序。
; 注: AppId的值为单独标识该应用程序。
; 不要为其他安装程序使用相同的AppId值。
; (生成新的GUID,点击 工具|在IDE中生成GUID。)
; Tell Windows Explorer to reload the environment
ChangesEnvironment=yes
DisableDirPage=no
; AlwaysRestart=yes
DisableDirPage=yes
AlwaysRestart=no
AppId={{1394783A-5D3C-48CD-0000-E2DFBB844E42}
AppName={#MyAppName}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppVerName={#MyAppName}
AppPublisher={#MyAppPublisher}
......@@ -41,47 +41,40 @@ OutputBaseFilename={#MyAppName}
;压缩文件
Compression=lzma
SolidCompression=yes
SolidCompression=yes
;以管理员权限运行
PrivilegesRequired=admin
;数字签名
;SignTool=apqsigntool
;SignedUninstaller=no
UninstallDisplayIcon={app}/{#MyAppExeName}
UninstallDisplayIcon={app}/{#MyAppExeName}
//CreateUninstallRegKey=no
//UpdateUninstallLogAppName=no
//UpdateUninstallLogAppName=no
VersionInfoVersion=1.0.0.1
[Languages]
Name: "chinese"; MessagesFile: "compiler:Languages/Chinese.isl"
Name: "chinese"; MessagesFile: "compiler:Languages/Chinese.isl"
[Files]
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: "../../dact/*"; 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;
Source: "../../client/x64/client-soft/apq.exe"; DestDir: "{app}/client-soft"; Flags: ignoreversion recursesubdirs createallsubdirs signonce;
;signonce;SignCode: Yes;
Source: "../../client/x64/*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs;
Source: "../../../../apq-pc-client/target/apq-pc-client-0.0.1-SNAPSHOT-boot.jar"; DestDir: "{app}/service"; Flags: ignoreversion;
; 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";
[Run]
[Run]
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;
;卸载后执行的操作(停止、删除各种服务)
[UninstallRun]
......@@ -95,7 +88,6 @@ Type: dirifempty; Name: "{app}"
;操作注册表
[Registry]
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
......@@ -112,12 +104,11 @@ begin
//Result := Password;
end;
function CheckPassword(Password: String): Boolean;
begin
if GetMD5OfStringApq(Password)='{#MyAppInstallPwd}' then
result:=true;
end;
//function CheckPassword(Password: String): Boolean;
//begin
//if GetMD5OfStringApq(Password)='{#MyAppInstallPwd}' then
//result:=true;
//end;
function CheckProcessRunning( aProcName,
aProcDesc: string ): boolean;
......@@ -175,7 +166,6 @@ begin
DeleteFile( d + f2 );
end;
function AskPassword(): Boolean;
var
Form: TSetupForm;
......@@ -233,7 +223,7 @@ Form.Free();
end;
end;
function InitializeUninstall(): Boolean;
function InitializeUninstall(): Boolean;
begin
Result := AskPassword();
end;
......@@ -243,7 +233,7 @@ function InitializeSetup: Boolean;
var
CurVer: string;
CurVerStr: string;
begin
begin
// Do not use any user defined vars in here such as {app}
// Result := not ( CheckProcessRunning( 'apq-client-service.exe', 'apq-client-service' ));
CheckProcessRunning( 'apq-control.exe', 'apq客户端插件' )
......@@ -251,7 +241,7 @@ begin
CheckProcessRunning( 'apq-register.exe', 'apq客户端插件' )
CheckProcessRunning( 'apq.exe', 'apq客户端桌面' )
RegQueryStringValue(HKLM, 'SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x64', 'Version', CurVer);
RegQueryStringValue(HKLM, 'SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x64', 'Version', CurVer);
CurVerStr := Copy(CurVer,2,2);
if CurVerStr = '14' then
......
......@@ -11,5 +11,5 @@
<startargument>-Dplatform=windows</startargument>
<startargument>-jar</startargument>
<startargument>%BASE%\apq-pc-client-0.0.1-SNAPSHOT-boot.jar</startargument>
<startargument>--spring.profiles.active=prod</startargument>
<startargument>--spring.profiles.active=aprod</startargument>
</service>
VID_0471&PID_485D 深思洛克(senseLock) SenseIV2.x 深思洛克 sense4 senseIV 深思4 有驱
VID_0471&PID_485E 深思洛克(senseLock) SenseIV2.x 深思洛克 sense4 senseIV 深思4 无驱
VID_04B4&PID_4A58 深思洛克(SenseLock) 深思 3(sense3)加密狗, 无驱型
VID_04B4&PID_4A59 深思洛克(SenseLock) 深思 3(sense3)加密狗, 有驱型
VID_04B9&PID_0300 赛耐孚(SafeNet) USB SuperPro / UltraPro
VID_04B9&PID_0301 赛耐孚(SafeNet) USB Security Security Token
VID_04B9&PID_0302 赛耐孚(SafeNet) USB Security Security Token
VID_04B9&PID_0303 赛耐孚(SafeNet) USB Security Security Token
VID_04B9&PID_0304 赛耐孚(SafeNet) USB Security Security Token
VID_04B9&PID_8000 赛耐孚(SafeNet) Sentinel Hardware Key
VID_04B9&PID_8001 赛耐孚(SafeNet) Sentinel Hardware Key RTC
VID_04B9&PID_8002 赛耐孚(SafeNet) Sentinel Hardware Key Mega - Memory
VID_04B9&PID_8003 赛耐孚(SafeNet) Sentinel Hardware Key Mega - Memory RTC
VID_04B9&PID_8004 赛耐孚(SafeNet) Sentinel Dual Hardware Key
VID_04B9&PID_8005 赛耐孚(SafeNet) Sentinel Dual Hardware Key RTC
VID_0529&PID_0001 阿拉丁(Aladdin) HASP HL Time 有驱型
VID_064F&PID_0BD7 WIBU WIBU U + 加密狗, 有驱型
VID_064F&PID_0BD8 WIBU WIBU RU + 加密狗, 有驱型
VID_064F&PID_OBD8 WIBU WIBURU + 加密狗, 有驱型
VID_0830&PID_2002 和升达 SK - USB180 无驱型
VID_08E2&PID_0002 赛孚耐(SafeNet) safenet microdog UMI 彩虹加密狗 微狗
VID_08E2&PID_0004 赛孚耐(SafeNet) safenet softdog UDA 彩虹加密狗 软件狗
VID_08E2&PID_0005 赛孚耐(SafeNet) 精灵狗UGA(GeniusDog), 有驱型
VID_08E2&PID_0006 赛孚耐(SafeNet) safenet GrandDog 宏狗UGRA, 有驱型
VID_08E2&PID_0008 赛孚耐(SafeNet) safenet SuperDog 超级狗
VID_0925&PID_5624 世纪龙脉(Century Longmai) DAM2 加密狗, 无驱型
VID_0925&PID_5906 世纪龙脉(Century Longmai) NOX 定制狗, 无驱型
VID_0925&PID_6B05 世纪龙脉(Century Longmai) NOX 加密狗, 无驱型
VID_0925&PID_7122 世纪龙脉(Century Longmai) DAM2 + 加密狗, 无驱型
VID_0925&PID_7504 世纪龙脉(Century Longmai) NOX5 主锁
VID_0925&PID_7816 世纪龙脉(Century Longmai) NOX 时钟狗, 无驱型
VID_0925&PID_7A13 世纪龙脉(Century Longmai) DAM2 + 网络狗, 无驱型
VID_0925&PID_7A21 世纪龙脉(Century Longmai) NOX2 加密狗, 无驱型
VID_0925&PID_8705 世纪龙脉(Century Longmai) NOX5 加密狗 智能狗, 无驱型
VID_0925&PID_9627 世纪龙脉(Century Longmai) NOX + 单机狗, 无驱型
VID_0925&PID_A508 北京磐石诚信NT系列加密狗
VID_096E&PID_0001 飞天诚信(ftsafe) 飞天4有驱型 加密锁 ROCKEY 4 Rockey4 R4
VID_096E&PID_0006 飞天诚信(ftsafe) 飞天4无驱型 加密锁 rockey 4 nd ROCKEY4ND R4nd
VID_096E&PID_0201 飞天诚信(ftsafe) 飞天2无驱型 加密锁 rockey 2 ROCKEY2 R2
VID_096E&PID_0202 飞天诚信(FTSafe) Rockey 3 智能狗, 无驱型
VID_096E&PID_0205 飞天诚信(FTSafe) Rockey 1 智能狗, 无驱型
VID_096E&PID_0207 飞天诚信(FTSafe) Rockey 1 智慧型, 无驱型
VID_096E&PID_0209 坚石诚信(FTSafe) ARM 时钟智能狗
VID_096E&PID_0303 坚石诚信(Rockey) ET99 Token ET99 / ET299 加密狗, 无驱型
VID_096E&PID_0304 坚石诚信(Rockey) ET199 Token ET199 智能狗, 无驱型
VID_096E&PID_0403 飞天诚信(ftsafe) 飞天6无驱型 加密锁 rockey6 smart R6
VID_10F7&PID_8469 MegaLock 无驱型
VID_1199&PID_8282 域天(域之天) 域之天 域天 简单型 加密锁
VID_1312&PID_1912 域天(域之天)域之天 域天 32位智能型(有驱型)
VID_1312&PID_2012 域天(域之天)域之天 域天 32位智能型 易用型智能锁 加密锁 无驱
VID_1BC0&PID_1001 深思洛克(SenseLock) 灵锐 I(Living) 加密狗, 无驱型
VID_1BC0&PID_8013 深思洛克(SenseLock) 精锐 E(Elite - E)智能狗, 无驱型
VID_1BC0&PID_8101 深思洛克(SenseLock) 灵锐 定制加密狗, 无驱型
VID_1BC0&PID_8113 深思洛克(SenseLock) OME速达3000 Pro, 无驱型
VID_3689&PID_3689 EncryptPE 订制型(域天)EPE OEM加密狗 域天密码型 EncryptPE订制型
VID_3689&PID_8762 域天(域之天) 域之天 域天 密码型 加密锁
VID_5042&PID_???? 江波龙(NetCom) 安全芯(SChip) 加密狗, 有驱型
VID_5042&PID_FFFF 安全芯 schip 安全芯UKF - 002
VID_5149&PID_???? 江波龙(NetCom) 易锁(SimpleKey)加密狗, 无驱型
VID_5149&PID_EACE 杭州唯赛 易锁(Simple Key) 无驱型
VID_6A75&PID_9801 上海十条电子 JSP - C USB Key 有驱型
VID_7F5E&PID_DE5D 广州飞盾NT系列加密锁
VID_83D3&PID_3773 域天(域之天) 域之天 域天 专业型 / 经济易用型 加密锁
\ No newline at end of file
VID_0471&PID_485D 深思洛克(senseLock) SenseIV2.x 深思洛克 sense4 senseIV 深思4 有驱
VID_0471&PID_485E 深思洛克(senseLock) SenseIV2.x 深思洛克 sense4 senseIV 深思4 无驱
VID_04B4&PID_4A58 深思洛克(SenseLock) 深思 3(sense3)加密狗, 无驱型
VID_04B4&PID_4A59 深思洛克(SenseLock) 深思 3(sense3)加密狗, 有驱型
VID_04B9&PID_0300 赛耐孚(SafeNet) USB SuperPro / UltraPro
VID_04B9&PID_0301 赛耐孚(SafeNet) USB Security Security Token
VID_04B9&PID_0302 赛耐孚(SafeNet) USB Security Security Token
VID_04B9&PID_0303 赛耐孚(SafeNet) USB Security Security Token
VID_04B9&PID_0304 赛耐孚(SafeNet) USB Security Security Token
VID_04B9&PID_8000 赛耐孚(SafeNet) Sentinel Hardware Key
VID_04B9&PID_8001 赛耐孚(SafeNet) Sentinel Hardware Key RTC
VID_04B9&PID_8002 赛耐孚(SafeNet) Sentinel Hardware Key Mega - Memory
VID_04B9&PID_8003 赛耐孚(SafeNet) Sentinel Hardware Key Mega - Memory RTC
VID_04B9&PID_8004 赛耐孚(SafeNet) Sentinel Dual Hardware Key
VID_04B9&PID_8005 赛耐孚(SafeNet) Sentinel Dual Hardware Key RTC
VID_0529&PID_0001 阿拉丁(Aladdin) HASP HL Time 有驱型
VID_064F&PID_0BD7 WIBU WIBU U + 加密狗, 有驱型
VID_064F&PID_0BD8 WIBU WIBU RU + 加密狗, 有驱型
VID_064F&PID_OBD8 WIBU WIBURU + 加密狗, 有驱型
VID_0830&PID_2002 和升达 SK - USB180 无驱型
VID_08E2&PID_0002 赛孚耐(SafeNet) safenet microdog UMI 彩虹加密狗 微狗
VID_08E2&PID_0004 赛孚耐(SafeNet) safenet softdog UDA 彩虹加密狗 软件狗
VID_08E2&PID_0005 赛孚耐(SafeNet) 精灵狗UGA(GeniusDog), 有驱型
VID_08E2&PID_0006 赛孚耐(SafeNet) safenet GrandDog 宏狗UGRA, 有驱型
VID_08E2&PID_0008 赛孚耐(SafeNet) safenet SuperDog 超级狗
VID_0925&PID_5624 世纪龙脉(Century Longmai) DAM2 加密狗, 无驱型
VID_0925&PID_5906 世纪龙脉(Century Longmai) NOX 定制狗, 无驱型
VID_0925&PID_6B05 世纪龙脉(Century Longmai) NOX 加密狗, 无驱型
VID_0925&PID_7122 世纪龙脉(Century Longmai) DAM2 + 加密狗, 无驱型
VID_0925&PID_7504 世纪龙脉(Century Longmai) NOX5 主锁
VID_0925&PID_7816 世纪龙脉(Century Longmai) NOX 时钟狗, 无驱型
VID_0925&PID_7A13 世纪龙脉(Century Longmai) DAM2 + 网络狗, 无驱型
VID_0925&PID_7A21 世纪龙脉(Century Longmai) NOX2 加密狗, 无驱型
VID_0925&PID_8705 世纪龙脉(Century Longmai) NOX5 加密狗 智能狗, 无驱型
VID_0925&PID_9627 世纪龙脉(Century Longmai) NOX + 单机狗, 无驱型
VID_0925&PID_A508 北京磐石诚信NT系列加密狗
VID_096E&PID_0001 飞天诚信(ftsafe) 飞天4有驱型 加密锁 ROCKEY 4 Rockey4 R4
VID_096E&PID_0006 飞天诚信(ftsafe) 飞天4无驱型 加密锁 rockey 4 nd ROCKEY4ND R4nd
VID_096E&PID_0201 飞天诚信(ftsafe) 飞天2无驱型 加密锁 rockey 2 ROCKEY2 R2
VID_096E&PID_0202 飞天诚信(FTSafe) Rockey 3 智能狗, 无驱型
VID_096E&PID_0205 飞天诚信(FTSafe) Rockey 1 智能狗, 无驱型
VID_096E&PID_0207 飞天诚信(FTSafe) Rockey 1 智慧型, 无驱型
VID_096E&PID_0209 坚石诚信(FTSafe) ARM 时钟智能狗
VID_096E&PID_0303 坚石诚信(Rockey) ET99 Token ET99 / ET299 加密狗, 无驱型
VID_096E&PID_0304 坚石诚信(Rockey) ET199 Token ET199 智能狗, 无驱型
VID_096E&PID_0403 飞天诚信(ftsafe) 飞天6无驱型 加密锁 rockey6 smart R6
VID_10F7&PID_8469 MegaLock 无驱型
VID_1199&PID_8282 域天(域之天) 域之天 域天 简单型 加密锁
VID_1312&PID_1912 域天(域之天)域之天 域天 32位智能型(有驱型)
VID_1312&PID_2012 域天(域之天)域之天 域天 32位智能型 易用型智能锁 加密锁 无驱
VID_1BC0&PID_1001 深思洛克(SenseLock) 灵锐 I(Living) 加密狗, 无驱型
VID_1BC0&PID_8013 深思洛克(SenseLock) 精锐 E(Elite - E)智能狗, 无驱型
VID_1BC0&PID_8101 深思洛克(SenseLock) 灵锐 定制加密狗, 无驱型
VID_1BC0&PID_8113 深思洛克(SenseLock) OME速达3000 Pro, 无驱型
VID_3689&PID_3689 EncryptPE 订制型(域天)EPE OEM加密狗 域天密码型 EncryptPE订制型
VID_3689&PID_8762 域天(域之天) 域之天 域天 密码型 加密锁
VID_5042&PID_???? 江波龙(NetCom) 安全芯(SChip) 加密狗, 有驱型
VID_5042&PID_FFFF 安全芯 schip 安全芯UKF - 002
VID_5149&PID_???? 江波龙(NetCom) 易锁(SimpleKey)加密狗, 无驱型
VID_5149&PID_EACE 杭州唯赛 易锁(Simple Key) 无驱型
VID_6A75&PID_9801 上海十条电子 JSP - C USB Key 有驱型
VID_7F5E&PID_DE5D 广州飞盾NT系列加密锁
VID_83D3&PID_3773 域天(域之天) 域之天 域天 专业型 / 经济易用型 加密锁
\ No newline at end of file
"D:\tools\signtool.exe" sign /v /f "D:\tools\apq.pfx" /p apq0011 /t http://timestamp.verisign.com/scripts/timestamp.dll D:\work\priusis\priusis-iot\apq-iot\apq-client\tools\install-package\boot\dist\ͻ.exe
"D:\tools\signtool.exe" sign /v /f "D:\tools\apq.pfx" /p apq0011 /t http://timestamp.verisign.com/scripts/timestamp.dll D:\work\priusis\priusis-iot\apq-iot\apq-client\tools\install-package\boot\dist\阿普奇检测客户端_x32.exe
"D:\tools\signtool.exe" sign /v /f "D:\tools\apq.pfx" /p apq0011 /t http://timestamp.verisign.com/scripts/timestamp.dll D:\work\priusis\priusis-iot\apq-iot\apq-client\tools\install-package\client\x64\client-soft\apq.exe
"D:\tools\signtool.exe" sign /v /f "D:\tools\apq.pfx" /p apq0011 /t http://timestamp.verisign.com/scripts/timestamp.dll D:\work\priusis\priusis-iot\apq-iot\apq-client\tools\install-package\client\x32\client-soft\apq.exe
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论