如何使用C#修改本地Windows系統(tǒng)時間
C#提升管理員權(quán)限修改本地Windows系統(tǒng)時間
在桌面應(yīng)用程序開發(fā)過程中,需要對C盤下進行文件操作或者系統(tǒng)參數(shù)進行設(shè)置,例如在沒有外網(wǎng)的情況下局域網(wǎng)內(nèi)部自己的機制進行時間同步校準,這是沒有管理員權(quán)限便無法進行設(shè)置。

1. 首先需要獲得校準時間,兩種方式:
通過可上網(wǎng)的電腦進行外部獲取當前時間。
通過NTP實現(xiàn)
//NTP消息大小摘要是16字節(jié) (RFC 2030) byte[] ntpData = new byte[48]; //設(shè)置跳躍指示器、版本號和模式值 // LI = 0 (no warning), VN = 3 (IPv4 only), Mode = 3 (Client Mode) ntpData[0] = 0x1B; IPAddress ip = iPAddress; // NTP服務(wù)給UDP分配的端口號是123 IPEndPoint ipEndPoint = new IPEndPoint(ip, 123); // 使用UTP進行通訊 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); socket.Connect(ipEndPoint); socket.ReceiveTimeout = 3000; socket.Send(ntpData); socket.Receive(ntpData); socket?.Close(); socket?.Dispose();
程序手動輸入。
2. 轉(zhuǎn)換為本地時間
//傳輸時間戳字段偏移量,以64位時間戳格式,應(yīng)答離開客戶端服務(wù)器的時間 const byte serverReplyTime = 40; // 獲得秒的部分 ulong intPart = BitConverter.ToUInt32(ntpData, serverReplyTime); //獲取秒的部分 ulong fractPart = BitConverter.ToUInt32(ntpData, serverReplyTime + 4); //由big-endian 到 little-endian的轉(zhuǎn)換 intPart = swapEndian(intPart); fractPart = swapEndian(fractPart); ulong milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000UL); // UTC時間 DateTime webTime = (new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddMilliseconds(milliseconds); //本地時間 DateTime dt = webTime.ToLocalTime();
3. 獲取當前是否是管理員
public static bool IsAdministrator()
{
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
4. 引入dll
[DllImport("kernel32.dll")]
private static extern bool SetLocalTime(ref Systemtime time);
//轉(zhuǎn)化后的時間進行本地設(shè)置,并返回成功與否
bool isSuccess = SetLocalDateTime(dt);
5. 提升權(quán)限
如果程序不是管理員身份運行則不可以設(shè)置時間
引入引用程序清單文件(app.manifest),步驟:添加新建項->選擇‘應(yīng)用程序清單文件(僅限windows)'
引入后再文件中出現(xiàn)app.manifest文件
| Value | Description | Comment |
|---|---|---|
| asInvoker | The application runs with the same access token as the parent process. | Recommended for standard user applications. Do refractoring with internal elevation points, as per the guidance provided earlier in this document. |
| highestAvailable | The application runs with the highest privileges the current user can obtain. | Recommended for mixed-mode applications. Plan to refractor the application in a future release. |
| requireAdministrator | The application runs only for administrators and requires that the application be launched with the full access token of an administrator. | Recommended for administrator only applications. Internal elevation points |
默認權(quán)限:
<requestedExecutionLevel level="asInvoker " uiAccess="false" />
asInvoker 表示當前用戶本應(yīng)該具有的權(quán)限
highestAvailable 表示提升當前用戶最高權(quán)限
requireAdministrator 表示提升為管理員權(quán)限
修改權(quán)限:
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
6. 重新生成程序
源碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace WindowsFormsApp1
{
public class DateTimeSynchronization
{
[StructLayout(LayoutKind.Sequential)]
private struct Systemtime
{
public short year;
public short month;
public short dayOfWeek;
public short day;
public short hour;
public short minute;
public short second;
public short milliseconds;
}
[DllImport("kernel32.dll")]
private static extern bool SetLocalTime(ref Systemtime time);
private static uint swapEndian(ulong x)
{
return (uint)(((x & 0x000000ff) << 24) +
((x & 0x0000ff00) << 8) +
((x & 0x00ff0000) >> 8) +
((x & 0xff000000) >> 24));
}
/// <summary>
/// 設(shè)置系統(tǒng)時間
/// </summary>
/// <param name="dt">需要設(shè)置的時間</param>
/// <returns>返回系統(tǒng)時間設(shè)置狀態(tài),true為成功,false為失敗</returns>
private static bool SetLocalDateTime(DateTime dt)
{
Systemtime st;
st.year = (short)dt.Year;
st.month = (short)dt.Month;
st.dayOfWeek = (short)dt.DayOfWeek;
st.day = (short)dt.Day;
st.hour = (short)dt.Hour;
st.minute = (short)dt.Minute;
st.second = (short)dt.Second;
st.milliseconds = (short)dt.Millisecond;
bool rt = SetLocalTime(ref st);
return rt;
}
private static IPAddress iPAddress = null;
public static bool Synchronization(string host, out DateTime syncDateTime, out string message)
{
syncDateTime = DateTime.Now;
try
{
message = "";
if (iPAddress == null)
{
var iphostinfo = Dns.GetHostEntry(host);
var ntpServer = iphostinfo.AddressList[0];
iPAddress = ntpServer;
}
DateTime dtStart = DateTime.Now;
//NTP消息大小摘要是16字節(jié) (RFC 2030)
byte[] ntpData = new byte[48];
//設(shè)置跳躍指示器、版本號和模式值
// LI = 0 (no warning), VN = 3 (IPv4 only), Mode = 3 (Client Mode)
ntpData[0] = 0x1B;
IPAddress ip = iPAddress;
// NTP服務(wù)給UDP分配的端口號是123
IPEndPoint ipEndPoint = new IPEndPoint(ip, 123);
// 使用UTP進行通訊
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.Connect(ipEndPoint);
socket.ReceiveTimeout = 3000;
socket.Send(ntpData);
socket.Receive(ntpData);
socket?.Close();
socket?.Dispose();
DateTime dtEnd = DateTime.Now;
//傳輸時間戳字段偏移量,以64位時間戳格式,應(yīng)答離開客戶端服務(wù)器的時間
const byte serverReplyTime = 40;
// 獲得秒的部分
ulong intPart = BitConverter.ToUInt32(ntpData, serverReplyTime);
//獲取秒的部分
ulong fractPart = BitConverter.ToUInt32(ntpData, serverReplyTime + 4);
//由big-endian 到 little-endian的轉(zhuǎn)換
intPart = swapEndian(intPart);
fractPart = swapEndian(fractPart);
ulong milliseconds = (intPart * 1000) + ((fractPart * 1000) / 0x100000000UL);
// UTC時間
DateTime webTime = (new DateTime(1900, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddMilliseconds(milliseconds);
//本地時間
DateTime dt = webTime.ToLocalTime();
bool isSuccess = SetLocalDateTime(dt);
syncDateTime = dt;
}
catch (Exception ex)
{
message = ex.Message;
return false;
}
return true;
}
}
}
以上就是如何使用C#修改本地Windows系統(tǒng)時間的詳細內(nèi)容,更多關(guān)于c#修改系統(tǒng)時間的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#中實現(xiàn)一次執(zhí)行多條帶GO的sql語句實例
這篇文章主要介紹了C#中實現(xiàn)一次執(zhí)行多條帶GO的sql語句,以實例形式較為詳細的分析了C#執(zhí)行sql語句的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-09-09
C# 獲取指定QQ頭像繪制圓形頭像框GDI(Graphics)的方法
某論壇的評論區(qū)模塊,發(fā)現(xiàn)這功能很不錯,琢磨了一晚上做了大致一樣的,用來當做 注冊模塊 的頭像綁定功能,下面通過實例代碼給大家介紹下C# 獲取指定QQ頭像繪制圓形頭像框GDI(Graphics)的方法,感興趣的朋友一起看看吧2021-11-11
.net文件上傳時實現(xiàn)通過文件頭確認文件類型的方法
這篇文章主要介紹了.net文件上傳時實現(xiàn)通過文件頭確認文件類型的方法,很實用的功能,需要的朋友可以參考下2014-07-07

