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

Tim*_*eph 7 c# windows-7

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

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

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

Kir*_*oll 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
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

根据文件:

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

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

  • @Tim Joseph:管理员和其他几个帐户都有此权限.您可以使用Sysinternals中的Procexp来检查为每个进程授予的权限以及它们当前是否已启用.可以更改本地安全策略以将权限分配给其他帐户. (3认同)

I. *_*edy 6

好吧,如果最糟糕的情况发生,那就永远存在

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

  • J.:您必须使用提升的权限启动该过程 (4认同)