Powershell将用户添加到组中

我已经写了这个PS的位,以将用户从文本文件添加到用户input的AD。 它工作正常,除了if语句。 if语句应该检查组,以查看文本文件中的用户是否已经是组成员。 所以, $itemvariables被初始化为'jdoe', $membervariables被初始化为:

 $member=Get-ADGroupMember -identity $group | select SamAccountName 

问题成员将被初始化为@{SamAccountName=JDoe}@{SamAccountName=bsmith}等。基本上,所有成员都在一次犯规中并且用附加数据封装,从而模糊了用于比较的数据。 这是我的代码完整。 我将不胜感激任何帮助。 谢谢

 #User input group name $group=read-host -prompt "Enter group name:" #Loop through each item in text file foreach ($item in Get-Content C:\addusers.txt) { #If user is already a member of group... $member = Get-ADGroupMember -identity $group | select SamAccountName if ($member -eq $item) { Write-Host $item "is already a member of" $group } #add to group Add-ADGroupMember -Identity $group -Member $item } 

第一个问题是你的比较。 为$ member分配值的行将返回一个列表,而不是单个项目。 所以你基本上在testing中要问:“这个大单子是不是等于一个单子呢?” 这种情况永远不会是真的,除了也许组只有一个成员(我不知道你会得到一个单一的项目在这种情况下,或数组对象与一个成员)。

第二个问题是你对这个testing的结果没有做任何事情 – 即使用户已经在组中(假设你的testing写得正确),你仍然运行组添加。 为什么?

它也有很多开销,因为每次运行它时都会运行该组的内容的转储。 更好的办法是在foreach循环之外获取组成员一次,然后在foreach循环内的列表中使用数组search。 这不是一个问题,但可能值得修复。

PS – 您可以将用户添加到组中,即使他们已经是该组的成员。 所以你可能想要完全删除这个比较:

 foreach ($user in get-content $userspath) { Add-ADGroupMember -Identity $group -Member $user } 

编辑:如果你仍然想search组中的成员的存在,你可以这样做:

 $u = get-aduser $user -properties "memberof" if ($u.memberOf -contains (get-adgroup $group) ) ...