web-dev-qa-db-ja.com

(Powershell)特定のユーザーが「メンバーの書き込み」セキュリティを持っているグループのリストを返すメソッド

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
nlseven

ここには2つの問題があります。

  1. CMDlet Get-QADPermissionは、実行中にコンソールに直接書き込んでいるため、Permissions for: ...が表示されます。パイプラインは同じ出力に書き込んでいるため、すべてが混在しています。代わりに、パイプラインからの出力を変数に格納します。

  2. グループを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'
  }

また、これは特定のプロパティの権限に対してのみ機能することにも注意してください。メンバー属性の変更が許可されている場合でも、グループに「フルコントロール」があるユーザーの結果は返されません。

1
Nic