在日常工作中,有時可能會需要獲取或修改客戶端電腦的系統時間,比如軟體設置了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/
本文版權歸作者和博客園共有,寫文不易,支持原創,歡迎轉載【點贊】,轉載請保留此段聲明,且在文章頁面明顯位置給出原文連接,謝謝。
關註個人公眾號,定時同步更新技術及職場文章