Win32_OperatingSystem类提供了SetDateTime方法,用于修改系统时间,但是不知道函数怎么传
InvokeMethod("SetDateTime",new object[]{DateTime.Parse("11:20")});
或者
InvokeMethod("SetDateTime",new object[]{ManagementDateTimeConverter.ToDmtfDateTime(DateTime.Parse("11:20"))});
都不行

解决方案 »

  1.   

    利用API来实现对系统时间的修改
    http://hi.baidu.com/ysdonet/blog/item/88fe5e0250ecbd0a4bfb5133.html
      

  2.   

    试试下面的方法Microsoft.VisualBasic.DateAndTime.Today =
        new DateTime(2005, 1, 2, 0, 0, 0);
    Microsoft.VisualBasic.DateAndTime.DateString =
        "2005-2-3";Microsoft.VisualBasic.DateAndTime.TimeOfDay =
        new DateTime(2000, 1, 1, 6, 15, 30);
    Microsoft.VisualBasic.DateAndTime.TimeString =
        "8:25:45";
      

  3.   

    应该这样来调用。
    public static void SetDateTime(DateTime dt) {
            ManagementScope scope = new ManagementScope(@"\root\cimv2");
            scope.Connect();
            //确定WMI操作的内容
            ObjectQuery oq = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
            ManagementObjectSearcher query1 = new ManagementObjectSearcher(scope, oq);
            //获取WMI操作内容
            ManagementObjectCollection queryCollection1 = query1.Get();
            foreach (ManagementObject mo in queryCollection1)
            {
                ManagementBaseObject inParams = null;
                inParams = mo.GetMethodParameters("SetDateTime");
                inParams["LocalDateTime"] = ManagementDateTimeConverter.ToDmtfDateTime(dt);
                mo.InvokeMethod("SetDateTime", inParams, null);
            }
           
        }但是很遗憾的是在我的机器上(xp sp2)在执行mo.InvokeMethod("SetDateTime", inParams, null);的时候access denied.
      

  4.   

    底层调用的API
    [DllImport("kernel32", CharSet=CharSet.Unicode, SetLastError=true)]
    internal static extern int SetLocalTime(NativeTypes.SystemTime systime);
     
      

  5.   


    using System;
    using System.Management;
    using System.Windows.Forms;namespace WMISample
    {
        public class CallWMIMethod
        {
            public static void Main()
            {
                try
                {
                    ManagementObject classInstance = 
                        new ManagementObject("root\\CIMV2", 
                        "Win32_OperatingSystem.Name='Microsoft Windows Server 2003 Enterprise Edition|C:\WINDOWS|\Device\Harddisk0\Partition1'",
                        null);                // Obtain in-parameters for the method
                    ManagementBaseObject inParams = 
                        classInstance.GetMethodParameters("SetDateTime");                // Add the input parameters.                // Execute the method and obtain the return values.
                    ManagementBaseObject outParams = 
                        classInstance.InvokeMethod("SetDateTime", inParams, null);                // List outParams
                    Console.WriteLine("Out parameters:");
                    Console.WriteLine("ReturnValue: " + outParams["ReturnValue"]);
                }
                catch(ManagementException err)
                {
                    MessageBox.Show("An error occurred while trying to execute the WMI method: " + err.Message);
                }
            }
        }
    }
      

  6.   

    3楼这个可以,但是还是有问题,就是第2次执行后就无效了
    另外,我的目的是修改远程计算机时间,所以不能用VB和API的方法,需要WMI
    4楼这个,我原来就是这样做的,跟你一样,拒绝访问。(但是我用WMIC命令行可以)
    7楼这个MVP回复就没谱你,连要设置的时间都没有在代码中体现,应该是网上拷贝的。感谢4楼的兄弟,你至少是自己试过了再来回复,不是在网上随便抄来的。
      

  7.   

    vb那个方法的原因找到了
    这个方法本来没做
    当我第一次用这个方法设置1个时间后,我又修改代码,设置成另一个时间。
    我估计出现了这样的情况:
    由于时间被修改了,编译器以为原代码没修改,于是没有重新编译生成exe,还是直接运行了,所以还是之前的代码,于是被设置的时间还是之前的。
    解决办法时,修改代码之后删除exe,迫使编译器重新编译生成。这样的事情都能出现,汗。
      

  8.   

    问题已解决,原来是特权问题。只能说异常提示不准确,如果提示没有保留特权,那我早就知道原因了,代码如下:        public static void SetDateTimeMe(DateTime dt)
            {
                ManagementClass mc = new ManagementClass("Win32_OperatingSystem");
                mc.Scope.Options.EnablePrivileges = true;//主要是这里
                foreach (ManagementObject mo in mc.GetInstances())
                    mo.InvokeMethod("SetDateTime", new object[] { ManagementDateTimeConverter.ToDmtfDateTime(dt) });
            }
      

  9.   

    只知道用wmi关机需要特权,看了lz的例子看来设置系统时间也要特权