using System.Runtime.InteropServices;
using System.Security.Cryptography.X509Certificates;
using System.Security.Principal;
namespace IES.ExamServer.Helpers
{
public static class SystemScriptHelper
{
///
/// 检查是否管理员身份运行
///
///
public static bool IsAdministrator()
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
// 获取当前用户的 Windows 身份
WindowsIdentity identity = WindowsIdentity.GetCurrent();
// 创建一个 WindowsPrincipal 对象,用于表示当前用户的主体
WindowsPrincipal principal = new WindowsPrincipal(identity);
// 检查当前用户是否属于管理员组
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
return false;
}
///
/// 根据域名在hosts文件中找到对于的ip地址。
///
///
///
public static (string? ip, string msg) FindIpAddressForDomain(string domain)
{
string? lastMatchingIp = null;
try
{
string filePath = @"C:\Windows\System32\drivers\etc\hosts";
string[] lines = File.ReadAllLines(filePath);
foreach (string line in lines)
{
string trimmedLine = line.Trim();
if (string.IsNullOrEmpty(trimmedLine) || trimmedLine.StartsWith("#"))
{
continue;
}
string[] parts = trimmedLine.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
if (parts.Length >= 2)
{
string ip = parts[0];
for (int i = 1; i < parts.Length; i++)
{
if (parts[i].Equals(domain, StringComparison.OrdinalIgnoreCase))
{
lastMatchingIp = ip;
}
}
}
}
}
catch (Exception ex)
{
return (null, $"读取文件时出错: {ex.Message}");
}
return (lastMatchingIp, "匹配结果");
}
///
/// 检查证书是否安装,切是否过期,true 已经安装,false 未安装,用于检查证书是否需要重新安装,最终返回 true不用安装。
/// 代码中使用的是 CurrentUser 存储位置,如果你需要检查计算机级别的证书存储区,可以将 StoreLocation.CurrentUser 替换为 StoreLocation.LocalMachine,但这可能需要管理员权限。
///
///
///
public static bool CheckCertificate(string certificatePath)
{
bool installed = false, expired=false;
X509Certificate2 certificate = new X509Certificate2(certificatePath);
// 定义要检查的证书存储区
StoreName[] storeNames = { StoreName.Root, StoreName.CertificateAuthority, StoreName.My };
foreach (StoreName storeName in storeNames)
{
if (IsAdministrator())
{
using (X509Store store = new X509Store(storeName, StoreLocation.LocalMachine))
{
try
{
// 打开存储区
store.Open(OpenFlags.ReadOnly);
// 查找匹配的证书
X509Certificate2Collection collection = store.Certificates.Find(X509FindType.FindByThumbprint, certificate.Thumbprint, false);
if (collection.Count > 0)
{
installed = true;
var certificateInstalled = collection.First();
expired = CheckCertificateExpired(certificateInstalled);
break;
}
}
catch (Exception ex)
{
Console.WriteLine($"访问 {storeName} 存储区时出错: {ex.Message}");
}
finally
{
// 关闭存储区
store.Close();
}
}
}
else {
using (X509Store store = new X509Store(storeName, StoreLocation.CurrentUser))
{
try
{
// 打开存储区
store.Open(OpenFlags.ReadOnly);
// 查找匹配的证书
X509Certificate2Collection collection = store.Certificates.Find(X509FindType.FindByThumbprint, certificate.Thumbprint, false);
if (collection.Count > 0)
{
installed = true;
var certificateInstalled = collection.First();
expired = CheckCertificateExpired(certificateInstalled);
break;
}
}
catch (Exception ex)
{
Console.WriteLine($"访问 {storeName} 存储区时出错: {ex.Message}");
}
finally
{
// 关闭存储区
store.Close();
}
}
}
}
return installed && !expired;
}
///
/// 检查证书是否过期,true 过期,false 未过期
///
///
///
public static bool CheckCertificateExpired(X509Certificate2 certificate)
{
DateTime now = DateTime.Now;
return now < certificate.NotBefore || now > certificate.NotAfter;
}
}
}