C# 通過Win32API設置客戶端系統時間

来源:https://www.cnblogs.com/hsiang/p/18251106
-Advertisement-
Play Games

在日常工作中,有時可能會需要獲取或修改客戶端電腦的系統時間,比如軟體設置了Licence有效期,預計2024-06-01 00:00:00到期,如果客戶手動修改了客戶端電腦時間,往前調整了一年,則軟體就可以繼續使用一年,如此迴圈往複,則Licence將形同虛設。所以有時候需要校驗客戶端電腦時間和服務... ...


在日常工作中,有時可能會需要獲取或修改客戶端電腦的系統時間,比如軟體設置了Licence有效期,預計2024-06-01 00:00:00到期,如果客戶手動修改了客戶端電腦時間,往前調整了一年,則軟體就可以繼續使用一年,如此迴圈往複,則Licence將形同虛設。所以有時候需要校驗客戶端電腦時間和伺服器端時間,是否一致,如果不一致,則需要修改客戶端電腦時間或進行系統提示。本文以一個簡單的小例子,簡述如何通過C#獲取和設置客戶端電腦的系統時間,僅供學習分享使用,如有不足之處,還請指正。

 

涉及知識點

 

在windows系統中,設置系統時間,主要通過win32提供的API來實現,如下所示:

  • SetLocalTime 設置系統的本地化時間
  • GetLocalTime 獲取系統的本地化時間
  • SetSystemTime 設置系統的Utc時間
  • GetSystemTime 獲取系統的Utc時間

 

核心代碼

 

時間結構體

 

在上述四個系統函數中,都需要一個時間類型的結構體,包含時分秒,年月日。如下所示:

[StructLayout(LayoutKind.Sequential)]
public struct SystemTime
{
	public ushort wYear;
	public ushort wMonth;
	public ushort wDayOfWeek;
	public ushort wDay;
	public ushort wHour;
	public ushort wMinute;
	public ushort wSecond;
	public ushort wMilliseconds;

	public override string ToString()
	{
		return $"{wYear}-{wMonth}-{wDay} {wHour}:{wMinute}:{wSecond}.{wMilliseconds}";
	}
}

 

系統時間幫助類

 

為了方便調用,將4個系統函數進行封裝到一個類中SysTimeHelper,如下所示:

public class SysTimeHelper
{
	[DllImport("kernel32.dll")]
	public static extern bool SetSystemTime(ref SystemTime st);

	[DllImport("Kernel32.dll")]
	public static extern bool SetLocalTime(ref SystemTime st);

	[DllImport("Kernel32.dll")]
	public static extern void GetSystemTime(ref SystemTime st);

	[DllImport("Kernel32.dll")]
	public static extern void GetLocalTime(ref SystemTime st);

	public static string GetLocalTime()
	{
		SystemTime st = new SystemTime();
		GetLocalTime(ref st);
		return st.ToString();
	}

	public static bool SetLocalTimeByStr(string timestr)
	{
		bool flag = false;
		SystemTime sysTime = new SystemTime();
		DateTime dt = Convert.ToDateTime(timestr);
		sysTime.wYear = Convert.ToUInt16(dt.Year);
		sysTime.wMonth = Convert.ToUInt16(dt.Month);
		sysTime.wDay = Convert.ToUInt16(dt.Day);
		sysTime.wHour = Convert.ToUInt16(dt.Hour);
		sysTime.wMinute = Convert.ToUInt16(dt.Minute);
		sysTime.wSecond = Convert.ToUInt16(dt.Second);
		try
		{
			flag = SetLocalTime(ref sysTime);
		}
		catch (Exception ex)
		{
			string e = ex.Message;
			return false;
		}
		return flag;
	}

	/// <summary>        
	/// 時間戳轉為C#格式時間        
	/// </summary>        
	/// <param name=”timeStamp”></param>        
	/// <returns></returns>        
	public static DateTime ConvertStringToDateTime(string timeStamp)
	{
		DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
		long lTime = long.Parse(timeStamp + "0000");
		TimeSpan toNow = new TimeSpan(lTime);
		return dtStart.Add(toNow);
	}

	/// <summary>
	/// 時間戳轉為C#格式時間10位
	/// </summary>
	/// <param name="timeStamp">Unix時間戳格式</param>
	/// <returns>C#格式時間</returns>
	public static DateTime GetDateTimeFrom1970Ticks(long curSeconds)
	{
		DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
		return dtStart.AddSeconds(curSeconds);
	}


}

 

函數調用

 

在頁面調用時,即可通過SysTimeHelper幫助類,進行獲取和修改系統時間。如下所示:

 

public partial class MainWindow : Window
{
	public MainWindow()
	{
		InitializeComponent();
	}

	private void Window_Loaded(object sender, RoutedEventArgs e)
	{
		var time = SysTimeHelper.GetLocalTime();
		this.txtTime.Text = time;
	}

	private void Button_Click(object sender, RoutedEventArgs e)
	{
		var time = this.txtTime.Text;
		bool flag = SysTimeHelper.SetLocalTimeByStr(time);
		if(flag)
		{
			MessageBox.Show("設置成功");
		}
		else
		{
			MessageBox.Show("設置失敗");
		}
	}
}

 

實例演示

 

通過VS運行程式,在打開程式時,獲取時間,然後手動修改時間,點擊設置,如下所示:

如果設置過後,想要回覆,可通過設置頁面【同步時鐘】進行恢復,如下所示:

 

註意,如果在調試時,設置失敗【SetLocalTime返回false】,可通過管理員方式運行Visual Studio,如下所示:

 

 

或者直接通過管理員身份運行程式,如下所示:

 

 

以上就是【C# 通過Win32API設置客戶端系統時間】的全部內容,希望可以拋磚引玉,一起學習,共同進步。

 


作者:小六公子
出處:http://www.cnblogs.com/hsiang/
本文版權歸作者和博客園共有,寫文不易,支持原創,歡迎轉載【點贊】,轉載請保留此段聲明,且在文章頁面明顯位置給出原文連接,謝謝。
關註個人公眾號,定時同步更新技術及職場文章


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首發地址: https://mp.weixin.qq.com/s/w6v3RhqN0hJlWYlqTzGCxA 前言 之前在PC微信逆向) 定位微信瀏覽器打開鏈接的call提過要寫一個保存公眾號歷史文章的工具。這篇文章先寫一個將文章保存成pdf和html的工具,後面再補充一個採集歷史的工具,搭配使用 ...
  • ​記錄下FFmpeg的學習筆記目錄,完整的FFmpeg開發實戰內容詳見《FFmpeg開發實戰:從零基礎到短視頻上線》一書。 下麵是補充的FFmpeg開發筆記內容目錄,主要是對《FFmpeg開發實戰:從零基礎到短視頻上線》一書的進階增補。 第一章 Linux環境編譯FFmpeg FFmpeg開發筆記( ...
  • 目錄條款32:確定你的public繼承塑模出is-a關係(Make sure public inheritance models “is-a”)public繼承的含義設計良好的繼承關係is-a的例外條款33:避免遮掩繼承而來的名稱(Avoid hiding inherited names)作用域的隱 ...
  • Python中有三種比較常見的方法類型,如類方法和靜態方法,實例方法,他們是面向對象編程中重要的概念。 1.類方法 類方法是通過使用裝飾器@classmethod來定義的,他的第一個參數是cls,指向類本身,允許我們在方法中操作類的屬性或調用其他類方法。 類方法的使用:類方法可以通過類名和實例對象來 ...
  • 大家好,我是碼農先森。 之前有朋友讓我分享從 PHP 轉 Go 的經歷,這次它來了。我主要從模仿、進階、應用這三個方面來描述轉 Go 的經歷及心得。模仿是良好的開端,進階是艱難的成長,應用是認知的提升。希望我的經歷對大家能有所啟發。 模仿 著名藝術家畢加索說過「模仿是人類一切學習的開端,然後才是創新 ...
  • 寫在前面 在之前的文章中我們有介紹過SpringAI這個項目。SpringAI 是Spring 官方社區項目,旨在簡化 Java AI 應用程式開發, 讓 Java 開發者想使用 Spring 開發普通應用一樣開發 AI 應用。 而SpringAI 主要面向的是國外的各種大模型接入,對於國內開發者可 ...
  • 目錄一、背景介紹1.1 爬取目標1.2 演示視頻1.3 軟體說明二、代碼講解2.1 調用API-搜索介面2.2 調用API-詳情介面2.3 API_KEY說明2.4 軟體界面模塊2.5 日誌模塊三、轉載聲明 一、背景介紹 1.1 爬取目標 用Python獨立開發了一款爬蟲軟體,作用是:通過搜索關鍵詞 ...
  • 大屏設置網卡開啟熱點後,經常收到反饋,手機端無法搜索到大屏熱點、或者手機連接大屏熱點失敗 這類問題一般有以下幾類情況: 1. 物理網卡IP與熱點網卡IP相同 2. 熱點網卡IP,非正常熱點IP(192.168.137.X) 熱點IP我們一般定為192.168.137.X,192.168.137.X是 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...