2010-10-19 45 views
7

我正在从Windows 2000(不问)到Windows 7移植应用程序,我需要复制允许用户从GUI设置时间的功能。以前这是通过使用命令提示符直接调用'time'来完成的,但是在Windows 7中用户权限似乎已经发生了一些变化。在Windows 7中以编程方式设置时间

已经完成了一些研究,看起来您可以使用请拨打kernel32.dll方法Win32SetSystemTime,但会出现相同的权限问题。阅读MSDN我认为我需要启用SE_SYSTEMTIME_NAME,但无论我尝试什么,我似乎无法完成此项工作。

有没有人有一些测试的示例代码为Windows 7允许API调用Win32SetSystemTime

+0

是。它改变时间,但不接受时区... – 2012-04-27 18:00:00

回答

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特权,并在返回之前禁用特权。有关更多信息,请参阅使用特权运行。

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

+0

“调用进程必须具有SE_SYSTEMTIME_NAME特权”。有关分配该特权的任何想法? – 2010-10-19 02:18:33

+3

@Tim Joseph:管理员和其他几个帐户拥有此特权。您可以使用Sysinternals的Procexp来检查授予每个进程的权限以及它们当前是否启用。本地安全策略可以更改为将权限分配给其他帐户。 – 2010-10-19 06:08:33

+0

注意:我们应该将格林威治时间作为参数'st'。系统根据其时区('GMT')设置。 – 2013-10-11 08:27:00

6

好吧,如果出现最坏的情况,总有

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

可悲的是,这似乎并没有在Windows 7中工作。我得到错误“所需的特权不是由客户端持有”。我的用户是管理员,已经在3台独立的机器上验证过。如果你有这方面的工作,我会很感激(就像许多其他人从我的研究中判断的那样) – 2010-10-19 01:09:10

+4

J .:你必须用提升的权限启动该进程 – 2010-10-19 01:59:52

4

您的应用程序需要升级才能更改时间(因为更改时间可能导致活动日志等不真实),但不会更改时区。使用requireAdministrator将清单放在应用程序中,应用程序将升级。 (要在制作清单前对其进行测试,请右键单击您的exe和Run As Adminstrator,这将只提升一次应用程序。升级与恰好在Administrators组中的人员启动的方式不同。选择到使用你的权力。)

机会是用户不会像UAC提示,所以如果时间变化是罕见的,把它分解到一个单独的EXE,把清单上的主要应用asInvoker和另一个关于requireAdministrator的时间转换器,并且使用ShellExecute从主应用程序启动时间转换器。最好有一个按钮或菜单项来实现这一点,并在其上放置一个盾牌图标,以便UAC提示不会让用户感到意外。我拒绝UAC提示我没有预料到。

相关问题