ADグループ内でダブっているユーザーを探すスクリプト

11.05

ActiveDirectoryのグループは、特に編集せずExchangeのグループに利用したり、アクセス権の付与に便利です。

しかし代を重ねるにつれて、様々なグループが乱立することになり、修正が必要になることが多くあります。

以下のスクリプトはグループのメンバーを取得して、その第1世代にいるユーザーが、第一世代以降にいるグループに含まれていないかチェックして自動的に脱退させるスクリプトになります。

$Group = Get-ADGroup -Filter *

$Group | % {

$GroupName = $_.name

$s = $l = $members = $null

$s = $_.DistinguishedName

$l =[adsi]”LDAP://$s”

$members = $l.psbase.invoke(“Members”) | foreach {$_.GetType().InvokeMember(“SamAccountName”,’GetProperty’,$null,$_,$null)}

$members | % {

$ObjectClass = $a = $null

$a = $_

$ObjectClass = Get-ADObject -Filter {SamAccountName -eq $a} -Properties ObjectClass

if($ObjectClass.ObjectClass -eq “user”)

{

$User += $_

}

else

{

if($ObjectClass.ObjectClass -eq “group”)

{

$Group += $_

}

}

}

$Group | % {

$member = $d = $a = $members = $null

$Member = Get-ADGroup $_

$d = $Member.DistinguishedName

$a =[adsi]”LDAP://$d”

$members = $a.psbase.invoke(“Members”) | foreach {$_.GetType().InvokeMember(“SamAccountName”,’GetProperty’,$null,$_,$null)}

# 1回目の展開

$members | % {

$ObjectClass = $null

$ObjectClass = Get-ADObject -Filter {SamAccountName -eq $_} -Properties ObjectClass

if($ObjectClass.ObjectClass -eq “user”)

{

$GroupUser += $_

}

else

{

if($ObjectClass.ObjectClass -eq “group”)

{

$Member = $d = $a = $members = $null

$Member = Get-ADGroup $_

$d = $Member.DistinguishedName

$a =[adsi]”LDAP://$d”

# 2回目の展開

$members = $a.psbase.invoke(“Members”) | foreach {$_.GetType().InvokeMember(“SamAccountName”,’GetProperty’,$null,$_,$null)}

$members | % {

$ObjectClass = $null

$ObjectClass = Get-ADObject -Filter {SamAccountName -eq $_} -Properties ObjectClass

if($ObjectClass.ObjectClass -eq “user”)

{

$GroupUser += $_

}

else

{

if($ObjectClass.ObjectClass -eq “group”)

{

$Member = $d = $a = $members = $null

$Member = Get-ADGroup $_

$d = $Member.DistinguishedName

$a =[adsi]”LDAP://$d”

# 3回目の展開

$members = $a.psbase.invoke(“Members”) | foreach {$_.GetType().InvokeMember(“SamAccountName”,’GetProperty’,$null,$_,$null)}

$members | % {

$ObjectClass = $null

$ObjectClass = Get-ADObject -Filter {SamAccountName -eq $_} -Properties ObjectClass

if($ObjectClass.ObjectClass -eq “user”)

{

$GroupUser += $_

}

else

{

if($ObjectClass.ObjectClass -eq “group”)

{

$Member = $d = $a = $members = $null

$Member = Get-ADGroup $_

$d = $Member.DistinguishedName

$a =[adsi]”LDAP://$d”

# 4回目の展開

$members = $a.psbase.invoke(“Members”) | foreach {$_.GetType().InvokeMember(“SamAccountName”,’GetProperty’,$null,$_,$null)}

$members | % {

$ObjectClass = $null

$ObjectClass = Get-ADObject -Filter {SamAccountName -eq $_} -Properties ObjectClass

if($ObjectClass.ObjectClass -eq “user”)

{

$GroupUser += $_

}

else

{

if($ObjectClass.ObjectClass -eq “group”)

{

$Member = $d = $a = $members = $null

$Member = Get-ADGroup $_

$d = $Member.DistinguishedName

$a =[adsi]”LDAP://$d”

# 5回目の展開

$members = $a.psbase.invoke(“Members”) | foreach {$_.GetType().InvokeMember(“SamAccountName”,’GetProperty’,$null,$_,$null)}

$members | % {

$ObjectClass = $null

$ObjectClass = Get-ADObject -Filter {SamAccountName -eq $_} -Properties ObjectClass

if($ObjectClass.ObjectClass -eq “user”)

{

$GroupUser += $_

}

else

{

$note = $null

$note = $_ + ” This group is nested.”

}

}

}

}

}

}

}

}

}

}

}

}

}

}

}

$User | % {

$exist = $null

$exist = $GroupUser.contains(“$_”)

if($exist)

{

Remove-ADGroupMember $GroupName -Members $_ -Confirm:$false

$note = $null

$note = $GroupName + “`t” + $_

$note | Out-File $env:UserProfile\Desktop\NestUser_List.csv -Append

}

}

$count = $count + 1

Write-Output $count

}

展開については同じことをしているだけなので、Function化するとすっきりですね!

Powershell覚えたてに作ったスクリプトなので細かい部分はご自身で修正してください。

関連記事

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

2018年11月
« 10月    
 1234
567891011
12131415161718
19202122232425
2627282930  
ページ上部へ戻る