我正在将应用程序从Windows 2000(不要求)移植到Windows 7,我需要复制允许用户从GUI设置时间的功能。以前这是通过使用命令提示符直接调用'time'来完成的,但在Windows 7中看起来用户权限有所改变。
完成一些研究后,您似乎可以使用对kernel32.dll
方法Win32SetSystemTime
的调用来设置时间,但会出现相同的权限问题。阅读MSDN我认为我需要启用SE_SYSTEMTIME_NAME
,但无论我尝试什么,我似乎无法使其工作。
是否有人为Windows 7提供了一些经过测试的示例代码,以允许对Win32SetSystemTime
进行API调用?
答案 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提示我没想到。