使用PowerShell按列表过滤输出

时间:2017-10-09 19:35:17

标签: powershell wmi

我要做的是获取超过90天的登录名,并将它们与Get-WmiObject Win32_UserProfile输出中的当前配置文件列表进行比较。我已经尝试了几个小时,我仍然无法弄清楚为什么它不处理名称列表(我认为)它应该。

Invoke-Command -ComputerName wsci201oit -ScriptBlock {
    $AllUsers = Get-WmiObject Win32_UserProfile | Where-Object -FilterScript {
        $_.LocalPath -notlike 'c:\windows*' -and
        $_.LocalPath -notlike '*ADMINISTRATOR' -and
        $_.LocalPath -notlike '*Public' -and
        $_.LocalPath -notlike '*Temp'
    } | Select-Object -Property LocalPath, SID

    $Over90 = Get-ChildItem C:\Users | where {
        $_.LastWriteTime -lt (Get-Date).AddDays(-30) -and
        $_.Name -notlike 'ADMINISTRATOR' -and
        $_.Name -notlike 'Public' -and
        $_.Name -notlike 'TEMP'
    } | Select-Object Name
    $Over90 | Select-Object Name | Out-File C:\Windows\Temp\Over90.txt
    $List = Get-Content -Path C:\Windows\Temp\Over90.txt

    $AllUsers | Where-Object { $_.LocalPath -like "*$List" }
}

$AllUsers的输出包含类似C:\ Users \ adm-thomas和SID的路径。 $List的输出仅包含adm-thomas。我试图将{adm}中的“adm-thomas”与“C:\ Users \ adm-thomas”LocalPath进行匹配,并针对$List中的每个名称进行测试。

2 个答案:

答案 0 :(得分:0)

您可以使用FullPath中的Get-ChildItem属性,但从LastUseTime的{​​{1}}属性获取相同的信息然后整个命令似乎更有效可以只是一个过滤的远程WMI查找。

Win32_UserProfile

注意:我使用的是默认情况下在WSMAN上运行的CIM cmdlet。除了本地管理员之外,还有一个Get-CimInstance Win32_UserProfile -ComputerName wsci201oit | Where-Object { $_.Special -eq $False -and $_.SID -notmatch '-500$' -and $_.LastUseTime -lt (Get-Date).AddDays(-30) } | Select-Object -ExpandProperty LocalPath, SID 属性可以删除所有特殊用户。然后,在重命名管理员的情况下,匹配SID更安全。

答案 1 :(得分:0)

您可能想要调整的第一件事是处理C:\Users的子文件夹。将子文件夹名称列表写入文件,然后在下一条指令中读取该文件是完全没有意义的。更糟糕的是,由于您没有删除表格标题,如果您碰巧拥有一个用户帐户"名称",您可能会误报。只需展开Name属性即可获取文件夹名称列表。您还可以通过根据要排除的名称列表检查名称来简化过滤。

$excludes  = 'ADMINISTRATOR', 'Public', 'TEMP'
$threshold = (Get-Date).AddDays(-30)
...
$List = Get-ChildItem C:\Users | Where-Object {
    $_.PSIsContainer -and
    $_.LastWriteTime -lt $threshold -and
    $exclude -notcontains $_.Name
} | Select-Object -Expand Name

然后,您想要调整从Win32_UserProfile课程中检索的数据。由于只有路径的叶子部分与后面的比较相关,所以使用calculated property来提取该信息:

... | Select-Object @{n='Username';e={Split-Path -Leaf $_.LocalPath}}, SID | ...

这样您就可以从上面对$List过滤结果:

Get-WmiObject Win32_UserProfile | Where-Object {
    $_.LocalPath -notlike 'c:\windows*'
} | Select-Object @{n='Username';e={Split-Path -Leaf $_.LocalPath}}, SID | Where-Object {
    $List -contains $_.Username
}