Powershell 根据上次登录删除 Cim 实例

问题描述 投票:0回答:1

我能够将命令输出到变量中

$logins=Get-WmiObject -Class Win32_NetworkLoginProfile | Sort-Object -Property LastLogon -Descending | Select-Object -Property * -First 20 | Where-Object {$_.LastLogon -match "(\d{14})"} | Foreach-Object { New-Object PSObject -Property @{ Name=$_.Name;LastLogon=[datetime]::ParseExact($matches[0], "yyyyMMdd", $null)}}

当 $logins 输入到 powershell 中时,我得到这个输出

LastLogon            Name
---------            ----
5/8/2024 1:44:08 PM  Domain\User1
5/8/2024 11:54:31 AM Domain\User2
5/8/2024 11:54:22 AM Domain\User3
5/7/2024 6:52:06 PM  Local\Administrator
4/17/2024 3:21:03 PM Domain\User4
3/4/2024 6:23:11 PM  Domain\User5
1/25/2024 9:20:42 AM Domain\User6

我正在尝试根据用户上次登录的情况删除用户。目前我正在努力使用 ForEach 命令。我收到的错误是管道的输出不能为空。这意味着我的第一个命令没有输出。

Foreach ($name in $logins) { Where $_.LastLogon -lt (get-date).adddays(-30)} | Remove-CimInstance -Verbose -Confirm:$true `

我发现删除旧配置文件的lastusetime和lastwritetime不可靠,因为它会删除当前仍在使用的配置文件。使用 Get-WmiObject 的 LastLoginTime 是删除旧配置文件的更可靠数据。

我尝试将 foreach 中的 LastLogin 变量更改为 $LastLogin。我不知道我还可以在此 ForEach 中更改什么才能使其正常工作。

powershell foreach
1个回答
0
投票

在本例中,您尝试从 语言关键字

foreach
传输输出,但这是不可能的。撇开这一点不谈,使用
Where
(
Where-Object
) 在那里是不正确的。您的意图很可能是:

$logins | Where-Object { $_.LastLogon -LT (Get-Date).AddDays(-30) } | ...

但这也可能会失败,因为您试图将自定义对象(从

Select-Object
输出)传输到
Remove-CimInstance
,并且该 cmdlet 不知道如何处理它,从而给您带来新的错误。

因此,首先,在此处使用

Get-CimInstance
而不是
Get-WmiObject
(此 cmdlet 甚至不存在于较新版本的 PowerShell 中),此外,
.LastLogon
将已被解析为带有
DateTime
Get-CimInstance
,从而简化的过程。

# get the profiles with logon older than 30 days
$logins = Get-CimInstance -Class Win32_NetworkLoginProfile |
    Where-Object { $_.LastLogon -LT (Get-Date).AddDays(-30) }

# display their LastLogon and Name to the console
$logins | Select-Object LastLogon, Name

# and then delete them
$logins | Remove-CimInstance -Verbose -Confirm:$true
© www.soinside.com 2019 - 2024. All rights reserved.