Назад | Перейти на главную страницу

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

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

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

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

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

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

Я могу поставить перед вами 3 отдельные задачи.

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

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

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

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

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

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

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


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

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

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

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

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

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

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