我在一个旧线程上找到了这个代码来关闭本地机器:
using System.Management; void Shutdown() { ManagementBaseObject mboShutdown = null; ManagementClass mcWin32 = new ManagementClass("Win32_OperatingSystem"); mcWin32.Get(); // You can't shutdown without security privileges mcWin32.Scope.Options.EnablePrivileges = true; ManagementBaseObject mboShutdownParams = mcWin32.GetMethodParameters("Win32Shutdown"); // Flag 1 means we want to shut down the system. Use "2" to reboot. mboShutdownParams["Flags"] = "1"; mboShutdownParams["Reserved"] = "0"; foreach (ManagementObject manObj in mcWin32.GetInstances()) { mboShutdown = manObj.InvokeMethod("Win32Shutdown", mboShutdownParams, null); } }
是否可以使用类似的WMI方法重启标志"2"远程机器,我只有机器名,而不是IPaddress.
编辑:我目前有:
SearchResultCollection allMachinesCollected = machineSearch.FindAll(); Methods myMethods = new Methods(); string pcName; ArrayList allComputers = new ArrayList(); foreach (SearchResult oneMachine in allMachinesCollected) { //pcName = oneMachine.Properties.PropertyNames.ToString(); pcName = oneMachine.Properties["name"][0].ToString(); allComputers.Add(pcName); MessageBox.Show(pcName + "has been sent the restart command."); Process.Start("shutdown.exe", "-r -f -t 0 -m \\" + pcName); }
但这不起作用,我更希望WMI继续前进.
要解决对远程计算机的WMI查询,只需在ManagementScope
对象中指定该计算机的名称(或IP地址)即可.
我在C#中表现不佳,但这是一个例子,我想出了使用MSDN和WMI Code Creator(顺便说一句,这是一个生成WMI代码的优秀工具,并支持C#等).希望这段代码能给你这个想法.
(免责声明:此代码未经测试.)
using System; using System.Management; ... void Shutdown() { try { const string computerName = "COMPUTER"; // computer name or IP address ConnectionOptions options = new ConnectionOptions(); options.EnablePrivileges = true; // To connect to the remote computer using a different account, specify these values: // options.Username = "USERNAME"; // options.Password = "PASSWORD"; // options.Authority = "ntlmdomain:DOMAIN"; ManagementScope scope = new ManagementScope( "\\\\" + computerName + "\\root\\CIMV2", options); scope.Connect(); SelectQuery query = new SelectQuery("Win32_OperatingSystem"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); foreach (ManagementObject os in searcher.Get()) { // Obtain in-parameters for the method ManagementBaseObject inParams = os.GetMethodParameters("Win32Shutdown"); // Add the input parameters. inParams["Flags"] = 2; // Execute the method and obtain the return values. ManagementBaseObject outParams = os.InvokeMethod("Win32Shutdown", inParams, null); } } catch(ManagementException err) { MessageBox.Show("An error occurred while trying to execute the WMI method: " + err.Message); } catch(System.UnauthorizedAccessException unauthorizedErr) { MessageBox.Show("Connection error (user name or password might be incorrect): " + unauthorizedErr.Message); } }