Win32_OperatingSystem类提供了SetDateTime方法,用于修改系统时间,但是不知道函数怎么传
InvokeMethod("SetDateTime",new object[]{DateTime.Parse("11:20")});
或者
InvokeMethod("SetDateTime",new object[]{ManagementDateTimeConverter.ToDmtfDateTime(DateTime.Parse("11:20"))});
都不行
InvokeMethod("SetDateTime",new object[]{DateTime.Parse("11:20")});
或者
InvokeMethod("SetDateTime",new object[]{ManagementDateTimeConverter.ToDmtfDateTime(DateTime.Parse("11:20"))});
都不行
http://hi.baidu.com/ysdonet/blog/item/88fe5e0250ecbd0a4bfb5133.html
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";
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.
[DllImport("kernel32", CharSet=CharSet.Unicode, SetLastError=true)]
internal static extern int SetLocalTime(NativeTypes.SystemTime systime);
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);
}
}
}
}
另外,我的目的是修改远程计算机时间,所以不能用VB和API的方法,需要WMI
4楼这个,我原来就是这样做的,跟你一样,拒绝访问。(但是我用WMIC命令行可以)
7楼这个MVP回复就没谱你,连要设置的时间都没有在代码中体现,应该是网上拷贝的。感谢4楼的兄弟,你至少是自己试过了再来回复,不是在网上随便抄来的。
这个方法本来没做
当我第一次用这个方法设置1个时间后,我又修改代码,设置成另一个时间。
我估计出现了这样的情况:
由于时间被修改了,编译器以为原代码没修改,于是没有重新编译生成exe,还是直接运行了,所以还是之前的代码,于是被设置的时间还是之前的。
解决办法时,修改代码之后删除exe,迫使编译器重新编译生成。这样的事情都能出现,汗。
{
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) });
}