无法将“System.Object[]”转换为参数“InputObject”所需的类型“Microsoft.Management.Infrastruct.CimInstance”

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)

The*_*ish 6

这里有一点解释,教人钓鱼等。按照惯例: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#进程