从列表中仅选择一个用户

Selection of only one user from list

我有这个脚本,我需要用它从服务器列表中检索特定用户“ADTuser”的数据该脚本运行良好,但我的用户的输出文件还添加了其他用户的详细信息,即我的最终输出不需要如何将其过滤到我需要的用户。

get-content C:\servers.txt | foreach-object { 
    $Comp = $_ 
    if (test-connection -computername $Comp -count 1 -quiet) { 
        ([ADSI]"WinNT://$comp").Children | ?{$_.SchemaClassName -eq 'user' } | %{ 
            $groups = $_.Groups() | %{$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)} 
            $_ | Select @{n='Computername';e={$comp}}, 
            @{n='UserName';e={$_.Name}}, 
            @{n='Memberof';e={$groups -join ';'}},
            @{n='status'; e={if($groups -like "*Administrators*"){$true} else{$false}}}
        }  
    } Else {Write-Warning "Server '$Comp' is Unreachable hence Could not fetch data"} 
} | Out-File -FilePath C:\users.txt

这应该是一种更简单的方法来完成您正在寻找的事情,Get-CimInstance and Get-CimAssociatedInstance 自 PowerShell 3 以来就已经存在:

Get-Content C:\servers.txt | ForEach-Object {
    $computer = $_
    try {
        $query = Get-CimInstance Win32_UserAccount -Filter "Name='ADTuser'" -ComputerName $_ -ErrorAction Stop
        foreach($object in $query) {
            $membership = Get-CimAssociatedInstance -InputObject $object -ResultClassName Win32_Group -ComputerName $_

            [pscustomobject]@{
                Computername = $_
                UserName     = $object.Name
                Memberof     = $membership.Name -join ';'
                Status       = $membership.Name -contains 'Administrators'
            }
        }
    }
    catch {
        Write-Warning "Server '$computer' is Unreachable hence Could not fetch data"
    }
} | Export-Csv C:\users.csv -NoTypeInformation

如果这对您不起作用,您的代码需要对第一个过滤语句进行简单修改:

Where-Object { $_.SchemaClassName -eq 'user' -and $_.Name.Value -eq 'ADTuser' }

重要的是要注意 Test-Connection -ComputerName $_ -Count 1 -Quiet 不是此脚本的相关测试,此命令正在测试 ICMP 响应和 adsi 超过 WinNT requires RPC connectivity as well SMB

将所有内容与小的改进放在一起,脚本将如下所示:

Get-Content C:\servers.txt | ForEach-Object {
    if (-not (Test-Connection -ComputerName $_ -Count 1 -Quiet)) {
        Write-Warning "Server '$_' is Unreachable hence Could not fetch data"
        return
    }
    
    $computer = $_
    ([adsi]"WinNT://$_").Children.ForEach{ 
        if($_.SchemaClassName -ne 'user' -and $_.Name.Value -ne 'ADTuser') {
            return
        }
        
        $groups = $_.Groups().ForEach([adsi]).Name
        
        [pscustomobject]@{
            Computername = $computer
            UserName     = $_.Name.Value
            Memberof     = $groups -join ';'
            Status       = $groups -contains 'Administrators'
        }
    }
} | Export-Csv C:\users.csv -NoTypeInformation