我要做的是获取超过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
中的每个名称进行测试。
答案 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
}