WMI para reiniciar la máquina remota

Encontré este código en un hilo viejo para apagar la máquina local:

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); } } 

¿Es posible utilizar un método WMI similar para reiniciar el indicador “2” de una máquina remota, para lo cual solo tengo el nombre de la máquina, no la dirección IP?

EDITAR: Actualmente tengo:

 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); } 

pero esto no funciona, y preferiría WMI en el futuro.

Para direccionar las consultas WMI a una computadora remota, simplemente especifique el nombre (o dirección IP) de la computadora en el objeto ManagementScope .

No estoy muy bien en C #, pero aquí hay un ejemplo que se me ocurrió con MSDN y WMI Code Creator (que es, por cierto, una excelente herramienta para generar código WMI, y admite C # entre otros). Espero que este código te dé la idea.

( Descargo de responsabilidad: este código no se ha probado).

 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); } } 

También tuve problemas con esto. WMI puede ser engañoso con métodos para clases y objetos. Mi solución es reiniciar un host en la red con C # y WMI, pero se simplifica fácilmente para la máquina local:

 private void rebootHost(string hostName) { string adsiPath = string.Format(@"\\{0}\root\cimv2", hostName); ManagementScope scope = new ManagementScope(adsiPath); // I've seen this, but I found not necessary: // scope.Options.EnablePrivileges = true; ManagementPath osPath = new ManagementPath("Win32_OperatingSystem"); ManagementClass os = new ManagementClass(scope, osPath, null); ManagementObjectCollection instances; try { instances = os.GetInstances(); } catch (UnauthorizedAccessException exception) { throw new MyException("Not permitted to reboot the host: " + hostName, exception); } catch (COMException exception) { if (exception.ErrorCode == -2147023174) { throw new MyException("Could not reach the target host: " + hostName, exception); } throw; // Unhandled } foreach (ManagementObject instance in instances) { object result = instance.InvokeMethod("Reboot", new object[] { }); uint returnValue = (uint)result; if (returnValue != 0) { throw new MyException("Failed to reboot host: " + hostName); } } } 

Puede usar el comando shutdown si necesita una solución que no sea WMI.

 shutdown [{-l|-s|-r|-a}] [-f] [-m [\\ComputerName]] [-t xx] [-c "message"] [-d[u][p]:xx:yy] 

Use la -m para cerrar la máquina remota.

Consulte este enlace para obtener más información. http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/shutdown.mspx

esto funcionará como sharm

 gwmi win32_operatingsystem -ComputerName xxxxxxxxxxxx | Invoke-WmiMethod -Name reboot