从列表中仅选择一个用户
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
我有这个脚本,我需要用它从服务器列表中检索特定用户“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