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

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

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

7
задан 6 September 2014 в 16:21
1 ответ

The General Case:

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

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

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

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

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

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

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

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

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

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


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

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

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

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

    • В связи со спецификой моей среды, в сочетании с моими специфическими инструментами и навыками, я использовал для этого PowerShell.
      • Я установил PowerShell на каждый клиент в среде, каждый клиент подключен к домену, Я установил GPO для включения WinRM, для целей PowerShell Remoting на всех своих клиентах более года назад, мне нравится PowerShell, и мне 'удобно использовать его'.
      • Здесь используется команда Get-ADComputer, которая используется для извлечения компьютерного объекта из Active Directory. Так и должно быть, потому что все компьютеры были присоединены к домену и поэтому перечислены в AD.
    • Поскольку мне нужны все компьютеры, а также в связи с тем, что я собираюсь делать дальше, я хочу просто хранить этот список в переменной, поэтому я буду использовать специальную команду:
    • $boxlist = Get-ADComputer -filter * (Хранит список всех компьютерных объектов, найденных в Active Directory, в переменной с именем boxlist)

  2. Свяжитесь со всеми клиентами.

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

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

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

Сценарий, или все его компоненты, были написаны и могут быть либо выполнены, по одной строке за раз в оболочке 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}
12
ответ дан 2 December 2019 в 23:26

Теги

Похожие вопросы