Powershell-从多个广告组中删除多个广告成员

Powershell-从多个广告组中删除多个广告成员,powershell,active-directory,Powershell,Active Directory,我经常需要从多个不同的组中删除多个不同的用户,到目前为止,我一直在使用dsmod命令脚本来完成这项工作。然而,我一直在尝试使用一些powershell魔法来升级,也许可以加快这个过程。我还需要脚本输出一个操作日志,要么一起输出成功,要么单独输出失败 我使用的输入文件是一个.csv,第一列是userid,第二列是group name。我正在使用的测试输入文件既有DiscriminatedName,也有简单的samaccountname,因此我可以看到它将如何接受输入。同样,我们在同一页上,我编辑了

我经常需要从多个不同的组中删除多个不同的用户,到目前为止,我一直在使用dsmod命令脚本来完成这项工作。然而,我一直在尝试使用一些powershell魔法来升级,也许可以加快这个过程。我还需要脚本输出一个操作日志,要么一起输出成功,要么单独输出失败

我使用的输入文件是一个.csv,第一列是userid,第二列是group name。我正在使用的测试输入文件既有DiscriminatedName,也有简单的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
一位同事提供了脚本的一个变体,建议部分问题可能在于我们的多域林,并从域2中的组中删除域1中的用户。脚本变体如下所示:

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文件的示例:

这很简单,可能和你想象的完全一样:

UserID,group
"cn=user1,dc=domain,dc=com","cn=group1,dc=domain,dc=com"
user1,group1
FindAll()方法的结果是SearchResultCollection类型,因为它可以包含多个用户

要在Remove ADGroupMember中使用,您需要获取目录条目或传递一些属性,如可分辨名称

标识可以是以下内容之一,根据:

您可以通过组的可分辨名称(DN)、GUID、安全标识符(SID)或安全帐户管理器(SAM)帐户名来标识组

例如:

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

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

但是,如果您在输入CSV中已经有DNs,并且不想显式检查组/用户是否存在,您可以使用DNs调用Remove ADGroupMember,如果对象不存在,则捕获错误。

您的CSV看起来像什么(我有一个很好的猜测)?给我们看几行?你确定那些DNs是正确的吗?用户和组是否放置在域的根目录中?这不是一个常见的场景…正如我在问题中所说的,我已经更改了DNs,用于您在这里看到的内容,仅用于示例目的。但是,我100%确信我使用的实际文件中的信息是正确的。