ひっそりと生きるプログラマのブログ

日頃気になった事なりを書き留めるブログです。関心ごとは多くもう少し更新頻度を上げたいところです。

PowerShellで任意のユーザーグループを取得する

メンバーを見るに、FindOneを使うのが正解?

[void][reflection.assembly]::LoadWithPartialName("System.DirectoryServices")
[void][reflection.assembly]::LoadWithPartialName("System.DirectoryServices.AccountManagement")

function Get-Group($context, $groupName) {
<#
    任意のコンテキストに含まれる任意のグループオブジェクトを返します。
    対象のオブジェクトを1件でも取得できた場合は、いずれかを返します。
    対象のオブジェクトの取得が 0 件の場合は、 null を返します。
    
    $context
        取得元となるコンテキスト
    $groupName
        取得元となるグループ名
#>
    $filter = New-Object System.DirectoryServices.AccountManagement.GroupPrincipal($context)
    $filter.Name = $groupName
    $searcher = New-Object System.DirectoryServices.AccountManagement.PrincipalSearcher($filter)
    $result = $searcher.FindOne()
    $searcher.Dispose()
    return $result
}

# テスト用コード
$context = New-Object System.DirectoryServices.AccountManagement.PrincipalContext([System.DirectoryServices.AccountManagement.ContextType]::Machine)
Get-Group $context "Administrators"

以下のような結果が返ってきます。

IsSecurityGroup       : True
GroupScope            : Local
Members               : {Administrator, sample...}
Context               : System.DirectoryServices.AccountManagement.PrincipalContext
ContextType           : Machine
Description           : コンピューター/ドメインに完全なアクセス権があります。
DisplayName           : 
SamAccountName        : Administrators
UserPrincipalName     : 
Guid                  : 
DistinguishedName     : 
StructuralObjectClass : 
Name                  : Administrators

ここで、Membersを参照すると、Administrators権限を持つユーザーを取得できます。