找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 1839|回复: 25

[分享] 修改系统安装时间

  [复制链接]
发表于 2026-5-6 18:31:52 | 显示全部楼层 |阅读模式
本帖最后由 kedion 于 2026-5-7 10:07 编辑

AI写的联网后自动从ntp获取当前时间,并且修改系统安装时间为当前时间
  1. # ========== 修改当前进程执行策略 ==========
  2. try {
  3.     Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force -ErrorAction Stop
  4.     Write-Host "当前进程执行策略已临时设置为 Bypass" -ForegroundColor Green
  5. } catch {
  6.     Write-Host "错误:无法修改当前进程的执行策略!" -ForegroundColor Red
  7.     Write-Host "原因: $($_.Exception.Message)" -ForegroundColor Red
  8.     Write-Host "请手动以管理员身份运行 PowerShell,然后执行以下命令:" -ForegroundColor Yellow
  9.     Write-Host "  Set-ExecutionPolicy -Scope Process Bypass" -ForegroundColor White
  10.     Write-Host "  cd `"$PSScriptRoot`""
  11.     Write-Host "  .\`"$([System.IO.Path]::GetFileName($PSCommandPath))`""
  12.     Write-Host "按任意键退出..."
  13.     $null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
  14.     exit 1
  15. }

  16. # ========== 防火墙 NTP 端口放行(出站+入站) ==========
  17. function Ensure-NTPFirewallRules {
  18.     Write-Host "正在配置防火墙放行所有 NTP 规则(UDP 123)..." -ForegroundColor White

  19.     $rules = @(
  20.         @{
  21.             Name        = "NTP Client Outbound (UDP 123)"
  22.             Description = "允许 NTP 客户端通过 UDP 123 端口出站同步时间"
  23.             Direction   = "Outbound"
  24.             LocalPort   = "Any"
  25.             RemotePort  = "123"
  26.         },
  27.         @{
  28.             Name        = "NTP Client Inbound (UDP 123)"
  29.             Description = "允许 NTP 客户端接收 UDP 123 端口的应答数据"
  30.             Direction   = "Inbound"
  31.             LocalPort   = "123"
  32.             RemotePort  = "Any"
  33.         }
  34.     )

  35.     $allOk = $true

  36.     foreach ($rule in $rules) {
  37.         $ruleName = $rule.Name
  38.         $existing = Get-NetFirewallRule -DisplayName $ruleName -ErrorAction SilentlyContinue

  39.         if ($existing) {
  40.             if ($existing.Enabled -eq 'True' -and $existing.Action -eq 'Allow') {
  41.                 Write-Host "规则已存在并正确启用: $ruleName" -ForegroundColor Green
  42.             } else {
  43.                 Write-Host "规则存在但状态异常,正在修复: $ruleName" -ForegroundColor Yellow
  44.                 try {
  45.                     Set-NetFirewallRule -DisplayName $ruleName -Enabled True -Action Allow -ErrorAction Stop
  46.                     Write-Host "规则已修复。" -ForegroundColor Green
  47.                 } catch {
  48.                     Write-Host "修复失败: $($_.Exception.Message)" -ForegroundColor Red
  49.                     $allOk = $false
  50.                 }
  51.             }
  52.             continue
  53.         }

  54.         try {
  55.             Write-Host "  → 正在创建规则: $ruleName" -ForegroundColor Yellow
  56.             New-NetFirewallRule -DisplayName $ruleName `
  57.                 -Description $rule.Description `
  58.                 -Direction $rule.Direction `
  59.                 -Protocol UDP `
  60.                 -LocalPort $rule.LocalPort `
  61.                 -RemotePort $rule.RemotePort `
  62.                 -Action Allow `
  63.                 -Enabled True `
  64.                 -Profile Any `
  65.                 -ErrorAction Stop | Out-Null
  66.             Write-Host "规则已创建并启用。" -ForegroundColor Green
  67.         } catch {
  68.             Write-Host "创建失败: $($_.Exception.Message)" -ForegroundColor Red
  69.             $allOk = $false
  70.         }
  71.     }

  72.     if ($allOk) {
  73.         Write-Host "所有 NTP 防火墙规则已正确配置。" -ForegroundColor Green
  74.     } else {
  75.         Write-Host "部分规则配置失败,但仍将继续尝试同步时间。" -ForegroundColor Yellow
  76.     }
  77.     return $allOk
  78. }

  79. # ========== NTP 同步函数(单次请求,带重试,已修复资源泄漏) ==========
  80. function Sync-TimeFromNTP {
  81.     param([string]$server, [int]$port = 123, [int]$retries = 3)

  82.     $attempt = 0
  83.     while ($attempt -lt $retries) {
  84.         $client = $null
  85.         try {
  86.             $ntpData = New-Object byte[] 48
  87.             $ntpData[0] = 0x1B  # LI=0, VN=3, Mode=3

  88.             $client = New-Object System.Net.Sockets.UdpClient
  89.             $client.Connect($server, $port)
  90.             $null = $client.Send($ntpData, $ntpData.Length)

  91.             $client.Client.ReceiveTimeout = 5000  # 5 秒超时
  92.             $remoteEP = New-Object System.Net.IPEndPoint ([IPAddress]::Any, 0)
  93.             $receivedData = $client.Receive([ref]$remoteEP)

  94.             # 解析 Transmit Timestamp(第40-47字节)
  95.             $intPart = [UInt64]0
  96.             $fracPart = [UInt64]0
  97.             for ($i = 0; $i -lt 4; $i++) {
  98.                 $intPart = ($intPart -shl 8) -bor $receivedData[40 + $i]
  99.             }
  100.             for ($i = 4; $i -lt 8; $i++) {
  101.                 $fracPart = ($fracPart -shl 8) -bor $receivedData[40 + $i]
  102.             }

  103.             $ntpSeconds = [double]$intPart + ([double]$fracPart / 4294967296.0)
  104.             $unixTimestamp = $ntpSeconds - 2208988800.0

  105.             if ($unixTimestamp -le 0) {
  106.                 throw "NTP 返回时间戳无效"
  107.             }

  108.             $utcTime = ([DateTime]'1970-01-01 00:00:00').AddSeconds($unixTimestamp)
  109.             return $utcTime
  110.         }
  111.         catch {
  112.             $attempt++
  113.             Write-Host "  [$server] 第 $attempt 次尝试失败: $($_.Exception.Message.TrimEnd())" -ForegroundColor DarkGray
  114.             if ($attempt -lt $retries) { Start-Sleep -Milliseconds 500 }
  115.         }
  116.         finally {
  117.             if ($client) {
  118.                 try { $client.Close() } catch {}
  119.                 try { $client.Dispose() } catch {}
  120.             }
  121.         }
  122.     }
  123.     return $null
  124. }

  125. # ========== 设置系统本地时间(kernel32 调用) ==========
  126. Add-Type -TypeDefinition @"
  127. using System;
  128. using System.Runtime.InteropServices;
  129. public class WinAPI {
  130.     [StructLayout(LayoutKind.Sequential)]
  131.     public struct SYSTEMTIME {
  132.         public UInt16 wYear;
  133.         public UInt16 wMonth;
  134.         public UInt16 wDayOfWeek;
  135.         public UInt16 wDay;
  136.         public UInt16 wHour;
  137.         public UInt16 wMinute;
  138.         public UInt16 wSecond;
  139.         public UInt16 wMilliseconds;
  140.     }
  141.     [DllImport("kernel32.dll", SetLastError = true)]
  142.     public static extern bool SetLocalTime(ref SYSTEMTIME st);
  143. }
  144. "@

  145. function Set-LocalTime {
  146.     param([DateTime]$localTime)
  147.     $st = New-Object WinAPI+SYSTEMTIME
  148.     $st.wYear = $localTime.Year
  149.     $st.wMonth = $localTime.Month
  150.     $st.wDay = $localTime.Day
  151.     $st.wDayOfWeek = [System.UInt16]$localTime.DayOfWeek
  152.     $st.wHour = $localTime.Hour
  153.     $st.wMinute = $localTime.Minute
  154.     $st.wSecond = $localTime.Second
  155.     $st.wMilliseconds = $localTime.Millisecond
  156.     return [WinAPI]::SetLocalTime([ref]$st)
  157. }

  158. # ========== 将 UTC DateTime 转换为 18 位 LDAP 时间戳(已修复精度问题) ==========
  159. function ConvertTo-LDAPTimestamp {
  160.     param([DateTime]$DateTime)
  161.    
  162.     $utcTime = $DateTime.ToUniversalTime()
  163.     Write-Host "计算 LDAP 时间戳基于 UTC: $($utcTime.ToString('yyyy-MM-dd HH:mm:ss'))"
  164.    
  165.     $epoch = New-Object DateTime(1601, 1, 1, 0, 0, 0, [DateTimeKind]::Utc)
  166.     $ticks = $utcTime.Ticks - $epoch.Ticks

  167.     $highPart = [int64]($ticks / 10000000)
  168.     $lowPart  = $ticks % 10000000
  169.    
  170.     $ldapString = $highPart.ToString() + $lowPart.ToString("0000000")
  171.     return $ldapString
  172. }

  173. # ========== 主流程 ==========
  174. Write-Host "`n========== 防火墙配置 ==========" -ForegroundColor Cyan
  175. $firewallOk = Ensure-NTPFirewallRules
  176. if (-not $firewallOk) {
  177.     Write-Host "部分防火墙规则未正确配置,但仍将继续尝试同步..." -ForegroundColor Yellow
  178. }

  179. $ntpServers = @(
  180.     "ntp.ntsc.ac.cn",
  181.     "time.aliyun.com",
  182.     "ntp.tencent.com",
  183.     "ntp1.aliyun.com",
  184.     "cn.pool.ntp.org",
  185.     "edu.ntp.org.cn"
  186. )

  187. $timeService = Get-Service -Name w32time -ErrorAction SilentlyContinue
  188. $wasRunning = $false
  189. if ($timeService -and $timeService.Status -eq 'Running') {
  190.     Write-Host "正在停止 w32time 服务以释放 UDP 123 端口..." -ForegroundColor Yellow
  191.     Stop-Service w32time -Force -ErrorAction SilentlyContinue
  192.     Start-Sleep -Milliseconds 500
  193.     $wasRunning = $true
  194. }

  195. $synced = $false
  196. $utcResult = $null

  197. try {
  198.     Write-Host "`n========== NTP 时间同步 ==========" -ForegroundColor Cyan
  199.     foreach ($server in $ntpServers) {
  200.         Write-Host "正在尝试从 $server 获取时间..." -ForegroundColor White
  201.         $utcResult = Sync-TimeFromNTP -server $server
  202.         if ($utcResult) {
  203.             $localTime = $utcResult.ToLocalTime()
  204.             if (Set-LocalTime -localTime $localTime) {
  205.                 $synced = $true
  206.                 Write-Host "时间同步成功(来源:$server)" -ForegroundColor Green
  207.                 break
  208.             } else {
  209.                 Write-Host "设置系统时间失败,请确认管理员权限。" -ForegroundColor Red
  210.                 break
  211.             }
  212.         } else {
  213.             Write-Host "无法从 $server 获取有效时间" -ForegroundColor Yellow
  214.         }
  215.     }
  216. }
  217. finally {
  218.     if ($wasRunning) {
  219.         Write-Host "正在恢复 w32time 服务..." -ForegroundColor Yellow
  220.         Start-Service w32time -ErrorAction SilentlyContinue
  221.     }
  222. }

  223. if (-not $synced) {
  224.     Write-Host "`n所有 NTP 服务器均未能返回有效时间!" -ForegroundColor Red
  225.     Write-Host "请检查网络连接后重试。" -ForegroundColor DarkYellow
  226.     Write-Host "按任意键退出..."
  227.     $null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
  228.     exit 1
  229. }

  230. $utcNow = [DateTime]::UtcNow
  231. $localNow = $utcNow.ToLocalTime()
  232. $unixTimestamp = [int64]($utcNow - [DateTime]::new(1970,1,1,0,0,0,[DateTimeKind]::Utc)).TotalSeconds
  233. $ntFileTime = $utcNow.ToFileTime()

  234. Write-Host "`n同步后的时间:" -ForegroundColor Cyan
  235. Write-Host "  本地时间    : $($localNow.ToString('yyyy-MM-dd HH:mm:ss'))"
  236. Write-Host "  Unix 时间戳 : $unixTimestamp"
  237. Write-Host "  NT 文件时间 : $ntFileTime"

  238. $regPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
  239. try {
  240.     if ($unixTimestamp -lt 0 -or $unixTimestamp -gt [UInt32]::MaxValue) {
  241.         throw "Unix 时间戳超出 REG_DWORD 范围"
  242.     }
  243.     New-ItemProperty -Path $regPath -Name "InstallDate" -Value ([UInt32]$unixTimestamp) -PropertyType DWord -Force | Out-Null
  244.     Write-Host "InstallDate (REG_DWORD) 写入成功" -ForegroundColor Green

  245.     $ldapTimestampString = ConvertTo-LDAPTimestamp -DateTime $utcNow
  246.     if ([string]::IsNullOrEmpty($ldapTimestampString)) {
  247.         throw "LDAP 时间戳计算结果为空"
  248.     }
  249.    
  250.     $ldapTimestamp = [UInt64]$ldapTimestampString
  251.     New-ItemProperty -Path $regPath -Name "InstallTime" -Value $ldapTimestamp -PropertyType QWord -Force | Out-Null
  252.     Write-Host "InstallTime (REG_QWORD) 写入成功: $ldapTimestampString" -ForegroundColor Green

  253.     Write-Host "`n系统安装时间已成功更新!" -ForegroundColor Cyan
  254. }
  255. catch {
  256.     Write-Host "注册表写入失败:$($_.Exception.Message)" -ForegroundColor Red
  257. }

  258. Write-Host "`n按任意键退出..."
  259. $null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
复制代码

Snipaste_2026-05-06_18-22-31.png
不知道为啥,直接powershell运行,临时运行策略不生效,使用Ps1_To_Exe转成exe后又没问题,用的是administrator账号测试的,求大佬指点
发表于 4 天前 | 显示全部楼层
很好,学习了。
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
ddzyhhh 发表于 2026-5-10 17:20
这个吗?

https://a01.lanzout.com/im02w2a3busf

就是这个,搭配这个更好用。
wk78.com/thread-637-1-1.html
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
zep 发表于 2026-5-10 16:03
隔壁论坛有一个类似的程序,10几K,不过需要鼠标点两下。


这个吗?

https://a01.lanzout.com/im02w2a3busf
https://www.123pan.com/s/jE3Sjv-Kpkxd

回复

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
zep 发表于 2026-5-10 16:03
隔壁论坛有一个类似的程序,10几K,不过需要鼠标点两下。

你说的是5大写的pecmd修改系统安装时间的帖子吧,这个就是跟5大的核心操作是一样的,只不过用了不同的语言写的
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
隔壁论坛有一个类似的程序,10几K,不过需要鼠标点两下。

点评

这个吗? https://a01.lanzout.com/im02w2a3busf https://www.123pan.com/s/jE3Sjv-Kpkxd  详情 回复 发表于 4 天前
你说的是5大写的pecmd修改系统安装时间的帖子吧,这个就是跟5大的核心操作是一样的,只不过用了不同的语言写的  详情 回复 发表于 4 天前
回复

使用道具 举报

发表于 4 天前 | 显示全部楼层
路过看看
回复

使用道具 举报

 楼主| 发表于 4 天前 | 显示全部楼层
nfans 发表于 2026-5-7 10:50
好复杂的流程,仅采集当前系统日期就行了吧,日期不对鼠标点几下而已,NTP本身涉及的细节挺多 ...

采集当前的时间,那时间不对呢,一台电脑改时间点记下,一百台主机呢,一千台主机呢。看似复杂,实际上是简单快速的,对于大批量操作来说,就是最快的
回复

使用道具 举报

发表于 6 天前 | 显示全部楼层
还有这个操作的,试试看
回复

使用道具 举报

发表于 6 天前 | 显示全部楼层
真!电脑能干的活就坚决不动手
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
kedion 发表于 2026-5-7 09:50
BIOS时间不对,装出来的系统,显示的时间不正确然后被电商客户说卖二手,各种奇怪的需求都是因为被逼出来 ...

不容易啊
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
感谢大神的制作,谢谢
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
ai做个小玩具
挺好的
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
好复杂的流程,仅采集当前系统日期就行了吧,日期不对鼠标点几下而已,NTP本身涉及的细节挺多

点评

采集当前的时间,那时间不对呢,一台电脑改时间点记下,一百台主机呢,一千台主机呢。看似复杂,实际上是简单快速的,对于大批量操作来说,就是最快的  详情 回复 发表于 4 天前
回复

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
baby666 发表于 2026-5-7 07:06
显得电脑是新装的吗?🤭

BIOS时间不对,装出来的系统,显示的时间不正确然后被电商客户说卖二手,各种奇怪的需求都是因为被逼出来的
回复

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
忧心的启 发表于 2026-5-7 09:01
我记得改这个就一个注册表项,用批处理一条命令就行,不用这么复杂吧?不过折腾也好,越玩越会。支持折腾起 ...

是得改两个注册表的值,而且需要转换时间戳,用ntp获取时间是因为有遇到新装的电脑,BIOS时间不对,装出来的系统,显示的时间不正确然后被电商客户说卖二手,防火墙放行是因为默认系统会开启防火墙
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
我记得改这个就一个注册表项,用批处理一条命令就行,不用这么复杂吧?不过折腾也好,越玩越会。支持折腾起来。

点评

是得改两个注册表的值,而且需要转换时间戳,用ntp获取时间是因为有遇到新装的电脑,BIOS时间不对,装出来的系统,显示的时间不正确然后被电商客户说卖二手,防火墙放行是因为默认系统会开启防火墙  详情 回复 发表于 7 天前
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
显得电脑是新装的吗?🤭

点评

BIOS时间不对,装出来的系统,显示的时间不正确然后被电商客户说卖二手,各种奇怪的需求都是因为被逼出来的  详情 回复 发表于 7 天前
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
学到了,感谢楼主
回复

使用道具 举报

发表于 2026-5-6 21:56:35 | 显示全部楼层
费这么大劲有什么用?
回复

使用道具 举报

发表于 2026-5-6 21:51:55 | 显示全部楼层
有何意义
回复

使用道具 举报

发表于 2026-5-6 21:09:03 | 显示全部楼层
AI就是如此方便。
回复

使用道具 举报

发表于 2026-5-6 19:21:49 来自手机 | 显示全部楼层
帮顶,同时首次了解到PS1也能转换为exe
回复

使用道具 举报

发表于 2026-5-6 19:02:17 | 显示全部楼层
不错,试试
回复

使用道具 举报

发表于 2026-5-6 18:56:11 | 显示全部楼层
回复

使用道具 举报

发表于 2026-5-6 18:45:19 | 显示全部楼层
有什么作用?谢谢

评分

参与人数 1无忧币 +5 收起 理由
yyz2191958 + 5

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-5-14 05:08

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表