代码之家  ›  专栏  ›  技术社区  ›  Tim Joseph

在Windows7中以编程方式设置时间

  •  7
  • Tim Joseph  · 技术社区  · 14 年前

    我正在将一个应用程序从Windows 2000(不要问)移植到Windows 7,我需要复制允许用户从GUI设置时间的功能。以前,这是通过使用命令提示符直接调用“time”来完成的,但在Windows7中,用户权限似乎有所更改。

    在做了一些研究之后,您似乎可以通过调用 kernel32.dll 方法 Win32SetSystemTime SE_SYSTEMTIME_NAME 不管我怎么努力,我似乎都做不到。

    Win32SetSystemTime ?

    3 回复  |  直到 6 年前
        1
  •  7
  •   Kirk Woll    14 年前

    不知道为什么不适合你。以下代码将时间设置为今天的UTC下午4:12。(为我工作)

    public class Program 
    {
        public struct SystemTime
        {
            public ushort Year;
            public ushort Month;
            public ushort DayOfWeek;
            public ushort Day;
            public ushort Hour;
            public ushort Minute;
            public ushort Second;
            public ushort Millisecond;
        };
    
        [DllImport("kernel32.dll", EntryPoint = "SetSystemTime", SetLastError = true)]
        public extern static bool Win32SetSystemTime(ref SystemTime st);
    
        public static void Main(string[] args)
        {
            SystemTime st = new SystemTime
            {
                Year = 2010, Month = 10, Day = 18, Hour = 16, Minute = 12, DayOfWeek = 1
            };
        }
    }
    

    根据 docs

    调用进程必须具有seu SYSTEMTIME\u NAME权限。默认情况下,此权限被禁用。SetSystemTime函数在更改系统时间之前启用SE_system time_NAME权限,并在返回之前禁用该权限。有关详细信息,请参阅使用特殊权限运行。

    看来这不应该是个问题。

        2
  •  6
  •   I. J. Kennedy ShankarSangoli    14 年前

    好吧,如果最坏的情况变成最坏的,总会有

    System.Diagnostics.Process.Start("CMD", "/C TIME 19:58");  // set time to 7:58PM
    
        3
  •  4
  •   Kate Gregory    14 年前

    您的应用需要提升才能更改时间(因为更改时间可能导致活动日志等不真实),但不能更改时区。使用requireAdministrator在应用程序上放置清单,应用程序将提升。(若要在生成清单之前对此进行测试,请右键单击您的exe并以管理员身份运行。这将只提升一次应用程序。提升与由恰好属于Administrators组的人启动是不同的。是关于选择 使用

    用户可能不喜欢UAC提示符,因此如果时间更改很少,请将其拆分为单独的exe,使用asInvoker在主应用程序上放置一个清单,使用requireAdministrator在时间更改器上放置另一个清单,然后使用ShellExecute从主应用程序启动时间更改器。理想情况下,有一个按钮或菜单项来实现这一点,并在其上放置一个屏蔽图标,这样UAC提示就不会让用户感到惊讶。我拒绝了没想到的UAC提示。