可以测试变量是否只包含特定值?

时间:2016-05-16 21:43:02

标签: powershell

我正在编写一个脚本,将AD用户的组成员身份与现有列表进行比较。我要检查的一件事是,如果用户不属于列表中的任何组,并且只属于默认的"域用户"所有域用户都属于的组,然后它应该输出一条消息," TestUser01不是任何组的成员"

是否有运营商可以检查这是否是唯一存在的值?我的脚本可能有点奇怪,因为它没有测试对象,而是对象值的字符串,所以这可能是我的问题所在。我不太确定。脚本的部分输出如下。我是这样做的,因为这是我比较组名的唯一方法。当我尝试比较object.name值时,我无法使其工作:

#gets a list of all groups in a given OU and stores the objects in the $groups variable
$groups = Get-ADGroup -Filter * -SearchBase 'OU=TUNE_TEST_GROUPS,OU=TUNE_TEST,DC=tune,DC=priv' -Properties name | select name

#pipe each group object into a foreach loop and output a string value of the same group name and stores it into the $groups_string variable
$groups_string = $groups | % {$_.name}


#gets a list of all users in a given OU and stores the objects in the $users variable
$users = Get-ADUser -Filter * -SearchBase 'OU=TUNE_TEST_USERS,OU=TUNE_TEST,DC=tune,DC=priv'

#hash table containing the $table properties
$props=@{
"Username" = ""
"Groupname" = ""
}

#empty array to store each user/group output object
$table=@()

#iterates through every user in the $users variable and retrieves their group memberships
foreach ($user in $users) {
    #selects each group name and stores it in the $groupMembership variable
    $groupMembership = Get-ADPrincipalGroupMembership $user | select name

    #compares the names of each user's group to the baseline group name.
    $groupMembership | foreach ($_) {

        #If there is a match add the group name and the username to the $results hash table
        if ($groups_string -contains $_.name) {

            $props."Groupname" = $_.name
            $props."Username" = $user.Name

            #create a new PS object and supply the properties of the $results hash table to each object
            $objresults = New-Object psobject -Property $props

            #add each object to the $table array
            $table += $objresults
        }


    }     
}

#display/output the $table array and format it to fit 
$table | ft -AutoSize 

我已经删除了其他声明,因为那是我目前要弄清楚的。现在,我只能在匹配时输出用户名和组名。我需要完成/弄清楚的是,使我的其他测试用户不属于除域用户组之外的任何组,在报告中显示为不属于任何主要组的一部分。在我的测试期间,我能够实现这一目标的唯一时间是我的其他测试用户也会出现相同的消息。这对于查看报告的人没有意义,因为那些测试用户确实属于主组列表中的组,但是因为他们是域用户的一部分,所以输出一个对象说他们是当它遍历Domain Users组时,不是任何主要组的一部分。

我使用了一些不同的比较运算符组合,却无法正常工作。任何建议将不胜感激。

2 个答案:

答案 0 :(得分:1)

使用Compare-Object就像我在回复您的previous question时告诉您的那样,展开InputObject属性以获取两个数组中相同的(组)对象,然后展开对象'Name财产。

$common = Compare-Object $userGroups $groups -IncludeEqual -ExcludeDifferent |
          Select-Object -Expand InputObject |
          Select-Object -Expand Name

现在,您可以检查结果是否仅包含名称Domain Users,如下所示:

if ($common -contains 'Domain Users' -and $common.Count -eq 1) {
  ...
} else {
  ...
}

或者像这样:

if ($common.GetType().Name -eq 'String' -and $common -eq 'Domain Users') {
  ...
} else {
  ...
}

您也可以从列表中选择第一个对象的名称:

$common = Compare-Object $userGroups $groups -IncludeEqual -ExcludeDifferent |
          Select-Object -Expand InputObject |
          Select-Object -First 1 -Expand Name

if ($common -eq 'Domain Users') {
  ...
} else {
  ...
}

答案 1 :(得分:0)

谢谢Ansgar。我试过你的建议的变化,我无法让它为我需要的工作。我最后将原始脚本的一部分与上面发布的脚本混合在一起,然后出现了以下脚本:

#queries all groups in a specified OU
$groups = Get-ADGroup -Filter * -SearchBase 'OU=TUNE_TEST_GROUPS,OU=TUNE_TEST,DC=tune,DC=priv'

#iterates through each group object and outputs just the string value of the name property
$groups_string = $groups | % {$_.name}

#queries all users in a specified OU
$users = Get-ADUser -Filter * -SearchBase 'OU=TUNE_TEST_USERS,OU=TUNE_TEST,DC=tune,DC=priv'



foreach ( $user in $users ) {
    #iterates through each user, find their group memberships, and outputs just the name property value
    $userGroups =  Get-ADPrincipalGroupMembership $user | select name

    #if user belongs to more than one group, add following string
    if ( $userGroups.Count -gt 1){
        "{0} is a member of the following groups:" -f $user.SamAccountName

        #iterates through each group, if group name matches group name in original query, output the matching group name
        $userGroups | foreach ($_) {
        if ($groups_string -contains $_.name){
            "`t{0}" -f $_.Name}        
        }
    } 

    #if user belongs to 1 or lesser groups perform the next check
    elseif ( $userGroups.Count -le 1 ) {

        #iterates through each group, if group name in check matches "Domain Users", output string saying user doesn't belong to any groups
        $userGroups | foreach ($_) {
        if ($_.name -contains "Domain Users") {    
            "{0} is not a member of any groups" -f $user.SamAccountName}
        }
    }
}

这实际上适用于我需要的东西。我能够通过将一些测试用户添加到我正在查询的基本OU中的不同组中进行测试。我可以确认它只输出我关心的组,那些与基线查询中的组匹配的组。它还允许我输出一条消息,说明当用户只是默认域用户组的一部分时,用户不属于任何基准组,并且它还排除了此检查中属于其他用户的其他用户。域用户默认情况下也属于基线检查上的组。为感兴趣的人发布最终脚本。