Вопрос: Как удаленно выпустить команду CLI на тысячи компьютеров домена Windows одновременно?


Мне нужно выпустить команду CLI (cmd.exe или PowerShell) на все тысячи компьютеров в моем домене. По очевидным причинам это не будет включать выполнение задачи вручную или физическое посещение каждой машины.

Как это сделать?


7
2017-09-05 20:20


Источник




Ответы:


Общий случай:

Как удаленно выпустить команду CLI на тысячи компьютеров домена Windows одновременно?

Как и в большинстве случаев в нашей профессии, ваш самый простой подход - это, как правило, разбивать работу на простые, дискретные задачи, а затем либо выполнять эти задачи последовательно, либо связывать их вместе (например, помещая их все в один скрипт) ,

В этом случае у вас есть 3 дискретных задания, которые я могу установить.

  1. Соберите список клиентов, чтобы выполнить команду.

  2. Подключитесь ко всем клиентам.

  3. Выполните команду для всех клиентов.

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

У вас также есть «архитектурное» решение сделать (выполнять шаги 2 и 3 параллельно или последовательно), но давайте проигнорируем это. Я буду делать их в сериале, потому что это проще, и я ленив.

Обратите внимание, что до сих пор я не упоминал о каких-либо конкретных инструментах, реализациях или приведенных примерах. Это преднамеренно. К этому моменту вышеизложенное было проектированием и / или архитектурными работами. Да, если вы хотите «сделать это правильно», вы проектируете и планируете до вы реализуете. (Переход от общего к конкретному.)

Чтобы сделать это практическим, ниже конкретный проблема, которую я решил, одновременно выдав команду тысячам компьютеров домена Windows.


Конкретный случай:

Как скорректировать время на всех компьютерах домена Windows сразу?

По причинам, которые вам не нужны, я недавно столкнулся с ситуацией, когда лучшим решением было выпустить одну команду для каждый  Один компьютер, принадлежащий моему работодателю, чтобы исправить перекос во времени в домене. (У меня также было очень мало времени - было менее 2 часов, чтобы все компьютеры в домене синхронизировались с «истинным» временем.)

  1. Соберите список клиентов, чтобы выполнить команду.

    • Из-за особенностей моей среды, в сочетании с моими конкретными инструментами и навыками, я использовал PowerShell для этого.
    • Поскольку я хочу, чтобы все компьютеры, и из-за того, что я буду делать дальше, я хочу просто сохранить этот список в переменной, поэтому конкретная команда, которую я буду использовать:
    • $boxlist = Get-ADComputer -filter *(Сохраняет список всех компьютерных объектов, найденных в Active Directory, в переменной с именем boxlist)

  2. Подключитесь ко всем клиентам.

    • Поскольку я спешу, я буду придерживаться того, что знаю. Я регулярно использую PowerShell Remoting для одиночных компьютеров или небольших групп компьютеров, и мне очень удобно. Я не использовал его для большой группы, но нет причин, по которым он не должен работать, и у меня нет времени изучать новые вещи или устанавливать новые инструменты прямо сейчас, так что это нужно будет сделать.
      • New-PSSession это мой переход к командлету для этого.
    • На этом этапе я понимаю, что мне нужно будет предоставить учетные данные для фактического завершения запроса, Get-Credential командлет, чтобы сделать это, и в итоге получим в итоге две команды.
    • $creds = Get-Credential domain\user (Создает приглашение, в которое я ввожу свои учетные данные, и сохраняет токен аутентификации в переменной с именем кредитки)
    • $session = New-PSSession -ComputerName $boxlist.name -Credential $creds (Создает новые сеансы PowerShell для каждого компьютера в boxlist переменную, используя только что предоставленные учетные данные, и сохраняет эти сеансы PowerShell в переменной с именем сессий)

  3. Выполните команду для всех клиентов.

    • Из-за того, как время настроено в нашем домене и является основной причиной временного перекоса, я уже знаю, какую команду я хочу опубликовать. У нас есть объект групповой политики, который устанавливает все параметры службы времени Windows так, как нам нравится, наш авторитетный источник времени синхронизируется до истинного времени, наши подчиненные источники времени синхронизируются с авторитетным источником времени домена, и мне нужно просто заставить клиентов немедленно повторно синхронизировать с местным источником времени. -Этот призыв w32tm /resync /nowait /rediscover, и использование Powershell, будет вызвано с помощью Invoke-Command Командлет.
    • Invoke-Command -Session $session -ScriptBlock {w32tm /resync /nowait /rediscover} (Вызывает команду, поданную в коммутатор Scriptblock, на переключатель сеанса, который содержит переменную с именем сессий который имеет список всех компьютеров моего домена в нем)

Сценарий или все его компоненты были написаны и могут выполняться либо по одной строке за раз в оболочке PowerShell, либо сохраняться как файл сценария PowerShell и запускаться. Я спешу, и это довольно короткий сценарий. Я не думаю, что мне нужно будет снова использовать (или у меня проблемы с воссозданием, поэтому пробивка строки по строке в окне оболочки - вот что я в итоге делает.

$boxlist = Get-ADComputer -filter *
$creds = Get-Credential domain\user
$session = New-PSSession -ComputerName $boxlist.name -Credential $creds
Invoke-Command -Session $session -ScriptBlock {w32tm /resync /nowait /rediscover}

10
2017-09-05 20:20