PowerShellでActive Directoryのコンピューター説明フィールドを自動入力・更新する方法
Active Directory(AD)のコンピューターオブジェクトの説明(Description)フィールドには、さまざまな有用な情報を格納できます。例えば、コンピューターのメーカーやモデル、シリアル番号といったハードウェア情報、さらには最後にログオンしたユーザー名などです。本記事では、PowerShellを使用してADのコンピューターオブジェクトの説明フィールドに情報を自動的に入力・更新する方法を詳しく解説します。
PowerShellでADのコンピューター説明フィールドを更新する方法
まず、「Active Directoryユーザーとコンピューター(ADUC)」コンソール上で、コンピューターやサーバーの説明フィールドに、メーカー名・モデル・シリアル番号を表示させたいケースを想定してみましょう。ローカルマシンの情報は、WMI経由で以下のPowerShellコマンドを実行することで取得できます。
Get-WMIObject Win32_ComputerSystemProduct | Select Vendor, Name, IdentifyingNumber
このWMIクエリは次のようなデータを返します。
- Vendor – HP
- Name – Proliant DL 360 G5
- IdentifyingNumber – CZJ733xxxx

続いて、環境変数から現在のコンピューター名を取得し、$computer変数に代入します。
$computer = $env:COMPUTERNAME
次に、コンピューターのハードウェア情報をそれぞれの変数に保存します。
$computerinfo= Get-WMIObject Win32_ComputerSystemProduct
$Vendor = $computerinfo.vendor
$Model = $computerinfo.Name
$SerialNumber = $computerinfo.identifyingNumber
各変数に正しく値が格納されているか、確認してみましょう。
$computer
$vendor
$Model
$SerialNumber
あとは、取得したデータをADのコンピューターアカウントの説明フィールドに書き込むだけです。以下のPowerShellスクリプトを実行してください。
$ComputerSearcher = New-Object DirectoryServices.DirectorySearcher
$ComputerSearcher.SearchRoot = "LDAP://$("DC=$(($ENV:USERDNSDOMAIN).Replace(".",",DC="))")"
$ComputerSearcher.Filter = "(&(objectCategory=Computer)(CN=$Computer))"
$computerObj = [ADSI]$ComputerSearcher.FindOne().Path
$computerObj.Put( "Description", "$vendor|$Model|$SerialNumber" )
$computerObj.SetInfo()
また、Set-ADComputerコマンドレットを使ってコンピューターの説明を変更することも可能です。ただしこの場合、RSAT管理ツールキットに含まれる「Active Directoryモジュール for Windows PowerShell」がコンピューターにインストールされている必要があります。
Set-ADComputer $computer –Description "$vendor|$Model|$SerialNumber”
AD PowerShellモジュールのコマンドレットを利用したいもののRSATをインストールしたくない場合は、モジュールのファイル群をそのまま全コンピューターへコピーして使用することもできます。
ADUCコンソールを開き、コンピューターの説明フィールドにメーカー名やモデル情報が表示されていることを確認してください。

上記のスクリプトは、あくまで実行したコンピューター自身のdescription属性のみを更新するものです。Get-ADComputerコマンドレットとforeachループを組み合わせれば、ドメイン内の全コンピューターの説明をリモートから一括入力することもできますが、より効率的なのは、ユーザーのログオン時やコンピューターの起動時に、各端末が自動的に自分の情報をADへ更新する仕組みを構築することです。
そのために、PowerShellログオンスクリプトを含むグループポリシー(GPO)を作成し、すべてのコンピューターに適用しましょう。手順は以下の通りです。
- ドメインのグループポリシー管理コンソール(
gpmc.msc)を開き、新しいGPOを作成して、対象コンピューターが属するOUに割り当てます。 - GPOを次のように展開します。[ユーザーの構成] → [ポリシー] → [Windowsの設定] → [スクリプト(ログオン/ログオフ)] → [ログオン]
- [PowerShellスクリプト]タブに切り替えます。
- [ファイルの表示]ボタンをクリックし、以下のコードを記述したFillCompDesc.ps1ファイルを作成します。
# コンピューターのハードウェア/モデル情報をADの説明フィールドに書き込む
$computer = $env:COMPUTERNAME
$computerinfo= Get-WMIObject Win32_ComputerSystemProduct
$Vendor = $computerinfo.vendor
$Model = $computerinfo.Name
$SerialNumber = $computerinfo.identifyingNumber
$DNSDOMAIN= (Get-WmiObject -Namespace root\cimv2 -Class Win32_ComputerSystem).Domain
$ComputerSearcher = New-Object DirectoryServices.DirectorySearcher
$ComputerSearcher.SearchRoot = "LDAP://$("DC=$(($DNSDOMAIN).Replace(".",",DC="))")"
$ComputerSearcher.Filter = "(&(objectCategory=Computer)(CN=$Computer))"
$computerObj = [ADSI]$ComputerSearcher.FindOne().Path
$computerObj.Put( "Description", "$vendor|$Model|$SerialNumber" )
$computerObj.SetInfo()
トラブルシューティングを容易にするため、必要に応じてスクリプトの動作をログに記録しておくとよいでしょう。 - [追加]ボタンをクリックし、次のスクリプトパラメーターを設定します。
スクリプト名:FillCompDesc.ps1
スクリプトのパラメーター:-ExecutionPolicy Bypass

この設定により、PowerShellの実行ポリシーを変更したりPS1スクリプトに署名したりすることなく、スクリプトを実行できます。 - 対象のOUに対して、Authenticated UsersドメイングループへのAD権限を委任します。具体的には、OU内のすべてのコンピューターオブジェクトのdescription属性を変更する権限(
Write Description権限)を付与します。これにより、ドメインのユーザーおよびコンピューターが、コンピューターオブジェクトの説明属性の値を更新できるようになります。
- 対象OU内のコンピューターを再起動してグループポリシー設定が反映されると、ADの説明フィールドが自動的に入力されます。このフィールドにはコンピューターのハードウェア情報が格納されます。GPOがうまく適用されない場合は、
gpresultツールや「グループポリシーが適用されない一般的な原因」に関する記事の手順を参考にトラブルシューティングを行ってください。
この方法を使えば、ADのコンピューターオブジェクトの説明フィールドに任意の情報を追加できます。例えば、最終ログオンユーザー名、部署名(Get-ADUserコマンドレットで取得可能)、コンピューターのIPアドレスなど、運用に必要なあらゆる情報を登録できます。
注意:この手法の欠点は、認証済みの任意のADユーザーが、Active Directory内の任意のコンピューターの説明を変更・削除できてしまう点です。
ADのコンピューター説明に最終ログオンユーザー名を追加する
前述のPowerShellスクリプトは、ADのコンピューターオブジェクトの説明に他の情報を追加する用途にも簡単に転用できます。例えば、「どのコンピューターに誰がログオンしているか」を一目で把握できるようにしたい場面では非常に便利です。ここではさらに、ユーザーが認証されたドメインコントローラー名(LOGONSERVER)も併せて記録してみましょう。
PowerShellログオンスクリプトの該当行を、以下のように変更します。
$computerObj.Put("Description","$vendor|$Model|$SerialNumber|$env:username|$env:LOGONSERVER")
一度サインアウトし、改めて自分のユーザーアカウントでサインインしてください。コンピューターの説明属性に、現在のユーザー名と認証先のドメインコントローラー(logonserver)が表示されていれば成功です。

description属性の値を解析(パース)するには、以下のPowerShellコードを使用します。
$ComputerName = 'PC-MUN22s7b2'
$vendor,$Model,$SerialNumber,$Username,$LogonServer = ((Get-ADComputer -identity $ComputerName -Properties *).description).split("|")
このコードでは、説明フィールドの値を|区切りで複数の独立した変数に分割しています。指定したリモートコンピューター上のユーザー名を取得するには、次のコマンドを実行するだけでOKです。
$Username

逆に、特定のユーザーが現在ログオンしているコンピューター名を調べたい場合は、以下のPowerShellスクリプトを使用します。
$user='*M.Becker*'
Get-ADComputer -Filter "description -like '$user'" -properties *|select name,description |ft
-
Windows 10でActive Directoryを有効にする方法【RSAT導入から設定まで解説】
Active Directoryは、Windows Server環境を管理するための重要なツールです。ネットワーク上のユーザーやリソースへのアクセス権限を、管理者が制御・付与するために使用されます。Windows PCにはデフォルトではインストールされていませんが、Microsoftの公式サイトから入手して、自分のデバイスにインストールすることが可能です。 「Windows 10でActive Directoryをどう使えばいいのか分からない」とお悩みの方も多いのではないでしょうか。本記事では、Windows 10でActive Directoryを有効にする方法を、初心者の方にも分かりやすく
-
インターネットはどのように話すか
コミュニケーションの物語 インターネットが実際にどのように話すのか疑問に思ったことはありませんか?あるコンピューターは、インターネットを介して別のコンピューターとどのように「会話」しますか? 人々が互いにコミュニケーションをとるとき、一見意味のある文章にまとめられた単語を使用します。これらの文の意味について合意したからこそ、これらの文は意味を成します。いわば、通信のプロトコルを定義しました。 結局のところ、コンピューターはインターネットを介して同様の方法で互いに通信します。しかし、私たちは先を行っています。人は口を使ってコミュニケーションをとります。まず、コンピューターの口が何であるかを