签入 Powershell 后将用户添加到 AD 组

Adding a User to AD group after checking in Powershell

我正在尝试检查我们在 AD 中的用户,看看他们是否属于某个组,如果他们不在组中,则将他们添加到组中。

我的脚本似乎不起作用。

*Import-Module ActiveDirectory

$Grpex26Month = "EX-Retention 26 Months"
$Grpex13Month = "EX-Retention 13 Months"

Function Check-IsGroupMember{

Param($user,$grp)

$strFilter = "(&(objectClass=Group)(name=" + $grp +"))"

$objDomain = New-Object System.DirectoryServices.DirectoryEntry
$objSearcher = New-Object System.DirectoryServices.DirectorySearcher
$objSearcher.SearchRoot = $objDomain
$objSearcher.PageSize = 1000
$objSearcher.Filter = $strFilter
$objSearcher.SearchScope = "Subtree"

$colResults = $objSearcher.FindOne()

$objItem = $colResults.Properties

([string]$objItem.member).contains($user)
}

$userList = get-aduser -f {surname -like 'm*'}

Foreach ($user in $userList) {
$Check = Check-IsGroupMember $user $grpex13month

If ($Check -eq 'False') {
Add-adgroupmember $grpex13month $user 
write-host $user.Name 
}
}*

现在这是我修改过的脚本,之前从一个组中删除并添加到另一个组中,但我认为上面的更改仍然可以。我目前也只搜索 'M',因为我知道这个部分中有一个用户需要这个。

甚至找不到该用户...这是我为所有用户获得的响应示例,除了首次编写此脚本后设置的新用户。

MLastName, FirstName 
Add-adgroupmember : The specified account name is already a member of the group
At \ServerName\DataUsers$\DKendall\Scripts\Exchange groupremoval.ps1:31 char:1
+ Add-adgroupmember $grpex13month $user
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (EX-Retention 13 Months:ADGroup)[Add-ADGroupMember], ADException
+ FullyQualifiedErrorId : ActiveDirectoryServer:1378,Microsoft.ActiveDirectory.Management.Commands.AddADGroupMember

为了进一步解释 Matt 的意思,问题在于此检查:

If ($Check -eq 'False') {

当要求 PowerShell 评估语句时,它会查看第一个对象的类型,并尝试将第二个对象转换为相同类型。在这种情况下 $Check[boolean] 意味着它的值是 $true$false。当您将其回显到主机时,PowerShell 格式化程序会将其转换为字符串以使其对用户友好,但这并不是对象的实际含义。

$Check = $false

$Check.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Boolean                                  System.ValueType

现在,正如 Matt 所说,任何长度大于 0 的字符串在转换为 [boolean] 时都将计算为 $true。所以 PowerShell 查看您的语句,发现 $Check[boolean] 并尝试将 'False' 转换为 [boolean] 以匹配它。由于 'False' 是长度超过 0 的字符串,因此它转换为 $true。现在我们知道 $Check = $false,并且由于它将您的字符串转换为 $true[boolean] 值,因此语句如下:

If ($false -eq $true) {

所以实际上,您的脚本正在做与您想要的完全相反的事情。解决方案包括:

If ($Check -eq $false) {

If (-Not $Check) {

或简化版(我会用的)

If(!$Check){