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

时间:2015-11-19 11:47:15

标签: powershell active-directory addition active-directory-group

我试图检查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

1 个答案:

答案 0 :(得分:0)

为了解释Matt的更多内容,问题在于检查:

If ($Check -eq 'False') {

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

$Check = $false

$Check.GetType()

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

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

If ($false -eq $true) {

因此,实际上,您的脚本与您想要的完全相反。解决方案包括:

If ($Check -eq $false) {

If (-Not $Check) {

或缩短的版本(我将使用的)

If(!$Check){