ADグループで制御される共有へのアクセスを管理するために、ユーザーがログオンできるWebベースのソフトウェアを使用します。ユーザーが管理できるグループのリストは、ユーザーが「メンバーの書き込み」セキュリティを備えているグループです。これにより、ユーザーはADの知識がなくてもファイル共有を維持できます。
Quest.activeroles.admanagementを使用してPowershellスクリプトを作成しようとしています。このスクリプトは、離れたユーザーのアクセス許可を削除するために、指定されたユーザーが「メンバーの書き込み」セキュリティを設定しているグループの適切なリストを返します。検索する必要のあるグループはOUに保存されていますが、1,000を超えています。
私はこれまでに思いついた:
add-pssnapin quest.activeroles.admanagement
Get-QADObject -ShowProgress -SearchRoot 'domain.server.com/path/to/OU' -SearchScope 'OneLevel' -Type Group -SizeLimit 2500 | Get-QADPermission -Rights 'WriteProperty' -Property 'member' -Account "user" -WarningAction SilentlyContinue
これは正常に機能しますが(ただし非効率的です)、ホストの出力はかなり乱雑です。
Permissions for: full.domain.path/OU/path/group1
Ctrl Account Rights Source AppliesTo
---- ------- ------ ------ ---------
Domain\user Write member Not inherited This object and all child objects
Permissions for: full.domain.path/OU/path/group2
Domain\user Write member Not inherited This object and all child objects Not inherited This object and all child objects
Permissions for: full.domain.path/OU/path/group3
Domain\user Write member Not inherited This object and all child objects Not inherited This object only
Permissions for: full.domain.path/OU/path/group4
Domain\user Write member Not inherited This object and all child objects Not inherited This object and all child objects
必要な情報は入手できますが、それを取り巻く籾殻がたくさんあります。テキストファイルにパイプ/追加すると、グループ名ではなく、ユーザー名のみが取得されます。理想的には、OUパスのないグループ名のリストだけが必要です。完璧な世界では、複数のユーザーを実行できるように、列1がユーザー名で列2がグループであるCSVです(foreach( $ usernamesの$ username)):
User Group
domain\username group_name_one
domain\username group_name_two
domain\username group_name_three
Export-CSVがもう少し良いものを吐き出すような方法でこれに取り組むための最良の方法は何でしょうか?
ここには2つの問題があります。
CMDlet Get-QADPermission
は、実行中にコンソールに直接書き込んでいるため、Permissions for: ...
が表示されます。パイプラインは同じ出力に書き込んでいるため、すべてが混在しています。代わりに、パイプラインからの出力を変数に格納します。
グループをGet-QADPermission
にパイプすると、グループオブジェクトが破棄され、代わりにアクセス許可オブジェクトが取得されます。元のオブジェクトを保持する場合は、Where-Objectでフィルタリングする必要があります。
また、Get-QADPermission
にも注意してください。 WriteProperty
のみをクエリした場合、読み取りと書き込みの両方のアクセスで結果は返されません。通常、両方を照会する必要があります。また、ほとんどの場合、-Inherited
を使用して、親OUから付与されたアクセス許可を取得することもできます。一度限りのアクセス許可を本当に探している場合は、この切り替えを無視できます。
function Test-UserCanModifyGroupsInOU ($Username, $OU)
{
$results = Get-QADGroup -SearchScope 'OneLevel' -SearchRoot $OU |
Where-Object {
$_ | Get-QADPermission -Rights ReadProperty,WriteProperty -Property member -Account $username
} |
Select @{Name="User";Expression={$username}}, @{Name="Group";Expression={$_.Name}}
$results | Write-Output
$results | Export-Csv "$username.csv"
}
@("bob","sally") |
ForEach-Object {
Test-UserCanModifyGroupsInOU -Username $_ -OU 'domain.org.com/path/to/OU'
}
また、これは特定のプロパティの権限に対してのみ機能することにも注意してください。メンバー属性の変更が許可されている場合でも、グループに「フルコントロール」があるユーザーの結果は返されません。