Мне нужно ввести команду CLI (cmd.exe или PowerShell) на все тысячи компьютеров в моем домене. По понятным причинам это не будет включать выполнение задачи вручную или физическое посещение каждой машины.
Как это сделать?
Как и в большинстве случаев в нашей профессии, ваш самый простой подход - обычно разбивать работу на простые дискретные задачи, а затем либо выполнять эти задачи последовательно, либо объединять их вместе (например, объединяя их все в один сценарий). .
Я могу поставить перед вами 3 отдельные задачи.
Составьте список клиентов, которым нужно выполнить команду.
Подключитесь ко всем клиентам.
Дайте команду всем клиентам.
После этого вы, вероятно, захотите проверить результаты, как и раньше, вы захотите протестировать свой процесс, но давайте проигнорируем это для целей этого вопроса. Просто не игнорируйте тестирование до и после реализации в реальном мире, иначе вы пожалеете.
У вас также есть «архитектурное» решение (выполнять ли шаги 2 и 3 параллельно или последовательно), но давайте проигнорируем и это. Я буду делать их серийно, потому что так проще, а мне лень.
Обратите внимание, что до сих пор я не упоминал о каких-либо конкретных инструментах, реализациях или приведенных примерах. Это умышленно. На данный момент все вышеперечисленное относится к проектированию и / или архитектурным работам. Да, если вы хотите "делать все правильно", вы проектируете и планируете перед вы реализуете. (Переходите от общего к частному.)
Чтобы сделать это практичным, ниже конкретный Проблему я решил, одновременно подав команду на тысячи компьютеров домена Windows.
По причинам, в которые не нужно вдаваться, недавно я столкнулся с ситуацией, когда лучшим решением было выполнить одну команду для каждый не замужем компьютер, принадлежащий моему работодателю, чтобы исправить временной сдвиг во всем домене. (Я также был сильно ограничен во времени - у меня было менее 2 часов, чтобы все компьютеры в домене снова синхронизировались с «истинным» временем.)
Get-ADComputer
, который используется для получения объекта компьютера из Active Directory. Это правильный путь, потому что все компьютеры были присоединены к домену и, следовательно, перечислены в AD.$boxlist = Get-ADComputer -filter *
(Сохраняет список всех компьютерных объектов, найденных в Active Directory, в переменной с именем бокслист) New-PSSession
мой командлет для этого.Get-Credential
командлет, чтобы сделать это, и в результате получить две команды ниже.$creds = Get-Credential domain\user
(Создает приглашение, в которое я ввожу свои учетные данные, и сохраняет токен аутентификации в переменной с именем кредиты)$session = New-PSSession -ComputerName $boxlist.name -Credential $creds
(Создает новые сеансы PowerShell для каждого компьютера в бокслист переменная, используя только что предоставленные мной учетные данные, и сохраняет эти сеансы PowerShell в переменной с именем сессии) 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}