Far*_*shi 1 windows powershell windows-10
我正在尝试创建一个 powershell 脚本,如果帐户在一定天数后尚未登录到工作站 Windows 10 上,则会删除帐户。
该脚本将在本地运行,而不是远程运行。我认为 iam 非常接近解决方案,但出于某种原因,即使我按照@microsoft 的文档显示的那样操作,iam 也无法使用参数 inputobject 删除帐户。
例如,我尝试删除帐户 3 和 2,因为它们具有相似的 LastUseTime 日期。
帐户 - 最后使用时间
testuser3 - 20190625
testuser2 - 20190625
testuser1 - 20190629
Run Code Online (Sandbox Code Playgroud)
代码 :
<# Change Value to remove account after a certain days #>
$DaysFilterAccounts = (get-date (Get-Date).AddDays(-6) -UFormat "%Y%m%d")
<# $CheckLastUseTime
Get all UserProfiles, Filter Service and Admin-accounts
Select and convert LastUsetime to a date object
Where only accounts lastusetime is Less Or Equal to $DaysFilterAccounts
#>
$CheckLastUseTime = Get-CimInstance -Filter "Special=False AND Loaded=False" -ClassName Win32_UserProfile |
Select-Object @{Name="LastUseTime";Expression={Get-Date $_.Lastusetime -Format "yyyyMMdd" } } |
Where-Object { $_.LastUseTime -Le $DaysFilterAccounts }
<# Create a String for Lastusetime #>
$AccountLastUseTime = $CheckLastUseTime.Lastusetime
<#
ForEach-Object In $GetProfiles If .LastUsetime is Less Or Equal to $DaysFilterAccounts
Then Get the UserProfile Data And
Remove Profiledata
#>
If ( $AccountLastUseTime -Le $DaysFilterAccounts )
{
$RemoveTheseAccounts = Get-CimInstance -Filter "Special=False AND Loaded=False" -ClassName Win32_UserProfile |
Select-Object Sid, Localpath, @{Name="LastUseTime";Expression={Get-Date $_.Lastusetime -Format "yyyyMMdd" }} |
Where-Object { $_.LastUseTime -Le $DaysFilterAccounts }
Remove-CimInstance -InputObject $RemoveTheseAccounts
} Else { Write-Warning -Message "Error" }
Run Code Online (Sandbox Code Playgroud)
错误混乱:
Remove-CimInstance : Cannot convert 'System.Object[]' to the type 'Microsoft.Management.Infrastructure.CimInstance'
required by parameter 'InputObject'. Specified method is not supported.
At C:\Users\fardin.TEST\Desktop\Rolf v 3.ps1:52 char:39
+ Remove-CimInstance -InputObject $RemoveTheseAccounts
+ ~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Remove-CimInstance], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgument,Microsoft.Management.Infrastructure.CimCmdlets.RemoveCimInstanceCommand
Run Code Online (Sandbox Code Playgroud)
解决方案:
<# Change Value to remove account after a certain days #>
$DaysFilterAccounts = (get-date (Get-Date).AddDays(-180) -UFormat "%Y%m%d")
<# $CheckLastUseTime
Get all UserProfiles, Filter Service and Admin-accounts
Select and convert LastUsetime to a date object
Where only accounts lastusetime is Less Or Equal to $DaysFilterAccounts
#>
$CheckLastUseTime = Get-CimInstance -Filter "Special=False AND Loaded=False" -ClassName Win32_UserProfile |
Select-Object @{Name="LastUseTime";Expression={Get-Date $_.Lastusetime -Format "yyyyMMdd" } } |
Where-Object { $_.LastUseTime -Le $DaysFilterAccounts }
<# Create a String for Lastusetime #>
$AccountLastUseTime = $CheckLastUseTime.Lastusetime
<#
ForEach-Object In $GetProfiles If .LastUsetime is Less Or Equal to $DaysFilterAccounts
Then Get the UserProfile Data And
Remove Profiledata
#>
If ( $AccountLastUseTime -Le $DaysFilterAccounts )
{
# Remove Profiles
$GetUserProfileData = Get-WmiObject -Class Win32_UserProfile -Filter "Special=False AND Loaded=False" |
Where { $_.LastUseTime -Le $DaysFilterAccounts }
$GetUserProfileData | Remove-WmiObject
} Else { Write-Warning -Message "Error" }
Run Code Online (Sandbox Code Playgroud)
这里有一点解释,教人钓鱼等。按照惯例:InputObject属性指的是管道中的当前属性,通常意味着您应该通过管道输入对象。运行会Get-Help Remove-CimInstance -Parameter InputObject显示错误的原因:
-InputObject <CimInstance>
Specifies a CIM instance object to be removed from the CIM server.
Note: The input object passed to the cmdlet is not changed, only the instance in the CIM server is removed.
Required? true
Position? 1
Default value none
Accept pipeline input? True (ByValue)
Accept wildcard characters? false
Run Code Online (Sandbox Code Playgroud)
从帮助文档中您可以看到 InputObject 接受CimInstance类型的单个对象,因此为其提供CimInstance[]数组是无效的。您还可以看到它接受管道输入。这给了你两个选择。您可以在 foreach 块中循环访问对象(不推荐),也可以通过管道将对象传递到函数中。这将为数组中的每个项目调用Remove-CimInstance 上的块;为每个条目传递一个CimInstance类型的对象。process
正如马蒂亚斯所说,以下方法应该可以解决这个问题:
$RemoveTheseAccounts | Remove-CimInstance
Run Code Online (Sandbox Code Playgroud)
有关进程块(以及开始和结束块)的更多信息可以在此处找到:https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_functions_advanced_methods ?view =powershell-6#进程