private/certificateauthority/Remove-CACertificateRequestFailed.ps1
function Remove-CACertificateRequestFailed { <# .SYNOPSIS Remove failed certificate requests. .DESCRIPTION This will remove ADCS failed requests that are submitted up to a certain date. .PARAMETER Date Date to remove failed certificate requests up-to. Default is today. .PARAMETER Limit Limit the number of requests to remove. .EXAMPLE Remove-CACertificateExpired -Limit 100; .EXAMPLE Remove-CACertificateExpired -Date (Get-Date).AddDays(-30) -Limit 100; #> [CmdletBinding(SupportsShouldProcess = $true)] [OutputType([string])] param ( # Date to remove failed requests up-to. Default is today. [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)] [ValidateScript({ $_ -le (Get-Date) })] [DateTime]$Date = (Get-Date), # Limit the number of requests to remove. [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)] [ValidateNotNullOrEmpty()] [int]$Limit = 150000 ) BEGIN { # Write to log. $customProgress = Write-CustomProgress -Activity $MyInvocation.MyCommand.Name -CurrentOperation 'Removing failed requests from CA'; # Arguments to be used with CertUtil.exe. [string]$certUtilArguments = ''; # If date is set. if ($PSBoundParameters.ContainsKey('Date')) { # Get failed requests. $failedRequests = Get-CACertificateRequestFailed -Date $Date; } # Else use default. else { # Get failed requests. $failedRequests = Get-CACertificateRequestFailed; } # Array list for removed requests. [System.Collections.ArrayList]$removedRequests = New-Object System.Collections.ArrayList; } PROCESS { # Foreach failed request. foreach ($failedRequest in $failedRequests) { # If limit is reached. if ($removedRequests.Count -gt $Limit) { # Write to log. Write-CustomLog -Message ('Limit of {0} request removal reached' -f $Limit) -Level Verbose; # Stop function. break; } # Create arguments. [string]$certutilArguments = ('-deleterow {0}' -f $failedRequest.RequestId); # If whatif is not set. if ($PSCmdlet.ShouldProcess($failedRequest.RequestId, 'Removing failed request')) { # Write to log. Write-CustomLog -Message ("Removing failed request with id '{0}'" -f $failedRequest.RequestId) -Level Verbose; # Try to remove the certificate. try { # Remove failed request. $null = Invoke-CertUtil -Arguments $certutilArguments -ErrorAction Stop; # Add to remoed requests. $null = $removedRequests.Add($failedRequest); # Write to log. Write-CustomLog -Message ("Succesfully removed failed request with id '{0}'" -f $failedRequest.RequestId) -Level Verbose; # Write to event log. Write-CustomEventLog -EventId 124 -AdditionalMessage ("Request ID '{0}'" -f $expiredCertificate.RequestId); } # Something went wrong. catch { # Write to event log. Write-CustomEventLog -EventId 126 -AdditionalMessage ("Request ID '{0}'" -f $expiredCertificate.RequestId); # Write to log. Write-CustomLog -Message ("Failed to remove failed request with id '{0}'. {1}" -f $failedRequest.RequestId, $_.Exception.Message) -Level Warning; } } # Else whatif is set. else { # Continue to next request. continue; } } } END { # Write to log. Write-CustomProgress @customProgress; # Return the removed requests. return $removedRequests; } } |