PowerShell を使用して Active Directory 内のコンピューターの状態とユーザー名を確認する方法
このガイドは、Active Directory環境内のすべてのコンピュータに関する詳細なレポートを作成するのに役立ちます。レポートには、各コンピュータの接続状況、ログインしているユーザー、ドメイン内のすべてのコンピュータのリストが含まれます。これらの手順は、ネットワークの状況を把握しようとしているシステム管理者にとって、特に状況がやや混乱しているときに役立ちます。
前提条件
- Windows Server に対する管理者権限があることを確認してください。例外はありません。
- Active Directory モジュールは、ドメイン コントローラーまたは RSAT ツールがインストールされているマシンにインストールする必要があります。
- PowerShell を開きます (できれば管理者権限で)。
ステップ1: 管理者としてPowerShellを開く
スタートメニューで「PowerShell」を検索し、右クリックして「管理者として実行」を選択します。すでに管理者権限のセッションを使用している場合は、これで完了です。
ステップ2: Active Directoryモジュールをインポートする
これは、AD コマンドを実行する前に必ず実行する必要があります。特に PowerShell でコマンドレットが見つからないというエラーが発生する場合は、次のコマンドを実行します。
Import-Module ActiveDirectory
サーバーによっては、このモジュールが自動的に読み込まれる場合もありますが、通常は手動で行う必要があります。コマンドなどのGet-ADComputer
動作を確実にするために役立ちます。
ステップ3: コンピュータのリストを取得する
ここで、PowerShell にドメイン内のすべてのマシン名を取得するように指示します。
$computers = Get-ADComputer -Filter * | Select-Object -ExpandProperty Name
これにより、すべてのコンピュータオブジェクトが取得されます。ドメインが大きい場合は、数秒かかる場合があることにご注意ください。また、アカウントにADからの読み取り権限があることを確認してください。
ステップ4: 結果の配列を準備する
基本的には、情報を保存するための空のコンテナーを設定します。
$results = @()
ステップ5: 各コンピュータをループしてステータスを確認する
ここがちょっと厄介な部分です。各マシンにpingを送ってオンラインかどうかを確認し、ログインしているユーザーを取得しようとします。簡略化したバージョンを以下に示します。
foreach ($computer in $computers) { if (Test-Connection -ComputerName $computer -Count 2 -Quiet) { try { $user = Invoke-Command -ComputerName $computer -ScriptBlock { (Get-WMIObject -Class Win32_ComputerSystem).UserName } -ErrorAction Stop $status = "Online" } catch { // Sometimes, remote commands fail even if ping works, weirdly.$user = "Access Denied" // Or just leave blank, depending.$status = "Online" } } else { $user = "N/A" $status = "Offline" } $results += [PSCustomObject]@{ ComputerName = $computer Status = $status LoggedInUser = $user } }
理由は何でしょうか? Pingはネットワークの到達可能性を確認し、Invoke-Commandはログインしているユーザーの取得を試みます。もちろん、ファイアウォールや権限によって問題が発生することもあります。アクセス拒否エラーが発生した場合は、リモートマシンでPowerShellリモート処理が有効になっていることを確認してください(Enable-PSRemotingコマンドが役立ちます)。初回実行時には失敗する場合もありますが、再起動またはWinRMサービスの簡単な再起動後に動作するようになります。
ステップ6: 結果をファイルに保存する
すべての情報が収集されたら、それを CSV にダンプします。そうすれば、PowerShell のチャッターをスクロールする必要がなくなります。
$results | Export-Csv -Path "C:\ComputerListStatus.csv" -NoTypeInformation
このファイルはC:\に保存されます。別のパスをご希望の場合は変更してください。Excelで開いて確認することもできます。
追加のヒントとよくある問題
一部のコンピューターが応答しない場合や、「アクセス拒否」メッセージが頻繁に表示される場合は、そのコンピューターでリモート PowerShell コマンドが許可されていること、およびユーザーが適切な権限を持っていることを再度確認してください。また、ネットワークの問題も確認してください。ポート(HTTP の場合は5985 、HTTPS の場合は5986)がブロックされていることが原因の場合もあります。
あるいは、コマンドの実行速度が遅かったり、ハングアップしたりする場合は、スクリプトを小さなOUで実行したり、マシンを1台ずつフィルタリングしたりしてみるのも良いかもしれません。PowerShellは、特に大規模な環境では、少々不安定になることがあります。
結論
これらの手順に従うことで、ネットワークの健全性に関するかなり正確なスナップショットを取得できます。監査、トラブルシューティング、アップグレードの計画に役立ちます。理由は分かりませんが、完璧に機能する時もあれば、ネットワーク設定や権限のせいでうまくいかない時もあります。それでも、推測するよりはましです。
よくある質問
Active Directory モジュールがインストールされていない場合はどうなりますか?
Windowsの「設定」>「アプリと機能」>「オプション機能」または「サーバーマネージャー」>「役割と機能の追加」から追加できます。RSATツールを探し、「Windows PowerShell用Active Directoryモジュール」をインストールしてください。
CSV ファイルのパスを変更できますか?
はい、エクスポートコマンドのパスを変更するだけです。例えば、ダウンロードに保存するには次のようにします。
$results | Export-Csv -Path "$env:UserProfile\Downloads\ComputerStatus.csv" -NoTypeInformation
特定のマシン 1 台だけをチェックするにはどうすればよいでしょうか?
ループを次のように固定のホスト名文字列に置き換えます$computers
。
$computerName = "DESKTOP-XYZ" if (Test-Connection -ComputerName $computerName -Count 2 -Quiet) {...}
ドメイン全体ではなく、1 台のマシンの情報だけが必要な場合に非常に役立ちます。
まとめ
- PowerShell に AD モジュールがロードされていることを確認します。
- 各マシンに ping を実行し、リモート SCM チェックを試みます。
- 現在ログインしているユーザーに関する情報を収集します。
- 簡単に確認できるように CSV として保存します。
これが役に立ち、誰かが手動で確認したり髪の毛を抜いたりする時間を節約できることを祈ります。