mirror of
https://github.com/jkocon/g-helper.git
synced 2026-02-23 13:00:52 +01:00
142 lines
4.6 KiB
C#
142 lines
4.6 KiB
C#
using System.Diagnostics;
|
|
using System.Security.Principal;
|
|
|
|
namespace GHelper.Helpers
|
|
{
|
|
public static class ProcessHelper
|
|
{
|
|
private static long lastAdmin;
|
|
|
|
public static void CheckAlreadyRunning()
|
|
{
|
|
Process currentProcess = Process.GetCurrentProcess();
|
|
Process[] processes = Process.GetProcessesByName(currentProcess.ProcessName);
|
|
|
|
if (processes.Length > 1)
|
|
{
|
|
foreach (Process process in processes)
|
|
if (process.Id != currentProcess.Id)
|
|
try
|
|
{
|
|
process.Kill();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.WriteLine(ex.ToString());
|
|
MessageBox.Show(Properties.Strings.AppAlreadyRunningText, Properties.Strings.AppAlreadyRunning, MessageBoxButtons.OK);
|
|
Application.Exit();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
public static bool IsUserAdministrator()
|
|
{
|
|
WindowsIdentity identity = WindowsIdentity.GetCurrent();
|
|
WindowsPrincipal principal = new WindowsPrincipal(identity);
|
|
return principal.IsInRole(WindowsBuiltInRole.Administrator);
|
|
}
|
|
|
|
public static void RunAsAdmin(string? param = null)
|
|
{
|
|
|
|
if (Math.Abs(DateTimeOffset.Now.ToUnixTimeMilliseconds() - lastAdmin) < 2000) return;
|
|
lastAdmin = DateTimeOffset.Now.ToUnixTimeMilliseconds();
|
|
|
|
// Check if the current user is an administrator
|
|
if (!IsUserAdministrator())
|
|
{
|
|
ProcessStartInfo startInfo = new ProcessStartInfo();
|
|
startInfo.UseShellExecute = true;
|
|
startInfo.WorkingDirectory = Environment.CurrentDirectory;
|
|
startInfo.FileName = Application.ExecutablePath;
|
|
startInfo.Arguments = param;
|
|
startInfo.Verb = "runas";
|
|
try
|
|
{
|
|
Process.Start(startInfo);
|
|
Application.Exit();
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.WriteLine(ex.Message);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
public static void KillByName(string name)
|
|
{
|
|
foreach (var process in Process.GetProcessesByName(name))
|
|
{
|
|
try
|
|
{
|
|
process.Kill();
|
|
Logger.WriteLine($"Stopped: {process.ProcessName}");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.WriteLine($"Failed to stop: {process.ProcessName} {ex.Message}");
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void KillByProcess(Process process)
|
|
{
|
|
try
|
|
{
|
|
process.Kill();
|
|
Logger.WriteLine($"Stopped: {process.ProcessName}");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.WriteLine($"Failed to stop: {process.ProcessName} {ex.Message}");
|
|
}
|
|
}
|
|
|
|
public static void StopDisableService(string serviceName)
|
|
{
|
|
try
|
|
{
|
|
string script = $"Get-Service -Name \"{serviceName}\" | Stop-Service -Force -PassThru | Set-Service -StartupType Disabled";
|
|
Logger.WriteLine(script);
|
|
RunCMD("powershell", script);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.WriteLine(ex.ToString());
|
|
}
|
|
}
|
|
|
|
public static void StartEnableService(string serviceName)
|
|
{
|
|
try
|
|
{
|
|
string script = $"Set-Service -Name \"{serviceName}\" -Status running -StartupType Automatic";
|
|
Logger.WriteLine(script);
|
|
RunCMD("powershell", script);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.WriteLine(ex.ToString());
|
|
}
|
|
}
|
|
|
|
public static void RunCMD(string name, string args)
|
|
{
|
|
var cmd = new Process();
|
|
cmd.StartInfo.UseShellExecute = false;
|
|
cmd.StartInfo.CreateNoWindow = true;
|
|
cmd.StartInfo.RedirectStandardOutput = true;
|
|
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
|
|
cmd.StartInfo.FileName = name;
|
|
cmd.StartInfo.Arguments = args;
|
|
cmd.Start();
|
|
Logger.WriteLine(cmd.StandardOutput.ReadToEnd());
|
|
cmd.WaitForExit();
|
|
}
|
|
|
|
|
|
}
|
|
}
|