我写了这段 PS,将文本文件中的用户添加到用户输入的 AD 组中。除了语句之外,它工作正常if
。if 语句应该检查组以查看文本文件中的用户是否已经是组成员。因此,变量$item
用“jdoe”初始化,$member
变量初始化如下:
$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
}
答案1
第一个问题是您的比较。为 $member 赋值的那行返回的是列表,而不是单个项目。因此,您在测试中基本上是在问“这个大列表是否等于单个项目”。除非该组只有一个成员(我不确定在这种情况下您会得到单个项目还是只有一个成员的数组对象),否则该条件永远不会成立。
第二个问题是,您不会对该测试的结果执行任何操作 - 即使用户已在组中,您仍会运行组添加(假设您的测试编写正确)。为什么?
它还有很多开销,因为每次运行时它都会运行组内容的转储。更好的方法是在 foreach 循环之外获取组成员一次,然后在 foreach 循环内对该列表使用数组搜索。这不是什么大问题,但可能值得修复。
PS--即使用户已经是该组的成员,您也可以将其添加到组中。因此,您可能希望完全删除此比较:
foreach ($user in get-content $userspath) {
Add-ADGroupMember -Identity $group -Member $user
}
编辑:如果您仍想搜索组中成员的存在,您可以这样做:
$u = get-aduser $user -properties "memberof"
if ($u.memberOf -contains (get-adgroup $group) )
...