2017-07-18 1 views
1

Ich versuche ein Skript zu erstellen, das Domänenbenutzerprofile erkennt, die bis zu 15 Tage alt sind, und diese entfernt. Dies wird in einem Job gebündelt, der alle Leerlaufsitzungen vor der Ausführung abmeldet.Skript weist WMI-Objekte dem Array nicht korrekt zu

Ich bin mir bewusst, dass dies normalerweise über GPO erfolgen würde, jedoch ist es aus verschiedenen Gründen für diesen bestimmten Geschäftsbereich nicht geeignet.

Hier ist mein Code:

#Assign how old the user profile must be for deletion 
[int]$NoOfDays = 15 

#Get WMI object where it is a domain account and over 15 days old 
$Objects = @(Get-WmiObject -Class Win32_UserProfile | Where { 
    (!$_.Special) -and 
    $_.ConvertToDateTime($_.LastUseTime) -lt (Get-Date).AddDays(-15) 
}) 

if ($Objects -eq $null) { 
    #If no users returned, write to host. 
    Write-Host "no profiles found for deletion" 
} else { 
    #If users are found, do the following 
    foreach ($Object in $Objects) { 
     Write-Host "'$($object.LocalPath)' has been identified for deletion" 
    } 

    foreach ($Object in $Objects) { 
     try { 
      Write-Host "Attempting to delete profile '$($Object.LocalPath)'" 
      Remove-WmiObject 
      Write-Host "Deleted profile '$($Object.LocalPath)' successfully." 
     } catch { 
      Write-Host "Unable to delete profile '$($Object.LocalPath)'" -ErrorAction Continue 
     } 
    } 
} 

Es erfolgt keine Ausgabe, es gibt nur sofort ohne Fehlerzeile zu befehlen.

Ich habe versucht, das Bit auskommentieren, das das Profil entfernt, das else nach dem ersten für jede Anweisung zu beenden, um zu sehen, was zur Löschung identifiziert wird, aber es hat nicht funktioniert.

+0

es schien, dass ein paar Eingabeargumente für den Remove-WmiObject Cmdlets sind in den obigen Code gegeben verpasst. –

+0

@Andrei Odegov yeah Entschuldigung, danke für das Hinzeigen. Ich habe es geschafft, dass die Löschung korrekt funktioniert. –

Antwort

2

$Objects = @(...) stellt sicher, dass $Objects ein Array ist, auch wenn der Befehl kein Ergebnis zurückgibt. Ein Array (auch ein leeres Array) ist nie gleich $null, sodass Ihre erste Bedingung niemals ausgelöst wird.

ändern

if ($Objects -eq $null) { 

zu

if ($Objects.Count -gt 0) { 

und der Code sollte tun, was Sie erwarten.

0

Alternativ zu Ansgar's solution können Sie vermeiden, die $Objects Variable einem Array zuzuordnen (kann nicht sehen, warum dies erforderlich ist).

$Objects = Get-WmiObject -Class Win32_UserProfile | Where { 
    (!$_.Special) -and 
    $_.ConvertToDateTime($_.LastUseTime) -lt (Get-Date).AddDays(-15) 
} 

-eq $null Überprüfung kann dann verwendet werden. Sie können auch [string]::IsNullOrEmpty($Object) nützlich finden, da dies ein leeres Array erkennen wird.

Sie erwähnen, dass es keine Ausgabe gibt ... das ist verdächtig, wie Sie die Write-Hosts Drucken etwas bekommen sollten. Auf meinem Rechner habe ich einen Fehler mit $_.ConvertToDateTime ... Ich empfehle, Ihren Code eine Linie bei einem Gleichstand in der Konsole laufen zu lassen, um sicherzustellen, dass es tut, was Sie erwarten.

+0

kann nicht das Datum-Zeit-Problem mit WMI für diesen Code gelöst, gab es ein Problem mit meiner lokalen Kopie des Skripts. –

0

Ok, so stellt sich heraus, dass es eine Kombination von Problemen war. Die wichtigste ist die PS-Version, auf der sie ausgeführt wird, nicht auf 4. Die nächste Stufe besteht darin, PowerShell dazu zu zwingen, sie als Version 3 auszuführen. Wie zuvor erwähnt, muss sie nicht innerhalb eines Arrays gehandhabt werden. Hier ist meine letzte Skript (mag es nicht, kehrt nach jedem Zustand verlassen so die Formatierung wie):

if ($PSVersionTable.PSVersion.Major -eq 4) 
{ 
    Write-host "this script will terminate as machine is running PowerShell version 4" 
    exit 1 
    } 

    Else 
    { 


Start-Sleep -s 5 

Set-Location -Path C:\Users  

#Assign how old the user profile must be for deletion 

     [DateTime]$AdjustedDate = (Get-Date).AddDays(-15) 
     [DateTime]$CompareDate = Get-Date $AdjustedDate -Format MM-dd-yyyy 
     $Hostname = $env:computername 
     #$testdate = Get-WmiObject -Class Win32_UserProfile | select {$_.ConvertToDateTime($_.lastusetime).ToShortDateString()} 
     #write-host $testdate 
     #Get WMI object where it is a domain account and over 15 days old 
     $Objects = Get-WmiObject -Class Win32_UserProfile | Where {(!$_.Special) -and ($_.ConvertToDateTime($_.lastusetime) -lt (Get-Date).AddDays(-15)) -and $_.LocalPath -notlike "*.NET*" -and $_.LocalPath -notlike "*SQL*" -and $_.LocalPath -notlike "*Admin*" -and $_.LocalPath -notlike "*ADMIN*"} 


     #If no users returned, write to host. 
     If($Objects.Count -eq 0) 
     { 
      Write-host "no profiles found for deletion" 
     } 

     #If users are found, do the following 
     Else 
     { 
      Foreach($Object in $Objects) 
      { 
      Write-host "'$($object.LocalPath)' has been identified for deletion" 
Write-host " " 
      } 

      Foreach($Object in $Objects) 
      { 

          Try{ 
          Write-Host "Attempting to delete profile '$($Object.LocalPath)'" 
          $UserSID = (Get-WmiObject Win32_UserProfile | Where {$_.LocalPath -like '$($object.LocalPath)'}).SID 
          Remove-WmiObject -InputObject $Object 
          Write-Host "Deleted profile '$($Object.LocalPath)' successfully." 
          } 
          Catch{ 
          Write-Host "Unable to delete profile '$($Object.LocalPath)' due to the following error" 
          Write-Host "$error" -ErrorAction Continue 
          } 

      }  
     } 
} 
Verwandte Themen