удаленное выключение пк

у меня есть .NET Framework приложение, которое должно удаленно выключать определенный пк(для его поиска я использую его ip адрес) если он еще находится в сети. У меня есть код который в теории это умеет делать:

              int waitSeconds = 00;
              string ip = .....;

              ProcessStartInfo processInfo = new ProcessStartInfo();
              processInfo.FileName = "shutdown.exe";
              processInfo.Arguments = $@"-s -f -m \\{ ip } -t { waitSeconds }";
              processInfo.WindowStyle = ProcessWindowStyle.Hidden;
              processInfo.CreateNoWindow = true;

              var proc = Process.Start(processInfo);
                    

но когда попытался с помощью этого кода выключить сторонний пк, то у меня ничего не вышло,(пк просто не выключился) хотя ip адрес я ввожу правильный... может есть какой-то способ через скрипт проверить, возможно ли данный компьютер выключать удаленно? заранее спасибо!


Ответы (1 шт):

Автор решения: Blackmeser

Вы не можете просто так выключить чужой ПК, в комментарии выше я указал причины. Иначе мамкины хацкеры только в путь вырубали чужие компы один за другим.

  1. Ваша программа должна находиться на чужом компьютере.
  2. Убедитесь что ваша программа занимает сетевой порт. Для портов меньше 1000 требуются права администратора.
  3. Убедитесь что ваша программа использует корректный локальный IP адрес: 192.16xxx, 172.xxx, 10.xxx ... А не 127.0.0.1 или любой другой 127.xxx. Если компьютер имеет доступ в глобальную сеть напрямую - соответственно использовать нужно глобальный IP. Или можно просто использовать 0.0.0.0 и тем самым разрешать приём команды из любой подсети.
  4. На стороне выключаемого компьютера нужно занять сетевой порт для прослушки.
  5. На стороне компьютера, который производит выключение - нужно нужно открыть сокет: IP выключаемого компьютера : порт
  6. Если выключение производится из разных подсетей - должен быть настроен проброс порта на выключаемый компьютер.
  7. При открытии порта при подключении сокета необходимо запустить функцию приёма данных, одного байта достаточно, например можно отправить 0xFF
  8. На стороне приёма в функции приёма дождаться заветного байта и удостовериться что он соответствует 0xFF
  9. После чего на стороне выключаемого компьютера и вызвать данную функцию с вашим ProcessStartInfo, только в параметрах без удалённого компьютера \ip

С кодом придётся повозиться, но зато без танцев с бубном и перенастройкой компов и дыр безопасности.
Если с пробросом порта на роутере - после всего этого хоть из любой точки мира выключайте ваш ПК. Код 0xFF разумеется меняйте на более безопасный, можете хоть шифрование прикрутить.

→ Ссылка