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

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

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

有没有人有一些经过测试的Windows 7示例代码允许对Win32SetSystemTime进行API调用?

不知道为什么它不适合你。 以下代码设置了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 }; } } 

根据文件 :

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

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

好吧,如果最糟糕的情况发生,那总是存在

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

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

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