Powershell - 测试用户是否属于任何组
Powershell - Test if user is part of any Groups
我无法让 PS 小脚本按我想要的方式工作。
Powershell 版本:5.1
最终目标:我想解析所有现有的本地用户帐户并生成不属于任何本地组的帐户的列表。 (这不是 AD 环境,也不是域的一部分。这只是本地 OS 帐户和组。)另外,我只对我手动创建的组感兴趣 - 我不关心默认系统组。 (稍后会详细介绍我如何尝试实现这一点。)然后,在我让这部分工作之后,这个输出(用户名列表)将被用作(在未来 - 未在此代码中显示)作为另一个输入将这些不在组中的用户添加到组中的块。
我找到了一段代码示例 - 它有效,并生成了正确的用户名集。但它很慢 - 花了 > 5 分钟。所以我想要更快的东西。
我现在使用的方法通常看起来会奏效,而且速度非常快。我只是无法正确限制它。似乎我在引用 cmdlet 返回的对象的属性时遇到了问题。 (再往下看代码。这里也有各种计数器和写主机步骤,它们纯粹是为了帮助我了解正在发生的事情和调试 - 实际任务不需要它们。)
我将如何处理这件事的大纲:
编译所有组中所有用户的列表
- 但是,我只想要没有描述的组 - 这些是我在机器上创建的组。 OS 个默认组都有一个描述。这将帮助我缩小用户列表的范围。
遍历系统上所有用户的列表
- 将每个用户与第 1 步中的列表进行比较
- 如果用户在列表中,则该用户在组中,因此跳过它
- 如果用户不在列表中,则save/report返回该名称
[旁注 - 用户 'WDAGUtilityAccount' 结果也不在任何组中,但我不想更改那个组;所以有一个特定的测试将它从列表中排除。]
[原版代码]
# --- Part 1
$UsersList = foreach ( $aGroup in get-localgroup ) {
$groupcount++
# Only want Groups that don't have a Description
if ( $null -eq $aGroup.Description ) {
Get-LocalGroupMember $aGroup.name
}
write-host "$groupCount -- $aGroup.Name _ $aGroup.Description"
}
# Just for debugging - to see the content of Part 1
write-host "List = $UsersList"
# ---- Part 2
Get-LocalUser | ForEach-Object {
$count++
$name = $_.Name
if ( $name -eq "WDAGUtilityAccount" ) {
# nothing - skip this one
} elseif ( $UsersList.Name -inotcontains "$env:COMPUTERNAME$_" ) {
$count2++
write-host "$Count ($Count2) : $name -- not a part of any groups"
}
}
我在第 1 部分中提取组属性的尝试似乎失败了 - 我得到的是文字文本 'Name' 和 'Description',而不是 aGroup.Name aGroup.Description 属性 个值。所以我的输出看起来像“MyGroup1.Name”而不是“MyGroup1”(假设组的实际名称是'MyGroup1')。
我相信我正在正确地接近 'Group' 对象 - 当我执行 'get-localgroup | get-member" 它说它是一个 'LocalGroup' 对象,具有各种属性(名称和描述是其中的两个)。
可能还有许多其他方法 - 我想听听一般的想法;但我也想知道我当前代码的具体问题——这是一个学习练习。 :)
谢谢,J
[代码的版本 2 - 经过一些建议...]
$UsersList = foreach ( $aGroup in get-localgroup ) {
$groupcount++
#Write-Host $aGroup.Description
# Only want Groups that don't have a Description (i.e. are the Groups that we created, not the default System/OS groups)
if ( $null -eq $($aGroup.Description) ) {
$UserList += Get-LocalGroupMember $($aGroup.name)
write-host "$groupCount -- $($aGroup.Name) _ $($aGroup.Description)"
}
}
write-host "List = $UsersList"
Get-LocalUser | ForEach-Object {
$count++
$name = $_.Name
if ( $name -eq "WDAGUtilityAccount" ) {
# nothing - skip this one
} elseif ( $($UsersList.name) -inotcontains "$env:COMPUTERNAME$_" ) {
$count2++
write-host "$Count ($Count2) : $name -- not a part of any groups"
}
}
我相信这可以简化为:
- 存储任何组的所有成员,其中组的
Description
为空。
- 获取所有本地用户并过滤其用户的 Name 不等于
WDAGUtilityAccount
且他们不属于存储成员的 SID
数组的部分。
$members = Get-LocalGroup | Where-Object { -not $_.Description } | Get-LocalGroupMember
Get-LocalUser | Where-Object {
$_.Name -ne 'WDAGUtilityAccount' -and $_.SID -notin $members.SID
} | Format-Table -AutoSize
我无法让 PS 小脚本按我想要的方式工作。
Powershell 版本:5.1
最终目标:我想解析所有现有的本地用户帐户并生成不属于任何本地组的帐户的列表。 (这不是 AD 环境,也不是域的一部分。这只是本地 OS 帐户和组。)另外,我只对我手动创建的组感兴趣 - 我不关心默认系统组。 (稍后会详细介绍我如何尝试实现这一点。)然后,在我让这部分工作之后,这个输出(用户名列表)将被用作(在未来 - 未在此代码中显示)作为另一个输入将这些不在组中的用户添加到组中的块。
我找到了一段代码示例 - 它有效,并生成了正确的用户名集。但它很慢 - 花了 > 5 分钟。所以我想要更快的东西。
我现在使用的方法通常看起来会奏效,而且速度非常快。我只是无法正确限制它。似乎我在引用 cmdlet 返回的对象的属性时遇到了问题。 (再往下看代码。这里也有各种计数器和写主机步骤,它们纯粹是为了帮助我了解正在发生的事情和调试 - 实际任务不需要它们。)
我将如何处理这件事的大纲:
编译所有组中所有用户的列表
- 但是,我只想要没有描述的组 - 这些是我在机器上创建的组。 OS 个默认组都有一个描述。这将帮助我缩小用户列表的范围。
遍历系统上所有用户的列表
- 将每个用户与第 1 步中的列表进行比较
- 如果用户在列表中,则该用户在组中,因此跳过它
- 如果用户不在列表中,则save/report返回该名称 [旁注 - 用户 'WDAGUtilityAccount' 结果也不在任何组中,但我不想更改那个组;所以有一个特定的测试将它从列表中排除。]
[原版代码]
# --- Part 1
$UsersList = foreach ( $aGroup in get-localgroup ) {
$groupcount++
# Only want Groups that don't have a Description
if ( $null -eq $aGroup.Description ) {
Get-LocalGroupMember $aGroup.name
}
write-host "$groupCount -- $aGroup.Name _ $aGroup.Description"
}
# Just for debugging - to see the content of Part 1
write-host "List = $UsersList"
# ---- Part 2
Get-LocalUser | ForEach-Object {
$count++
$name = $_.Name
if ( $name -eq "WDAGUtilityAccount" ) {
# nothing - skip this one
} elseif ( $UsersList.Name -inotcontains "$env:COMPUTERNAME$_" ) {
$count2++
write-host "$Count ($Count2) : $name -- not a part of any groups"
}
}
我在第 1 部分中提取组属性的尝试似乎失败了 - 我得到的是文字文本 'Name' 和 'Description',而不是 aGroup.Name aGroup.Description 属性 个值。所以我的输出看起来像“MyGroup1.Name”而不是“MyGroup1”(假设组的实际名称是'MyGroup1')。
我相信我正在正确地接近 'Group' 对象 - 当我执行 'get-localgroup | get-member" 它说它是一个 'LocalGroup' 对象,具有各种属性(名称和描述是其中的两个)。
可能还有许多其他方法 - 我想听听一般的想法;但我也想知道我当前代码的具体问题——这是一个学习练习。 :)
谢谢,J
[代码的版本 2 - 经过一些建议...]
$UsersList = foreach ( $aGroup in get-localgroup ) {
$groupcount++
#Write-Host $aGroup.Description
# Only want Groups that don't have a Description (i.e. are the Groups that we created, not the default System/OS groups)
if ( $null -eq $($aGroup.Description) ) {
$UserList += Get-LocalGroupMember $($aGroup.name)
write-host "$groupCount -- $($aGroup.Name) _ $($aGroup.Description)"
}
}
write-host "List = $UsersList"
Get-LocalUser | ForEach-Object {
$count++
$name = $_.Name
if ( $name -eq "WDAGUtilityAccount" ) {
# nothing - skip this one
} elseif ( $($UsersList.name) -inotcontains "$env:COMPUTERNAME$_" ) {
$count2++
write-host "$Count ($Count2) : $name -- not a part of any groups"
}
}
我相信这可以简化为:
- 存储任何组的所有成员,其中组的
Description
为空。 - 获取所有本地用户并过滤其用户的 Name 不等于
WDAGUtilityAccount
且他们不属于存储成员的SID
数组的部分。
$members = Get-LocalGroup | Where-Object { -not $_.Description } | Get-LocalGroupMember
Get-LocalUser | Where-Object {
$_.Name -ne 'WDAGUtilityAccount' -and $_.SID -notin $members.SID
} | Format-Table -AutoSize