2017-10-09 183 views
1

我想要做的是採用超過90天的登錄名並將它們與Get-WmiObject Win32_UserProfile的輸出中的當前配置文件列表進行比較。我已經嘗試了幾個小時,但仍然無法弄清楚爲什麼它不處理名稱列表(我認爲)它應該。使用PowerShell按列表過濾輸出

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的該outlput含有如C的路徑:\用戶\ ADM-托馬斯和SID。 $List的輸出僅包含表達式。我試圖將$List中的「adm-thomas」匹配到「C:\ Users \ adm-thomas」LocalPath並在$List中對每個名稱進行測試。

回答

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 
} 
+0

我不知道分割路徑命令,因爲它完全消除了我遇到的問題。我只是將結果寫入列表中,部分原因是因爲所有這些都包含在'invoke-command'中,並且無論我的'select-object'如何,它都會提取PSComputerName和RunspaceId。這比我最初的嘗試要優雅得多,但我仍然可以理解,所以非常感謝! –

0

您可以使用FullPath財產Get-ChildItem,但它似乎更高效剛剛得到的Win32_UserProfileLastUseTime屬性相同的信息,然後整個命令可以只是一個過濾遠程WMI查詢。

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 

說明:我使用默認情況下通過WSMAN運行的CIM cmdlet。有一個Special財產擺脫除本地管理員以外的所有特殊用戶。然後,在管理員重命名的情況下,匹配SID更安全。

+0

我試着這最初但近一半的個人資料沒有「LastUseTime」。雖然這對於'特殊'屬性來說非常棒。 –