PowerShell 5.1约束模式下If语句用户组判断失效问题
问题:PowerShell 5.1受限模式下检查域用户组归属异常问题
我在受限语言模式下使用PowerShell 5.1,无法访问额外模块。通过net user <username> /domain获取域用户信息,想判断用户是否不属于特定全局组,但If语句工作异常:第2段代码仅对全局组成员列表中首个出现的特定组有效,若目标组在列表后续位置,明明用户属于该组,脚本仍返回“用户不属于该组”。
尝试过的代码片段
- 初始版本
$enduser = read-host "please enter username" Net user query $enduser /domain $u = @{}; net user $enduser /domain | ConvertFrom-String -Delimiter '\s{2,}' -PropertyNames Name, Value | ForEach-Object { $u[$_.Name] = $_.Value } $globalgroups = $u_.'global group memberships' if ($globalgroups) -inotlike '$_.EXAMPLEGROUPNAME' { write-output "user is not part of EXAMPLEGROUP" }
- 调整匹配规则版本
if ($globalgroups) -inotlike '*EXAMPLEGROUPNAME*' { write-output "user is not part of EXAMPLEGROUP" }
- 新增变量版本
$EXAMPLEGROUP1 = { $u[$_.'global group memberships'] = $_.'EXAMPLEGROUPNAME' } $EXAMPLEGROUPtest = { $u[$_.'global group memberships'] = $_.'value' } if ($globalgroups) -inotlike '$examplegroup1' { write-output "user is not part of EXAMPLEGROUP" }
解决方案及修改说明
问题根源
ConvertFrom-String处理net user输出时,global group memberships对应的Value是包含所有组的单个字符串(组之间用逗号+空格分隔)。直接用-notlike匹配时,只有当目标组名在字符串开头时才能被正确识别,后续组因前面有其他内容导致匹配失败。
修改后的代码
$enduser = Read-Host "请输入用户名" # 获取域用户信息并转换为哈希表 $u = @{} net user $enduser /domain | ConvertFrom-String -Delimiter '\s{2,}' -PropertyNames Name, Value | ForEach-Object { $u[$_.Name] = $_.Value } # 提取全局组成员列表,分割为独立组名的数组 $globalGroups = $u['global group memberships'] -split ', ' # 判断用户是否不属于目标组 if ($globalGroups -notcontains 'EXAMPLEGROUPNAME') { Write-Output "用户不属于EXAMPLEGROUP组" }
关键修改点
- 分割组字符串为数组:用
-split ', '将包含所有组的长字符串拆分为单个组名的数组,消除组位置对匹配的影响 - 改用精准匹配运算符:使用
-notcontains直接检查数组中是否存在目标组名,比模糊匹配的-notlike更准确 - 修正变量名错误:原代码中
$u_是笔误,改为正确的哈希表变量$u
注意事项
- 确保
EXAMPLEGROUPNAME与net user输出中的组名完全一致(PowerShell默认不区分大小写,如需严格匹配可改用-cnotcontains) - 受限模式下
-split、-notcontains等基础运算符均可用,无需额外模块
内容的提问来源于stack exchange,提问作者helpdeskrat96
相关产品推荐
相关产品推荐

