2017-03-02 114 views
0

複数の異なるグループから複数の異なるユーザーを削除する必要があり、これまでdsmodコマンドスクリプトを使用して作業を完了してきました。しかし、私はいくつかのPowerShellマジックをアップグレードしようとしていましたが、おそらくプロセスを速めました。私はまた、成功または失敗の両方のアクションログを出力するスクリプトが必要です。Powershell - 複数のADグループから複数のADメンバーを削除する

私が使用している入力ファイルは、最初の列にuserid、2番目の列にグループ名を持つ.csvです。私が作業しているテスト入力ファイルには、distinguishednameと単にsamaccountnameの両方が表示されているので、入力を受け入れる方法を見ることができます。また、同じページにあるので、ドメイン情報を保護するために出力エラーを編集しましたが、何があるべきかを公正に表現していると信じています。

これまでのところ、私が試したいくつかのバリエーションを見つけました。

$fileList = import-CSV -Delimiter ',' c:\temp\Logs\RemoveUserInput.csv 

foreach($entry in $fileList)    
{ 
    $user = $entry.UserID 
    $group = $entry.Group 
    remove-adgroupmember -Identity $group -Member $user -Confirm:$false 
} 

そして、私は取得していますエラーは次のとおりです:最初はある

PS C:\Temp\Logs> .\remove_users_from_group.ps1 
remove-adgroupmember : Cannot find an object with identity: 
'cn=user1,dc=domain,dc=com' under: 
'DC=domain,DC=com'. 
At C:\Temp\Logs\remove_users_from_group.ps1:7 char:3 
+ remove-adgroupmember -Identity $group -Member $user -Confirm:$false 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : ObjectNotFound: (cn=user1,dc=domain,dc=c 
    om:ADPrincipal) [Remove-ADGroupMember], ADIdentityNotFoundException 
    + FullyQualifiedErrorId : SetADGroupMember.ValidateMembersParameter,Micros 
    oft.ActiveDirectory.Management.Commands.RemoveADGroupMember 

remove-adgroupmember : Cannot find an object with identity: 'user1' under: 
'DC=domain,DC=com'. 
At C:\Temp\Logs\remove_users_from_group.ps1:7 char:3 
+ remove-adgroupmember -Identity $group -Member $user -Confirm:$false 
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : ObjectNotFound: (user1:ADPrincipal) [Remove-ADG 
    roupMember], ADIdentityNotFoundException 
    + FullyQualifiedErrorId : SetADGroupMember.ValidateMembersParameter,Micros 
    oft.ActiveDirectory.Management.Commands.RemoveADGroupMember 

同僚は、問題の一部は、当社の複数ドメインのフォレストで横たわっていたかもしれないことを示唆し、スクリプトのバリエーションを提供しましたdomain2のグループからdomain1のユーザーを削除します。

Import-Module ActiveDirectory 
$FileList = Import-CSV -Delimiter ',' C:\temp\Logs\RemoveUserInput.csv 

# Create new ADSearcher Object – could also be done differently 
$objForest = [system.directoryservices.activedirectory.forest]::GetCurrentForest() 
$ForestDefaultNC = "DC="+$objForest.RootDomain.Name.Replace(".",",DC=") 
$ADSearcher = New-Object System.DirectoryServices.DirectorySearcher 
$ADSearcher.PageSize = 1000 

foreach($entry in $FileList) { 
    $UserName = $entry.UserID 
    $GroupName = $entry.Group 

    $GroupFilter = "(&(objectClass=group)(Name=$GroupName))" 
    $ADSearcher.Filter = $GroupFilter 
    $ADSearcher.SearchRoot = New-Object ADSI("GC://$($ForestDefaultNC)") 
    $Group = $ADSearcher.FindAll() 

    $UserFilter = "(&(objectCategory=person)(objectClass=user)(Name=$UserName))" 
    $ADSearcher.Filter = $UserFilter 
    $ADSearcher.SearchRoot = New-Object ADSI("GC://$($ForestDefaultNC)") 
    $User = $ADSearcher.FindAll() 

    Remove-ADGroupMember -Identity $Group -Members $User 
} 

そして次のエラーは、次のとおりです:次のようにスクリプトのばらつきがある

PS C:\Temp\Logs> .\2remove_users_from_group.ps1 
Remove-ADGroupMember : Cannot bind parameter 'Identity'. Cannot convert the 
"System.DirectoryServices.SearchResultCollection" value of type 
"System.DirectoryServices.SearchResultCollection" to type 
"Microsoft.ActiveDirectory.Management.ADGroup". 
At C:\Temp\Logs\2remove_users_from_group.ps1:28 char:36 
+  Remove-ADGroupMember -Identity $Group -Members $User 
+         ~~~~~~ 
    + CategoryInfo   : InvalidArgument: (:) [Remove-ADGroupMember], Par 
    ameterBindingException 
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.ActiveD 
    irectory.Management.Commands.RemoveADGroupMember 

Remove-ADGroupMember : Cannot bind parameter 'Identity'. Cannot convert the 
"System.DirectoryServices.SearchResultCollection" value of type 
"System.DirectoryServices.SearchResultCollection" to type 
"Microsoft.ActiveDirectory.Management.ADGroup". 
At C:\Temp\Logs\2remove_users_from_group.ps1:28 char:36 
+  Remove-ADGroupMember -Identity $Group -Members $User 
+         ~~~~~~ 
    + CategoryInfo   : InvalidArgument: (:) [Remove-ADGroupMember], Par 
    ameterBindingException 
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.ActiveD 
    irectory.Management.Commands.RemoveADGroupMember 

いただければ幸いに提供することができますどのような援助。

編集:要求されたとして、以下の.csvファイルの例です:

その非常に簡単で、おそらく正確にあなたが想像するとおりのfindAll()メソッドの

UserID,group 
"cn=user1,dc=domain,dc=com","cn=group1,dc=domain,dc=com" 
user1,group1 
+0

あなたのcsvの外観は何ですか(私は良い推測があります)?私たちにいくつかの行を見せてください。 – Matt

+0

これらのDNが正しいことは確かですか?ユーザーとグループはドメインのルートに配置されていますか?いつものシナリオではありません... –

+0

私は質問で言ったように、私はここで見ているもののDNを、目的だけのために変更しました。しかし、私が使用している実際のファイルの情報が正しいことを100%確信しています。 – BitBeard

答えて

0

結果はSearchResultCollectionタイプです複数のユーザーを含めることができるためです。

Remove-ADGroupMemberで使用するには、ディレクトリエントリを取得するか、識別名のような属性を渡す必要があります。

アイデンティティはMS Docsに応じて、次のいずれかになります

あなたは、その識別名(DN)によってグループ、GUID、セキュリティ識別子(SID)、またはセキュリティアカウントマネージャ(SAM)アカウント名を識別することができます。例えばので

$GroupDN = ($ADSearcher.FindAll() | select -first 1).Properties.distinguishedname 

$UserDN = ($ADSearcher.FindAll() | select -first 1).Properties.distinguishedname 

しかし、あなたはすでに入力されたCSVでのDNを持っており、グループ/ユーザは、あなただけで削除-ADGroupMemberを呼び出すことができますが存在する場合は、明示的にチェックしない場合オブジェクトが存在しない場合はDNとcatchエラー。

関連する問題