aierda 2024-05-23 18:22 采纳率: 72.1%
浏览 27
已结题

操作系统时间无法更新

我使用c#写了一个程序,去同步操作系统的时间,首先通过互联网获取时间,
然后通过调用Window api函数将时间更新到系统

        public static extern bool SetLocalTime(ref SystemTime sysTime); //调用此API将网络时间更新至操作系统
        [DllImport("Kernel32.dll")]

当我使用管理员身份运行这个程序时,有些机子能够更新成功,有些不些。
当然所有的机子都可以通过控制面板手动去更新系统时间。

这些不能通过程序更新系统时间的机子, 是由于它的策略或权限或注册表受限制了吗?

请教各位指点,或者能够提供有效的解决方案,感谢!

  • 写回答

34条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-23 18:22
    关注
    获得0.50元问题酬金

    引自免费微信小程序:皆我百晓生

    在处理操作系统级别的操作时,尤其是涉及系统时间这样的敏感信息,权限是非常重要的。从您的描述来看,有些计算机可能没有正确地授予您的应用程序所需的权限,导致无法更新系统时间。

    要解决这个问题,您可以尝试以下步骤:

    1. 确保程序以管理员权限运行:当用户运行程序时,要求他们以管理员权限运行。这可以通过在快捷方式的属性中设置"以管理员身份运行"来实现,或者在创建进程时明确设置权限。以下是C#中使用ProcessStartInfo设置管理员权限的例子:
    using System.Diagnostics;
    
    // ...
    
    var process = new Process();
    var startInfo = new ProcessStartInfo
    {
        FileName = "YourProgram.exe",
        Verb = "runas",  // 这里设置了以管理员权限运行
        UseShellExecute = true
    };
    process.StartInfo = startInfo;
    process.Start();
    
    1. 检查并修改安全策略:确保您的程序可以访问Windows API来更改系统时间。您可以在组策略编辑器(gpedit.msc)中检查相应的权限设置。查找并确认Computer Configuration > Windows Settings > Security Settings > Local Policies > User Rights Assignment > Change the system time策略是否已分配给正确的用户或组。

    2. 注册表检查与调整:虽然通常情况下,设置系统时间不需要对注册表进行操作,但某些情况下,注册表中的某些键值可能会阻止程序更改时间。例如,检查HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters下的NtpServerSpecialPollInterval等键值是否有异常。同时,确保W32Time服务是启用的,并且状态为“正在运行”。

    3. 使用备用方法:如果以上方法都无法解决问题,您可以尝试使用Windows Management Instrumentation (WMI) 来更改系统时间。下面是一个示例:

    using System.Management;
    
    // ...
    
    private void UpdateSystemTime()
    {
        var wmiScope = new ManagementScope("\\\\localhost\\root\\cimv2");
        wmiScope.Connect();
    
        var wmiDateTime = new ManagementObject("Win32_LocalTime", null, wmiScope);
        wmiDateTime.Get();
    
        var date = DateTime.Now; // 替换为您从互联网获取的实际时间
        wmiDateTime["Year"] = date.Year;
        wmiDateTime["Month"] = date.Month;
        wmiDateTime["DayOfWeek"] = (int)date.DayOfWeek;
        wmiDateTime["Day"] = date.Day;
        wmiDateTime["Hour"] = date.Hour;
        wmiDateTime["Minute"] = date.Minute;
        wmiDateTime["Second"] = date.Second;
        wmiDateTime["Milliseconds"] = date.Millisecond;
        
        wmiDateTime.Put(null, new object[0]);
    }
    

    如果所有方法仍然无法解决问题,可能是由于特定的防病毒软件或安全策略阻止了您的程序更改系统时间。在这种情况下,您可能需要联系IT部门或系统管理员寻求协助,看看是否有特殊的白名单机制可以应用到您的程序上。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 5月31日
  • 创建了问题 5月23日

悬赏问题

  • ¥15 Java与Hbase相关问题
  • ¥20 bash代码推送不上去 git fetch origin master #失败了
  • ¥15 LOL外服加入了反作弊系统,现在游戏录像rofl文件离线都无法打开
  • ¥45 工程软件单片机设计课题要求
  • ¥15 在centos7安装conda
  • ¥15 c#调用yolo3 dll文件获取的数据对不上
  • ¥20 WPF 如何实现多语言,label 和cs(live Charts)中是否都能翻译
  • ¥15 STM32F103上电短路问题
  • ¥15 打开软件提示错误:failed to get wglChoosePixelFormatARB
  • ¥15 (标签-python|关键词-char)