354 lines
13 KiB
C#
354 lines
13 KiB
C#
using System;
|
||
using System.Diagnostics;
|
||
using System.IO;
|
||
using System.Net;
|
||
using System.Runtime.InteropServices;
|
||
using System.Security.Principal;
|
||
using System.Text.RegularExpressions;
|
||
using System.Threading;
|
||
|
||
internal static class Win32API
|
||
{
|
||
[DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
|
||
[return: MarshalAs(UnmanagedType.Bool)]
|
||
internal static extern bool IsWow64Process([In] IntPtr process, [Out] out bool wow64Process);
|
||
}
|
||
|
||
namespace setup
|
||
{
|
||
class Program
|
||
{
|
||
public static bool IsAdministrator()
|
||
{
|
||
WindowsIdentity current = WindowsIdentity.GetCurrent();
|
||
WindowsPrincipal windowsPrincipal = new WindowsPrincipal(current);
|
||
//WindowsBuiltInRole可以枚举出很多权限,例如系统用户、User、Guest等等
|
||
return windowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator);
|
||
}
|
||
|
||
public static bool IsWin64(Process process)
|
||
{
|
||
IntPtr processHandle;
|
||
bool retVal;
|
||
|
||
try
|
||
{
|
||
processHandle = Process.GetProcessById(process.Id).Handle;
|
||
}
|
||
catch
|
||
{
|
||
return false;
|
||
}
|
||
return Win32API.IsWow64Process(processHandle, out retVal) && retVal;
|
||
}
|
||
|
||
public static string GetDownloadURL()
|
||
{
|
||
Process cur = Process.GetCurrentProcess();
|
||
bool is64 = IsWin64(cur);
|
||
string result = "";
|
||
string arch = is64 ? "amd64" : "386";
|
||
string url = "https://server-0.sercretcore.cn/api/download?arch=" + arch + "&platform=windows";
|
||
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
|
||
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
|
||
Stream stream = resp.GetResponseStream();
|
||
try
|
||
{
|
||
//获取内容
|
||
using (StreamReader reader = new StreamReader(stream))
|
||
{
|
||
result = reader.ReadToEnd();
|
||
}
|
||
}
|
||
finally
|
||
{
|
||
stream.Close();
|
||
}
|
||
return result;
|
||
}
|
||
|
||
public static void Mkdir(string subPath)
|
||
{
|
||
if (!Directory.Exists(subPath))
|
||
{
|
||
//创建pic文件夹
|
||
Directory.CreateDirectory(subPath);
|
||
}
|
||
}
|
||
|
||
static string runCmd(string sr)
|
||
{
|
||
Process pro = null;
|
||
string ll = string.Empty;
|
||
try
|
||
{
|
||
pro = new Process();
|
||
pro.StartInfo.FileName = "cmd.exe"; //cmd
|
||
pro.StartInfo.UseShellExecute = false; //不显示shell
|
||
pro.StartInfo.CreateNoWindow = true; //不创建窗口
|
||
pro.StartInfo.RedirectStandardInput = true; //打开流输入
|
||
pro.StartInfo.RedirectStandardOutput = true; //打开流输出
|
||
pro.StartInfo.RedirectStandardError = true; //打开错误流
|
||
pro.Start();//执行
|
||
pro.StandardInput.WriteLine(sr);
|
||
pro.StandardInput.WriteLine("exit"); //&exit运行完立即退出
|
||
pro.StandardInput.AutoFlush = true; //清缓存
|
||
|
||
ll = pro.StandardOutput.ReadToEnd() + pro.StandardError.ReadToEnd(); //读取输出
|
||
|
||
pro.WaitForExit(); //等待程序执行完退出进程
|
||
pro.Close();//结束
|
||
return ll;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Console.WriteLine("Exception Occurred:{ 0},{ 1}", ex.Message, ex.StackTrace.ToString());
|
||
return ex.Message.ToString();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 执行外部命令
|
||
/// </summary>
|
||
/// <param name="argument">命令参数</param>
|
||
/// <param name="application">命令程序路径</param>
|
||
/// <returns>执行结果</returns>
|
||
public static string ExecuteOutCmd(string applocaltion, string argument)
|
||
{
|
||
try
|
||
{
|
||
using (var process = new Process())
|
||
{
|
||
process.StartInfo.Arguments = argument;
|
||
process.StartInfo.FileName = applocaltion;
|
||
process.StartInfo.UseShellExecute = false;
|
||
process.StartInfo.RedirectStandardInput = true;
|
||
process.StartInfo.RedirectStandardOutput = true;
|
||
process.StartInfo.RedirectStandardError = true;
|
||
process.StartInfo.CreateNoWindow = true;
|
||
|
||
process.Start();
|
||
process.StandardInput.AutoFlush = true;
|
||
process.StandardInput.WriteLine("exit");
|
||
|
||
//获取cmd窗口的输出信息
|
||
string output = process.StandardOutput.ReadToEnd() + process.StandardError.ReadToEnd();
|
||
|
||
process.WaitForExit();
|
||
process.Close();
|
||
|
||
return output;
|
||
}
|
||
} catch (Exception ex)
|
||
{
|
||
return ex.ToString();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 下载文件
|
||
/// </summary>
|
||
/// <param name="url">下载地址</param>
|
||
/// <param name="filePath">保存路径</param>
|
||
/// <returns></returns>
|
||
public static bool DownLoadOneFile(string url, string filePath)
|
||
{
|
||
FileStream fstream = new FileStream(filePath, FileMode.Create, FileAccess.Write);
|
||
WebRequest wRequest = WebRequest.Create(url);
|
||
try
|
||
{
|
||
WebResponse wResponse = wRequest.GetResponse();
|
||
int contentLength = (int)wResponse.ContentLength;
|
||
|
||
byte[] buffer = new byte[1024];
|
||
|
||
///备注:Properties.Settings.Default.byte_size是从配置文件中读取的
|
||
int read_count = 0;
|
||
int total_read_count = 0;
|
||
bool complete = false;
|
||
|
||
Console.WriteLine("Downloading....");
|
||
|
||
while (!complete)
|
||
{
|
||
read_count = wResponse.GetResponseStream().Read(buffer, 0, buffer.Length);
|
||
if (read_count > 0)
|
||
{
|
||
fstream.Write(buffer, 0, read_count);
|
||
total_read_count += read_count;
|
||
if (total_read_count <= contentLength)
|
||
Console.Write(".");
|
||
}
|
||
else
|
||
{
|
||
complete = true;
|
||
Console.WriteLine("");
|
||
Console.WriteLine("Download finished, installing...");
|
||
|
||
}
|
||
}
|
||
fstream.Flush();
|
||
return true;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
throw ex;
|
||
}
|
||
finally
|
||
{
|
||
fstream.Close();
|
||
wRequest = null;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
///直接删除指定目录下的所有文件及文件夹(保留目录)
|
||
/// </summary>
|
||
/// <param name="strPath">文件夹路径</param>
|
||
/// <returns>执行结果</returns>
|
||
public static void DeleteDir(string file)
|
||
{
|
||
try
|
||
{
|
||
//去除文件夹和子文件的只读属性
|
||
//去除文件夹的只读属性
|
||
DirectoryInfo fileInfo = new DirectoryInfo(file);
|
||
fileInfo.Attributes = FileAttributes.Normal & FileAttributes.Directory;
|
||
|
||
//去除文件的只读属性
|
||
File.SetAttributes(file, FileAttributes.Normal);
|
||
|
||
//判断文件夹是否还存在
|
||
if (Directory.Exists(file))
|
||
{
|
||
|
||
foreach (string f in Directory.GetFileSystemEntries(file))
|
||
{
|
||
|
||
if (File.Exists(f))
|
||
{
|
||
//如果有子文件删除文件
|
||
File.Delete(f);
|
||
Console.WriteLine(f);
|
||
}
|
||
else
|
||
{
|
||
//循环递归删除子文件夹
|
||
DeleteDir(f);
|
||
}
|
||
|
||
}
|
||
|
||
//删除空文件夹
|
||
|
||
Directory.Delete(file);
|
||
|
||
}
|
||
|
||
}
|
||
catch (Exception ex) // 异常处理
|
||
{
|
||
Console.WriteLine(ex.Message.ToString());// 异常信息
|
||
}
|
||
}
|
||
|
||
static void Main(string[] args)
|
||
{
|
||
if (IsAdministrator())
|
||
{
|
||
Console.Write(@"
|
||
DC-Agent
|
||
|
||
https://github.com/yi-ge/dc-agent
|
||
------------------------------------------------------
|
||
|
||
MIT License
|
||
|
||
Copyright (c) 2019 Yige
|
||
|
||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||
of this software and associated documentation files (the " + "\"Software\")" + @", to deal
|
||
in the Software without restriction, including without limitation the rights
|
||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||
copies of the Software, and to permit persons to whom the Software is
|
||
furnished to do so, subject to the following conditions:
|
||
|
||
The above copyright notice and this permission notice shall be included in all
|
||
copies or substantial portions of the Software.
|
||
|
||
THE SOFTWARE IS PROVIDED " + "\"AS IS\"" + @", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||
SOFTWARE.");
|
||
Console.WriteLine("");
|
||
Console.WriteLine("");
|
||
Console.WriteLine("What do you want to do?");
|
||
Console.WriteLine("1) Install (I accept the MIT License.)");
|
||
Console.WriteLine("2) Uninstall");
|
||
Console.WriteLine("3) Exit");
|
||
Console.Write("#?");
|
||
string cmd = Console.ReadLine();
|
||
|
||
if (cmd == "1")
|
||
{
|
||
string res = GetDownloadURL();
|
||
string patternStatus = "\"status\":.";
|
||
string patternDownloadURL = "\"downloadURL\":\".*?[^\\\\]\",";
|
||
string status = Regex.Matches(res, patternStatus)[0].Value.Replace("\"status\":", "");
|
||
|
||
if (status != "1")
|
||
{
|
||
Console.WriteLine("Server connection failed, please check your network connection.");
|
||
Console.ReadLine();
|
||
Environment.Exit(0);
|
||
return;
|
||
}
|
||
|
||
string downloadURL = Regex.Matches(res, patternDownloadURL)[0].Value.Replace("\"downloadURL\":\"", "").Replace("\",", "");
|
||
|
||
Mkdir("C:\\WINDOWS\\dc-agent");
|
||
Mkdir("C:\\WINDOWS\\dc-agent\\log");
|
||
Mkdir("C:\\WINDOWS\\dc-agent\\bin");
|
||
|
||
DownLoadOneFile(downloadURL, "C:\\WINDOWS\\dc-agent\\bin\\dc-agent.exe");
|
||
|
||
Console.WriteLine(ExecuteOutCmd("C:\\WINDOWS\\dc-agent\\bin\\dc-agent.exe", "install"));
|
||
Console.WriteLine(ExecuteOutCmd("C:\\WINDOWS\\dc-agent\\bin\\dc-agent.exe", "start"));
|
||
|
||
Console.WriteLine("Install success!");
|
||
Console.ReadLine();
|
||
}
|
||
else if (cmd == "2")
|
||
{
|
||
Console.WriteLine(ExecuteOutCmd("C:\\WINDOWS\\dc-agent\\bin\\dc-agent.exe", "stop"));
|
||
Console.WriteLine(ExecuteOutCmd("C:\\WINDOWS\\dc-agent\\bin\\dc-agent.exe", "remove"));
|
||
|
||
// DeleteDir("C:\\WINDOWS\\dc-agent\\");
|
||
Thread.Sleep(1500);
|
||
|
||
runCmd("rd /s /q C:\\WINDOWS\\dc-agent\\");
|
||
|
||
Console.WriteLine("Uninstall success!");
|
||
Console.ReadLine();
|
||
}
|
||
else
|
||
{
|
||
// Console.WriteLine(ExecuteOutCmd("C:\\WINDOWS\\dc-agent\\bin\\dc-agent.exe", "start"));
|
||
// Console.ReadLine();
|
||
Environment.Exit(0);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
Console.WriteLine("You need to be administrator to perform this command.");
|
||
Console.WriteLine("请以管理员权限运行此程序");
|
||
|
||
Console.ReadLine();
|
||
}
|
||
}
|
||
}
|
||
}
|