gpt4 book ai didi

powershell - 可以测试变量是否仅包含特定值?

转载 作者:行者123 更新时间:2023-12-02 23:58:20 25 4
gpt4 key购买 nike

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

是否有运算符(operator)可以检查这是否是唯一存在的值?我的脚本可能有点奇怪,因为它不是针对对象进行测试,而是针对对象值的字符串等价物进行测试,所以这可能是我的问题所在。我不太确定。脚本的部分输出如下。我这样做是因为这是我可以比较组名的唯一方法。当我尝试比较 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

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

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

最佳答案

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

$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 {
...
}

关于powershell - 可以测试变量是否仅包含特定值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37263740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com