在Windows 7中以编程方式设置时间

时间:2010-10-19 00:43:22

标签: c# windows-7

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

完成一些研究后,您似乎可以使用对kernel32.dll方法Win32SetSystemTime的调用来设置时间,但会出现相同的权限问题。阅读MSDN我认为我需要启用SE_SYSTEMTIME_NAME,但无论我尝试什么,我似乎无法使其工作。

是否有人为Windows 7提供了一些经过测试的示例代码,以允许对Win32SetSystemTime进行API调用?

3 个答案:

答案 0 :(得分:7)

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

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

  

调用进程必须具有SE_SYSTEMTIME_NAME权限。默认情况下禁用此权限。 SetSystemTime函数在更改系统时间之前启用SE_SYSTEMTIME_NAME权限,并在返回之前禁用该权限。有关更多信息,请参阅使用特殊权限运行。

所以看起来这应该不是问题。

答案 1 :(得分:6)

好吧,如果最糟糕的情况发生,总会有

System.Diagnostics.Process.Start("CMD", "/C TIME 19:58");  // set time to 7:58PM

答案 2 :(得分:4)

您的应用需要提升以更改时间(因为更改时间可能会导致活动日志等不真实)但不能更改时区。使用requireAdministrator在您的应用程序上放置清单,应用程序将提升。 (要在制作清单之前对此进行测试,请右键单击您的exe和运行方式管理员。这将使应用程序只提升一次。提升与管理员组中的某个人启动是不同的。它是关于选择使用你的权力。)

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