企業や組織が大規模に展開されている環境では、Active Directoryの複数ドメインを管理しながら、特定のコンピュータ情報に一括でアクセスできると非常に便利です。今回はPowerShellを活用し、資格情報を別ドメインのものに切り替えつつ、Active Directory全体を対象としてコンピュータを検索する方法について詳しく解説します。
PowerShellでActive Directory全体を検索するメリット
Active Directory内のコンピュータを検索する際、GUIの「Active Directoryユーザーとコンピュータ」を用いて「Entire Directory」を指定するやり方は、複数ドメインの情報をまとめて確認したい場合に有用です。しかしGUI操作では、他ドメインの資格情報をいちいち入力する必要があるなど、運用面で煩雑になりがちです。
そこで、PowerShellのActive Directoryモジュールを使うと、資格情報をスクリプト内で取り扱えますし、検索範囲や条件を柔軟に設定できるメリットがあります。さらに大量のオブジェクトを一度に処理したり、結果をCSVに出力したりといった拡張性も高いのです。
ドメインをまたいだ一括検索が実現できる仕組み
PowerShellのGet-ADObject
やGet-ADComputer
などのコマンドレットは、必要に応じて資格情報を指定し、かつフォレスト全体のルートを検索ベースに設定することで、ドメイン間の境界を意識せずにオブジェクトを拾い上げることができます。
また、Get-AdForest
やGet-AdDomain
を組み合わせて、環境全体のトップレベルから検索を開始すれば、結果的に「Entire Directory」に近い動作を再現可能です。
複数ドメインやフォレスト構成の注意点
複数ドメインが含まれるフォレスト構成では、フォレスト間信頼関係が確立されているか、検索先のドメインコントローラーで認証を許可するかどうかなど、セキュリティ設定の影響を受ける場合があります。システム管理者としては、必要に応じて適切な権限を付与されているか、またはクロスドメイン認証に問題がないかを確認することが重要です。
実際の手順とスクリプト例
ここでは、他ドメインの資格情報を用いて、フォレスト全体からコンピュータを検索する基本的な流れを紹介します。実環境で運用する際は、セキュアな資格情報の扱い方や運用ルールに従い、適宜修正してください。
1. Active Directoryモジュールのインポート
PowerShellからActive Directoryのコマンドレットを使用するためには、Active Directoryモジュールが必要です。以下のコマンドでモジュールをインポートします。
Import-Module ActiveDirectory
- もしエラーが出る場合は、管理者権限でPowerShellを実行しているか確認してください。
- インストールされていない場合は、「Windowsの機能の有効化/無効化」やサーバーマネージャー、またはInstall-WindowsFeatureコマンドレットなどで追加してください。
2. 別ドメインの資格情報を準備
次に、検索に使用する資格情報を取得します。実運用ではパスワードを平文で記載するのは避け、資格情報ファイルやセキュリティ上の保護された方法で管理するのが望ましいです。
以下の例では便宜的に平文パスワードを使用しています。
$username = "OTHERDOMAIN\\useradmin" # 別ドメインのアカウント
$password = ConvertTo-SecureString "P@ssw0rd!" -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential($username, $password)
資格情報の管理におけるベストプラクティス
- PowerShellの
Read-Host -AsSecureString
オプションを使って、パスワード入力を対話形式にする Export-Clixml
コマンドレットで暗号化された資格情報ファイルを作成し、必要時に読み込む- Windowsの資格情報マネージャーを利用し、パスワードをスクリプト内に書き込まない形で認証を行う
これらの方法を組み合わせることで、運用上のセキュリティリスクを最小化できます。
3. フォレスト情報の取得とSearchBaseの設定
「Entire Directory」に近い範囲で検索したい場合は、フォレストのルートからたどる設定を行います。Get-AdForest
コマンドレットから取得できるRootDomain
情報を活用して、LDAP形式のサーチベースを指定します。
$forestRootDomain = (Get-AdForest).RootDomain
$searchBase = "LDAP://CN=$forestRootDomain,$((Get-AdRootDSE).distinguishedName)"
Get-AdForest
はフォレスト内のドメイン一覧などの情報も返すため、特定のドメインを指定したい場合にも応用可能です。Get-AdRootDSE
は現在接続中のドメインコントローラーに関するルート情報を返します。ここでのdistinguishedName
を利用して、LDAPパスを組み立てています。
より詳細なLDAPパス設定
標準的な全検索では上記のようにルートを指定するだけで済みますが、特定のOU(組織単位)配下やドメイン単位で絞り込みたい場合は、OU=...
などの指定で独自に組み立てます。運用環境に応じて使い分けると良いでしょう。
4. 検索フィルタの作成
Active Directory検索では、LDAPクエリ形式のフィルタを指定することで、取得オブジェクトを柔軟に絞り込みできます。
たとえば、コンピュータオブジェクトのみ取得したい場合は以下のようにobjectClass=computer
を指定します。
$filter = "(&(objectClass=computer))"
さらに条件を加え、一定期間更新されていないコンピュータだけを探すなど高度なフィルタリングも可能です。LDAPクエリを組み合わせると、一度に詳細な条件で検索できるため非常に便利です。
よく使われるフィルタ例
目的 | フィルタ例 |
---|---|
無効なコンピュータのみを取得 | &(objectClass=computer)(userAccountControl:1.2.840.113556.1.4.803:=2) |
特定の名前で始まるコンピュータ | &(objectClass=computer)(name=PC*) |
Windows Server系OSのみ | &(objectClass=computer)(OperatingSystem=*Server*) |
こうしたフィルタを活用することで、環境のメンテナンスや監査、棚卸し作業にも役立ちます。
5. 検索の実行
準備した資格情報やフィルタ、サーチベースを指定して、実際に検索を行います。ここではGet-ADObject
を例示しますが、Get-ADComputer
でも類似の指定が可能です。Get-ADComputer
には-Credential
パラメータがないバージョンのPowerShellもあるため、環境に合わせて使い分けてください。
$computers = Get-ADObject -Filter $filter -SearchBase $searchBase -SearchScope Subtree `
-Credential $credential -Properties Name, DNSHostName
-SearchScope Subtree
を指定することで、サーチベース以下のすべてのOUやコンテナを対象に検索します。-Properties
で取得したい属性を列挙します。ここで指定していない属性はデフォルトで取得されません。*
(アスタリスク)を指定すればすべての属性を取得可能ですが、オブジェクト数や属性数が多い場合はパフォーマンスに影響が出ることもあるため注意が必要です。
Get-ADComputerを使う場合
もしGet-ADComputer -Credential
が使用可能な環境であれば、以下のように記述できます。
$computers = Get-ADComputer -Filter * -SearchBase $searchBase -SearchScope Subtree `
-Credential $credential -Properties Name, DNSHostName
Get-ADComputer
の場合は、取得できる属性がコンピュータオブジェクトに特化しているので、実際の運用上こちらの方が便利なケースも多いです。
取得した結果の活用方法
一度に取得したコンピュータ一覧を用いて、各種の運用業務を自動化できます。例えば名前やホスト名、OSバージョンなどをリストにしてレポート化し、定期的に棚卸しを行うといった活用例が挙げられます。
1. 結果の確認と出力
単純にPowerShell上で名前を表示する場合は、以下のようにループ処理で取り出します。
foreach ($computer in $computers) {
Write-Host "Name: $($computer.Name) - DNS Hostname: $($computer.DNSHostName)"
}
これにより、コンピュータ名とDNSホスト名が一覧表示されます。環境に合わせて、必要な属性(操作システム、OSバージョン、最終ログオン日時など)を追加することで、より詳細な情報を確認できます。
CSV出力例
$computers | Select-Object Name, DNSHostName | Export-Csv -Path "C:\temp\computers.csv" -NoTypeInformation
- これにより一覧がCSVファイルとして出力され、Excelなどで開ける形になるのでレポート用途に便利です。
2. フィルタを使ったメンテナンス例
たとえば、無効になっているコンピュータを一覧化し、一括で削除するなどの運用タスクを自動化できます。
ただし、本番環境で削除操作を行う際は、必ずテスト環境で動作確認を行い、誤って稼働中のコンピュータを消してしまわないように注意してください。
$disabledComputers = Get-ADObject -Filter "(&(objectClass=computer)(userAccountControl:1.2.840.113556.1.4.803:=2))" `
-SearchBase $searchBase -SearchScope Subtree `
-Credential $credential
foreach ($dc in $disabledComputers) {
# 削除実行例 (注意)
# Remove-ADObject -Identity $dc.DistinguishedName -Credential $credential
Write-Host "Disabled computer object: $($dc.Name)"
}
上記では実際の削除操作(Remove-ADObject)をコメントアウトしています。必ず実行前に結果を確認し、想定外のオブジェクトが含まれていないことを確認しましょう。
トラブルシューティングのポイント
Active Directory全体を検索する際に発生しがちな問題の代表的な例と対処策を紹介します。
1. 資格情報の認証エラー
- 指定したアカウントに十分な権限がない場合や、パスワードが正しくない場合、認証エラーが発生します。
- 別ドメインの場合は「DOMAIN\username」の形式を正しく指定しなければなりません。UPN形式(user@domain.local)でも動作可能です。
2. ネットワーク疎通エラー
- 複数ドメイン間の通信がファイアウォールやネットワーク設定の制限によって遮断されている場合、ドメインコントローラーへアクセスできずエラーになります。
- 必要なポート(TCP/UDP 389など)が開放されているか確認してください。
3. LDAPパスまたはフィルタの誤り
- LDAPフィルタ構文を誤ったり、サーチベースのLDAPパスが不適切だと、何も結果が得られない、または予期せぬエラーが出ることがあります。
- まずはフィルタをシンプルにしてテストし、少しずつ条件を追加していくのがおすすめです。
効率的な運用とセキュリティ管理
PowerShellによる自動化の恩恵
Active Directory管理において、スクリプトによる一括処理は作業時間の大幅な短縮だけでなく、ヒューマンエラーの削減にも役立ちます。また、ドキュメント化(スクリプトそのものが操作履歴の一部を示す)やリモートからの管理など、運用効率を高めるための仕組みを構築しやすいのも利点です。
セキュリティ対策との両立
一方で、PowerShellスクリプト内で資格情報を扱うことは、誤った管理をすると非常に危険です。以下の点に注意しながら運用しましょう。
- 資格情報は平文で保持せず、暗号化された形式にする
- スクリプトのアクセス権(ACL)を最小限にする
- 共通アカウントを使う場合は適切にパスワード更新を徹底する
このように、利便性とセキュリティのバランスを取りながら運用することで、組織全体のITインフラを守りつつ、管理効率を高められます。
まとめ
PowerShellを使ったActive Directory検索は、GUIでの操作と比べてはるかに柔軟で強力な方法を提供してくれます。資格情報を切り替えつつフォレスト全体からオブジェクトを取得できるため、複数ドメインを横断するような大規模環境で特に重宝するでしょう。
ただし、同時に扱うオブジェクト数が膨大になりがちなため、必要以上に広範囲を検索するとパフォーマンスが低下したり、不要なデータを取得してしまうリスクもあります。適切なフィルタを用いて必要なオブジェクトに絞り込みつつ、セキュリティ管理を徹底することが重要です。
これらのポイントを押さえれば、GUIでの「Entire Directory」検索と同等またはそれ以上に便利かつ効率的な運用が実現可能です。ぜひ一度、PowerShellスクリプトを活用して管理作業の負荷を大幅に削減してみてください。
コメント