2017-10-09 4 views
1

Ce que j'essaie de faire, c'est de prendre les noms de connexion qui datent de plus de 90 jours et de les comparer à la liste des profils courants en sortie de Get-WmiObject Win32_UserProfile. J'ai essayé pendant ce qui semble être des heures et je n'arrive toujours pas à comprendre pourquoi il ne traite pas la liste de noms comme (je pense) il devrait le faire.Filtrage de la sortie par une liste avec 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" } 
} 

Le outlput de $AllUsers contient un chemin comme C: \ Users \ adm-Thomas et le SID. La sortie de $List contient juste adm-thomas. J'essaye de faire correspondre les "adm-thomas" de $List au LocalPath "C: \ Users \ adm-thomas" et de tester contre chaque nom dans $List.

Répondre

0

La première chose à régler est la gestion des sous-dossiers de C:\Users. Ecrire la liste des noms de sous-dossiers dans un fichier, puis lire ce fichier dans l'instruction suivante, est complètement inutile. Pire, puisque vous ne supprimez pas l'en-tête de la table, vous pouvez obtenir un faux positif si vous avez un nom d'utilisateur "nom". Développez simplement la propriété Name pour obtenir la liste des noms de dossier. Vous pouvez également simplifier le filtrage en vérifiant le nom par rapport à une liste de noms à exclure.

$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 

Ensuite, vous aurez envie d'ajuster les données que vous récupérez de la classe Win32_UserProfile. Étant donné que seule la partie de la feuille du chemin est pertinent pour la comparaison ultérieure utiliser un calculated property pour extraire simplement cette information:

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

De cette façon, vous pouvez filtrer le résultat contre $List d'en haut:

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

Je n'étais pas au courant de la commande split-path car cela éliminait complètement le problème que j'avais. J'ai seulement écrit les résultats dans une liste en partie par frustration et en partie parce que tout ceci est contenu dans une invocation-commande et cela tirerait PSComputerName et RunspaceId indépendamment de mon 'select-object'. C'est beaucoup plus élégant que mon essai original mais je peux encore le comprendre alors merci beaucoup! –

0

Vous pouvez utiliser la propriété de FullPathGet-ChildItem, mais il semble plus efficace pour obtenir exactement les mêmes informations de la propriété LastUseTime de Win32_UserProfile puis toute la commande peut être juste une recherche WMI à distance filtrée.

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 

Notes: J'ai utilisé les cmdlets CIM qui fonctionnent sur WSMAN par défaut. Il existe une propriété Special qui se débarrasse de tous les utilisateurs spéciaux à l'exception de l'administrateur local. La correspondance du SID est alors plus sûre si l'administrateur a été renommé.

+0

J'ai essayé initialement, mais presque la moitié de mes profils n'avaient pas de "LastUseTime". C'est plutôt génial à propos de la propriété 'Special'. –