ドメイン上の数千台のコンピューターすべてにCLIコマンド(cmd.exeまたはPowerShell)を発行する必要があります。明らかな理由から、これには手動でタスクを実行したり、各マシンに物理的にアクセスしたりする必要はありません。
これはどのように行う必要がありますか?
私たちの職業のほとんどのものと同様に、最も簡単なアプローチは、通常、ジョブを単純な個別のタスクに分割し、それらのタスクを順番に実行するか、それらを(単一のスクリプトに入れるなどして)戻すことです。 。
これには、私が確立できる3つの個別のタスクがあります。
コマンドを発行するクライアントのリストを収集します。
すべてのクライアントに接続します。
すべてのクライアントにコマンドを発行します。
この後、おそらくこれまでと同じように結果を検証したいと思うでしょうが、プロセスをテストしたいと思うでしょうが、この質問の目的のためにそれを無視しましょう。現実の世界での実装前と実装後のテストを無視しないでください。無視しないと、申し訳ありません。
また、「アーキテクチャ上の」決定を下す必要があります(ステップ2と3を並行して実行するか、順次実行するか)が、それも無視しましょう。それは簡単で、私は怠惰なので、私はそれらを逐次的に行います。
これまでのところ、特定のツール、実装、または特定の例について言及したことはありません。それは意図的です。これまでのところ、上記はすべて設計および/または建築作業でした。はい、「正しく実行」したい場合は、実装する前に(== --- ==)を設計および計画します。 (一般から特定へ。)
これを実用的にするために、以下はspecific問題を数千のWindowsドメインコンピューターに同時にコマンドを発行することによって解決しました。
入る必要がない理由で、私は最近、everysingleに単一のコマンドを発行することが最善の解決策であるという状況に遭遇しましたドメイン全体のタイムスキューを修正するために、私の雇用主が所有するコンピューター。 (私も非常に時間の制約がありました-ドメイン内のすべてのコンピューターを「真の」時間と同期させるのに2時間もかかりませんでした。)
Get-ADComputer
、ActiveDirectoryからコンピュータオブジェクトを取得するために使用されます。これは、すべてのコンピューターがドメインに参加しているため、ADにリストされているためです。$boxlist = Get-ADComputer -filter *
(ActiveDirectoryで見つかったすべてのコンピューターオブジェクトのリストをboxlistという名前の変数に格納します)New-PSSession
は、このための私の頼りになるコマンドレットです。Get-Credential
それを行うためのコマンドレット。結果として、以下の2つのコマンドで終了します。$creds = Get-Credential domain\user
(資格情報を入力するプロンプトを作成し、認証トークンをcredsという名前の変数に格納します)$session = New-PSSession -ComputerName $boxlist.name -Credential $creds
(先ほど提供した資格情報を使用して、boxlist変数内のすべてのコンピューターに対して新しいPowerShellセッションを作成し、それらのPowerShellセッションをsessionsという名前の変数に格納します)w32tm /resync /nowait /rediscover
、およびPowershellを使用して、 Invoke-Command コマンドレットで呼び出されます。Invoke-Command -Session $session -ScriptBlock {w32tm /resync /nowait /rediscover}
(Scriptblockスイッチに渡されたコマンドをSessionスイッチに呼び出します。これには、ドメイン内のすべてのコンピューターのリストが含まれるsessionsという名前の変数が含まれます)スクリプトまたはそのすべてのコンポーネントが記述されており、PowerShellシェルで一度に1行実行されるか、PowerShellスクリプトファイルとして保存されて実行されます。私は急いでいて、これは私が再び使用する必要があるとは思えないかなり短いスクリプトです(または再作成に問題があるため、シェルウィンドウで1行ずつパンチするのが最終的なものです)やっている。
$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}