Невозможно преобразовать System.Object [] в тип «Microsoft.Management.Infrastructure.CimInstance», требуемый параметром «InputObject». - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь создать сценарий powershell, который удаляет учетные записи, если они не вошли в рабочую станцию ​​windows 10 после определенного количества дней.

Этот скрипт будет запускаться локально, а не удаленно . Я думаю, что я очень близок к решению, но по какой-то причине, даже если я делаю, как показывает документация @ microsoft, я не могу удалить учетные записи с параметром inputobject.

Например, я пытаюсь удалить учетные записи 3 и 2, потому что они имеют одинаковую дату LastUseTime.

Аккаунт - LastUseTime

testuser3 - 20190625   
testuser2 - 20190625   
testuser1 - 20190629   

Код:

<# 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"    } 

Ошибка сообщения:

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

Решение:

<# 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"    } 

1 Ответ

3 голосов
/ 04 июля 2019

Небольшое объяснение здесь, научить человека ловить рыбу и т. Д. По соглашению: свойство 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

Из справочной документации видно, что InputObject принимает одиночный объект типа CimInstance , поэтому присвоение ему массива CimInstance [] не является действительный. Вы также можете видеть, что он принимает конвейерный ввод. Это дает вам два варианта. Вы можете либо пройти через объект в блоке foreach (не рекомендуется), либо передать объект в функцию. Это вызовет блок process в Remove-CimInstance для каждого из элементов в массиве; передавая объект типа CimInstance для каждой записи.

Как сказал Матиас, следующее должно решить проблему:

$RemoveTheseAccounts | Remove-CimInstance

Более подробную информацию о блоке процесса (а также о начале и конце блоков) можно найти здесь: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_functions_advanced_methods?view=powershell-6#process

...