PowerShellでユーザーの所属グループを確認するには、ローカルグループとActive Directory(AD)のグループを分けて調べます。この記事では、特定のローカルユーザーが直接所属するローカルグループを一覧表示する方法を中心に、グループ側からのメンバー確認とADでの確認方法を紹介します。掲載するコマンドは情報の取得用で、ユーザーやグループの設定は変更しません。
はじめに
Get-LocalGroupはグループ自体を取得するコマンドです。Get-LocalGroupの結果に対して.Membersを参照しても、所属メンバーは取得できません。メンバーの一覧にはGet-LocalGroupMemberを使います。
以下のローカルグループの例は、ローカルアカウントを管理するWindows端末やメンバーサーバー上で、Windows PowerShell 5.1とMicrosoft.PowerShell.LocalAccountsモジュールを使う前提です。対象のコンピューター上で実行してください。64ビットWindowsの32ビットPowerShellでは、このモジュールは使用できません。PowerShellのバージョンだけでなく、次のコマンドでモジュールとコマンドの有無を確認します。
Get-Module -ListAvailable Microsoft.PowerShell.LocalAccounts
Get-Command Get-LocalUser, Get-LocalGroup, Get-LocalGroupMember
モジュールが見つからない場合はOSと実行しているPowerShellを確認してください。取得時にアクセスが拒否された場合は、そのコンピューターで照会する権限を確認します。エラーを非表示にして「所属なし」と判断しないことが重要です。
特定のローカルユーザーが直接所属するグループを一覧表示する
例として、実行中のコンピューターに存在するローカルユーザーJohnDoeを調べます。ユーザー名だけでメンバーを比較すると、同名のドメインアカウントなどと取り違える可能性があるため、Get-LocalUserで対象を取得し、SID(セキュリティ識別子)で比較します。JohnDoeを実際のローカルユーザー名に置き換え、コード全体を実行してください。
# 対象は、このコンピューターのローカルユーザー
$targetUser = Get-LocalUser -Name 'JohnDoe' -ErrorAction Stop
$targetSid = $targetUser.SID.Value
$groups = @(Get-LocalGroup -ErrorAction Stop)
$failedGroups = @()
$memberships = @(
foreach ($group in $groups) {
try {
$members = @(Get-LocalGroupMember -Group $group -ErrorAction Stop)
}
catch {
$failedGroups += $group.Name
Write-Warning ("取得失敗: {0} / {1}" -f $group.Name, $_.Exception.Message)
continue
}
$matchedMembers = @($members | Where-Object { $_.SID.Value -eq $targetSid })
if ($matchedMembers.Count -gt 0) {
$group
}
}
)
$memberships | Sort-Object Name | Select-Object Name, SID
if ($failedGroups.Count -gt 0) {
Write-Warning ("結果は不完全です。未確認のグループ: {0}" -f ($failedGroups -join ', '))
}
elseif ($memberships.Count -eq 0) {
Write-Output '直接所属するローカルグループは見つかりませんでした。'
}
コードの解説
Get-LocalUserでローカルユーザーを特定し、SID.Valueから比較用のSID文字列を取り出します。ADのユーザーを検索するコマンドではありません。Get-LocalGroupで取得した各グループをGet-LocalGroupMember -Groupに渡し、返されたメンバーのSIDと比較します。-ErrorAction Stopとtry/catchでグループごとの取得失敗を記録します。正常に取得できたグループの結果は表示しますが、失敗があれば「結果は不完全」と警告します。- これは直接登録されているメンバーの確認です。ローカルグループにADグループが登録され、そのADグループ経由でユーザーが所属している場合、その間接的な所属までは展開しません。
一部のグループを取得できなかった場合、一覧に対象グループがないことは「所属していない」証明にはなりません。警告に表示されたグループとエラーを確認してから判断してください。
応用例:特定のローカルグループのメンバーを一覧表示する
組み込みのAdministratorsグループを確認する例です。表示名の言語や変更に依存しないよう、既知のSIDであるS-1-5-32-544を指定します。ユーザーだけでなく、メンバーとして登録されたグループも返るため、ObjectClassも表示します。
Get-LocalGroupMember -SID 'S-1-5-32-544' -ErrorAction Stop |
Select-Object Name, ObjectClass, PrincipalSource, SID
このコマンドも入れ子のグループを再帰的には展開しません。SIDの対応はMicrosoftのセキュリティ識別子の資料で確認できます。
Active Directoryのユーザーを調べる場合
ADの所属グループを確認する場合は、ActiveDirectoryモジュールのGet-ADPrincipalGroupMembershipを使います。モジュールを利用できる管理端末とADへの接続・照会権限が必要です。未導入の場合は、OSに対応するRSATのAD DS/AD LDS管理ツールを確認してください。下記のサーバー名とユーザー名は自分の環境に置き換えます。
Import-Module ActiveDirectory -ErrorAction Stop
$server = 'dc01.contoso.com'
$adUser = Get-ADUser -Identity 'JohnDoe' -Server $server -ErrorAction Stop
Get-ADPrincipalGroupMembership -Identity $adUser -Server $server -ErrorAction Stop |
Sort-Object Name |
Select-Object Name, GroupScope, GroupCategory, SID
Get-ADPrincipalGroupMembershipの検索にはグローバルカタログが必要です。この例で取得するのは、直接所属するADグループとプライマリグループで、入れ子のグループを再帰的にたどった一覧ではありません。別ドメインのドメインローカルグループを確認する場合には、ResourceContextServerなど検索先の指定も検討が必要です。詳細はMicrosoftのグループ取得仕様を参照してください。
ADユーザーが、そのWindows端末のローカルグループに直接登録されているかを調べたい場合は、ADグループ検索とは別の確認です。上のGet-ADUserで取得した$adUser.SID.Valueをローカル検索例の$targetSidに設定し、対象端末の各グループを照会します。ADグループを経由する間接的な所属は、このSID比較だけでは分かりません。
現在のログオン状態やアクセス権との違い
今コマンドを実行しているアカウントのグループ情報は、whoami /groupsでも確認できます。ただし、任意の別ユーザーを指定するコマンドではなく、現在の実行コンテキストの情報です。直接所属グループの一覧と、アクセス判定に使われる現在のアクセストークンは区別してください。
whoami /groups
グループのSIDが表示されても、それだけでファイルへのアクセスや管理者操作が許可されるとは限りません。トークン内のSIDには有効・無効や「拒否専用」の属性があり、実際のアクセス判定では対象リソースのアクセス制御も関係します。詳しくはwhoamiとアクセストークン内のSID属性の説明を参照してください。
まとめ
ローカルユーザーの直接所属を調べる場合は、Get-LocalGroupでグループを列挙し、Get-LocalGroupMemberで取得したメンバーのSIDと比較します。ADの所属はAD用のコマンドで確認し、直接所属、入れ子の所属、現在のトークンを混同しないようにしましょう。また、取得エラーがある一覧を完全な結果として扱わないことが重要です。


コメント