PowerShell数组对比:匹配Loginname时检测SID/密码哈希差异
PowerShell数组对比问题
我有两个需要对比的PowerShell数组:
Array1:
Srvname Loginname sid passwordhash Srv1 L1 0xdbc 0xfsfhdfh Srv2 L2 0xdbe 0xfsfhdfe Srv3 L3 0xdbc 0xfsfhdfd
Array2:
Srvname Loginname sid passwordhash Srv1 L1 0xdbd 0xfsfhdfh Srv2 L2 0xdbe 0xfsfhdfh Srv3 L3 0xdba 0xfsfhdfb
需求是:仅当同一Loginname对应的sid、passwordhash其中一个或两者不匹配时输出结果,输出格式如下:
Srvname Loginname Srvname2 Loginname2 Mismatch Srv1 L1 Srv1 L1 sid Srv2 L2 Srv2 L2 password Srv3 L3 Srv3 L3 sid and password
我尝试了下面的代码但无效,求正确代码:
$output += $T2 | ForEach-Object { $r = $_ $T1 | Where-Object { $_.LoginName -eq $r.LoginName -and ($_.SId -ne $r.SId -or $_.PasswordHash -ne $r.PasswordHash) } | Select-Object @{Name = 'SrvName'; Expression = { $_.srvname }}, $_.LoginName, @{Name = 'SrvName2'; Expression = { $r.srvname } }, @{Name = 'LogiName2'; Expression = { $r.LoginName }}, @{Name = 'Mismatch'; Expression = { 'sid or password' }} }
正确代码实现
# 假设$Array1和$Array2是你的两个输入数组 $output = foreach ($item2 in $Array2) { # 根据LoginName匹配Array1中的对应项 $item1 = $Array1 | Where-Object { $_.Loginname -eq $item2.Loginname } | Select-Object -First 1 if ($item1) { $mismatchReasons = @() # 检查sid是否不匹配 if ($item1.sid -ne $item2.sid) { $mismatchReasons += 'sid' } # 检查passwordhash是否不匹配 if ($item1.passwordhash -ne $item2.passwordhash) { $mismatchReasons += 'password' } # 如果有不匹配项,构造输出对象 if ($mismatchReasons.Count -gt 0) { [PSCustomObject]@{ Srvname = $item1.Srvname Loginname = $item1.Loginname Srvname2 = $item2.Srvname Loginname2 = $item2.Loginname Mismatch = $mismatchReasons -join ' and ' } } } } # 输出结果 $output
代码说明
- 遍历
$Array2的每一项,通过Loginname精准匹配$Array1中的对应条目 - 分别检查
sid和passwordhash的匹配状态,收集不匹配的具体原因 - 根据实际不匹配情况,动态拼接
Mismatch字段的内容(单个或多个原因) - 仅当存在不匹配项时,生成符合要求格式的输出对象
内容的提问来源于stack exchange,提问作者SQLPRODDBA
相关产品推荐
相关产品推荐

