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

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

Как это должно быть сделано?

1 ответ

Решение

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

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

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

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

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

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

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

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

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

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

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


Особый случай:

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

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

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

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

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

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

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

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

Сценарий или все его компоненты были написаны и могут быть выполнены по одной строке в оболочке 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}
Другие вопросы по тегам