You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

代码说明

  1. 遍历$Array2的每一项,通过Loginname精准匹配$Array1中的对应条目
  2. 分别检查sid和passwordhash的匹配状态,收集不匹配的具体原因
  3. 根据实际不匹配情况,动态拼接Mismatch字段的内容(单个或多个原因)
  4. 仅当存在不匹配项时,生成符合要求格式的输出对象

内容的提问来源于stack exchange,提问作者SQLPRODDBA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 13:52:36