225 lines
6.7 KiB
C#
225 lines
6.7 KiB
C#
// See https://aka.ms/new-console-template for more information
|
||
|
||
using Newtonsoft.Json.Linq;
|
||
using Serilog;
|
||
using System.Data.SqlTypes;
|
||
using System.Diagnostics;
|
||
using System.Drawing;
|
||
using static System.Net.Mime.MediaTypeNames;
|
||
|
||
async Task ProcessStandardInputAsync(Process process, string cmd, string workDirectory = "")
|
||
{
|
||
if (!string.IsNullOrWhiteSpace(workDirectory))
|
||
{
|
||
process.StartInfo.WorkingDirectory = workDirectory;
|
||
}
|
||
|
||
await process.StandardInput.WriteLineAsync(cmd);
|
||
await process.StandardInput.FlushAsync();
|
||
|
||
while (!process.StandardOutput.EndOfStream)
|
||
{
|
||
var output = await process.StandardOutput.ReadLineAsync();
|
||
if (string.IsNullOrWhiteSpace(output))
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
void DeleteFolderContents(string path)
|
||
{
|
||
DirectoryInfo directory = new DirectoryInfo(path);
|
||
|
||
foreach (FileInfo file in directory.GetFiles())
|
||
{
|
||
if (file.FullName.Contains("UnInstall"))
|
||
{
|
||
continue;
|
||
}
|
||
|
||
try
|
||
{
|
||
file.Attributes = FileAttributes.Normal;
|
||
file.Delete();
|
||
}
|
||
catch (IOException ex)
|
||
{
|
||
// 处理文件被占用的异常
|
||
MyLog($"File {file.FullName} is being used and cannot be deleted. {ex.Message}");
|
||
}
|
||
catch (UnauthorizedAccessException ex)
|
||
{
|
||
|
||
try
|
||
{
|
||
File.Delete(file.FullName);
|
||
}
|
||
catch (Exception ex2)
|
||
{
|
||
|
||
MyLog($"File {file.FullName} cannot be deleted. {ex2.Message}");
|
||
}
|
||
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
}
|
||
|
||
foreach (DirectoryInfo subDirectory in directory.GetDirectories())
|
||
{
|
||
subDirectory.Delete(true);
|
||
}
|
||
}
|
||
|
||
|
||
void MyLog(string message)
|
||
{
|
||
Console.WriteLine(message);
|
||
//Serilog.Log.Information(message);
|
||
}
|
||
|
||
|
||
//Serilog.Log.Logger = new LoggerConfiguration()
|
||
// .WriteTo.File("logs\\UninstallLog.txt", rollingInterval: RollingInterval.Day)
|
||
// .CreateLogger();
|
||
|
||
|
||
|
||
var startProList = Process.GetProcesses().Where(t => t.ProcessName.Contains("EI_Image_Viewer_Installer")).ToList();
|
||
foreach (var item in startProList)
|
||
{
|
||
item.Kill();
|
||
}
|
||
|
||
|
||
var configFolder = $@"C:\ProgramData\.xingcang\";
|
||
|
||
var configPath = Path.Combine(configFolder, "config.json");
|
||
if (!File.Exists(configPath))
|
||
{
|
||
MyLog("当前系统未部署影像系统,无须卸载");
|
||
Console.ReadLine();
|
||
}
|
||
else
|
||
{
|
||
Console.ForegroundColor = ConsoleColor.Red;
|
||
MyLog("");
|
||
MyLog("警告:卸载EI Image Viewer 服务,会将后台服务、数据库、网站文件以及运行的所有数据记录清除,请慎重操作。在卸载前,请确保数据已经备份。");
|
||
MyLog(" 您确定要继续卸载该服务吗?(Y/N)");
|
||
Console.ResetColor();
|
||
|
||
string confirm = Console.ReadLine();
|
||
if (confirm.ToUpper() == "Y")
|
||
{
|
||
// 执行卸载操作
|
||
try
|
||
{
|
||
MyLog("开始读取激活信息...");
|
||
|
||
var appsettingsJson = File.ReadAllText(configPath);
|
||
|
||
// 解析 JSON 字符串
|
||
var jObject = JObject.Parse(appsettingsJson);
|
||
|
||
|
||
var configObj = new
|
||
{
|
||
key = jObject["key"].ToString(),
|
||
value = jObject["value"].ToString(),
|
||
user = jObject["user"].ToString(),
|
||
server = jObject["server"].ToString(),
|
||
password = jObject["password"].ToString(),
|
||
dbName = jObject["dbName"].ToString(),
|
||
deployFolder = jObject["deployFolder"].ToString(),
|
||
nginxStartPath = jObject["nginxStartPath"].ToString(),
|
||
//apiPath = jObject["apiPath"].ToString(),
|
||
serviceName = jObject["serviceName"].ToString(),
|
||
nginxServiceName = jObject["nginxServiceName"]?.ToString(),
|
||
nginxServiceEXEPath = jObject["nginxServiceEXEPath"]?.ToString(),
|
||
};
|
||
MyLog("激活信息读取完毕,开始准备卸载...");
|
||
|
||
Process process = new Process();
|
||
process.StartInfo.FileName = "cmd.exe";
|
||
process.StartInfo.RedirectStandardInput = true;
|
||
process.StartInfo.UseShellExecute = false;
|
||
process.StartInfo.RedirectStandardOutput = true;
|
||
|
||
//process.StartInfo.CreateNoWindow = false; // 不创建新窗口
|
||
|
||
process.Start();
|
||
|
||
MyLog("停止并卸载nginx服务...");
|
||
await ProcessStandardInputAsync(process, $" {configObj.nginxServiceEXEPath} uninstall ", configObj.nginxStartPath);
|
||
await ProcessStandardInputAsync(process, $"sc stop {configObj.nginxServiceName}");
|
||
await ProcessStandardInputAsync(process, $"sc delete {configObj.nginxServiceName}");
|
||
|
||
await Task.Delay(2000);
|
||
|
||
|
||
var proList = Process.GetProcesses().Where(t => ((t.ProcessName.Contains("nginx") || t.ProcessName.Contains("nginxService")) && t.MainModule.FileName.Contains(configObj.nginxStartPath))).ToList();
|
||
|
||
foreach (var item in proList)
|
||
{
|
||
item.Kill();
|
||
}
|
||
|
||
|
||
|
||
|
||
MyLog("停止并卸载后端服务...");
|
||
|
||
await ProcessStandardInputAsync(process, $"sc stop {configObj.serviceName}");
|
||
await ProcessStandardInputAsync(process, $"sc delete {configObj.serviceName}");
|
||
|
||
|
||
MyLog("数据库若被其他进程或者连接正在使用,将会删除失败,您可以卸载完后手动删除遗留的数据库");
|
||
MyLog("执行删除数据库命令...");
|
||
await ProcessStandardInputAsync(process, $@" SQLCMD -S {configObj.server} -U {configObj.user} -P {configObj.password} -Q ""DROP DATABASE {configObj.dbName}"" ");
|
||
|
||
|
||
process.StandardInput.Close();
|
||
process.WaitForExit();
|
||
|
||
await Task.Delay(3000);
|
||
|
||
MyLog($"删除部署文件夹{configObj.deployFolder}下可删除的所有内容...");
|
||
DeleteFolderContents(configObj.deployFolder);
|
||
|
||
|
||
MyLog("删除激活信息...");
|
||
DeleteFolderContents(configFolder);
|
||
MyLog("EI Image Viewer 服务卸载完成。");
|
||
MyLog("3s 后自动退出...");
|
||
await Task.Delay(3000);
|
||
|
||
string cmdArgs = $"/C ping 127.0.0.1 -n 3 & rmdir /s /q \"{configObj.deployFolder}\"";
|
||
ProcessStartInfo psi = new ProcessStartInfo("cmd.exe", cmdArgs);
|
||
psi.WindowStyle = ProcessWindowStyle.Hidden;
|
||
psi.CreateNoWindow = true;
|
||
Process.Start(psi);
|
||
|
||
Environment.Exit(0);
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
|
||
MyLog("卸载过程遇到问题:" + ex.Message + " 请检查是否有其他程序占用了相关资源,请确认后再重新卸载。");
|
||
Console.ReadLine();
|
||
}
|
||
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
}
|
||
|
||
|