- просматривать и изменять свойства системы,
- запускать и останавливать службы,
- перезапускать службы без RDP-доступа,
- собирать статистику (CPU, память и т.д.).
WMI работает поверх DCOM и требует, чтобы:
- На удалённой машине был включён WMI.
- Пользователь имел права администратора на удалённом ПК.
- Между машинами был доступ по TCP-портам 135 и динамическим портам RPC.
Подготовка удалённого ПК
На удалённой машине нужно:
Включить WMI:
- Code: Select all
Enable-PSRemoting -Force
- Code: Select all
netsh advfirewall firewall set rule group="Windows Management Instrumentation (WMI)" new enable=yes
Windows Management Instrumentation (winmgmt) запущена.Логика перезапуска службы
Чтобы перезапустить службу через WMI, мы:
- Подключаемся к удалённому ПК через WMI.
- Находим службу по имени (ServiceName).
- Вызываем метод
StopService(). - Ждём, пока служба остановится.
- Вызываем метод
StartService().
- Code: Select all
using System;
using System.Management;
class Program
{
static void Main()
{
string remoteComputer = "PC-NAME"; // Имя или IP удалённого ПК
string username = "DOMAIN\\Username"; // Учётка с правами администратора
string password = "YourPassword";
string serviceName = "Spooler"; // Например, диспетчер печати
try
{
ConnectionOptions options = new ConnectionOptions
{
Username = username,
Password = password,
Authority = "ntlmdomain:DOMAIN", // или "ntlmdomain:WORKGROUP"
Impersonation = ImpersonationLevel.Impersonate,
Authentication = AuthenticationLevel.PacketPrivacy,
EnablePrivileges = true
};
string path = $@"\\{remoteComputer}\root\cimv2";
ManagementScope scope = new ManagementScope(path, options);
scope.Connect();
// Находим службу
ObjectQuery query = new ObjectQuery($"SELECT * FROM Win32_Service WHERE Name = '{serviceName}'");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
foreach (ManagementObject service in searcher.Get())
{
Console.WriteLine($"Служба: {service["DisplayName"]}, статус: {service["State"]}");
// Останавливаем службу
if (service["State"].ToString() == "Running")
{
Console.WriteLine("Останавливаю службу...");
service.InvokeMethod("StopService", null);
System.Threading.Thread.Sleep(3000);
}
// Запускаем службу
Console.WriteLine("Запускаю службу...");
service.InvokeMethod("StartService", null);
Console.WriteLine("Перезапуск завершён.");
}
}
catch (Exception ex)
{
Console.WriteLine("Ошибка: " + ex.Message);
}
}
}
Разбор кода
ConnectionOptions — задаёт учётные данные для подключения.ManagementScope — область WMI-запроса, указываем root\cimv2.Win32_Service — WMI-класс, который описывает службу.StopService() и StartService() — методы WMI для управления службой.Возможные ошибки и их решения
Ошибка:
Access is deniedПричина: Нет прав администратора
Решение: Запускать с админскими правами, использовать админскую учётку
Ошибка:
RPC server unavailableПричина: Закрыт порт 135 или RPC
Решение: Разрешить WMI и RPC в брандмауэре
Ошибка:
The service cannot accept control messages at this timeПричина: Служба в процессе запуска/остановки
Решение: Сделать паузу и повторить команду
Ошибка:
Invalid classПричина: WMI отключен или повреждён
Решение: Запустить
winmgmt /verifyrepository
