powershell - удаляет строки на основе сообщения об ошибке

Здесь я пытаюсь дать и удалить локальные административные разрешения на основе ввода csv (компьютер, пользователь). Поскольку компьютеры наших пользователей, как правило, довольно часто находятся в автономном режиме, и в игру вступает множество разных часовых поясов, я хочу, чтобы сценарий повторил попытку предоставить разрешения, что он и делает.

Загвоздка в том, что если 1 разрешение было добавлено/удалено сценарием, а другого в этот момент не было (из-за недоступности компьютера, отказа в доступе или чего-то подобного), скрипт отправит обратно «Не удалось отправить информацию». повторная попытка через 1 час...", хотя он может успешно удалить/добавить его для одной или нескольких перечисленных записей.

Итак, что я хотел бы сделать, это когда powershell возвращает сообщение об ошибке 0 (успешно), я хотел бы удалить текущую работу над csv-строкой из CSV, поэтому CSV фактически «отрабатывает» компьютеры, которые должны быть выполнены.

Может ли кто-нибудь помочь мне с этим? Я не смог найти что-то похожее на эту проблему до сих пор.

$Stoploop = $false
[int]$Retrycount = "0"

do {
try {
        Import-Csv "E:\Folder\Script\Remove-Admin-1.csv" | foreach {
        $DomainName = "domain.local"
        $ComputerName = $($_.Computer)
        $UserName = $($_.User)
        $AdminGroup = [ADSI]"WinNT://$ComputerName/Administrators,group"
        $User = [ADSI]"WinNT://$DomainName/$UserName,user"
        $AdminGroup.Add($User.Path)
        }
    Write-Host "Job completed"
    $Stoploop = $true
    }
catch {
    if ($Retrycount -gt 24){
       Write-Host "Could not send Information after 24 retrys."
        $Stoploop = $true
    }
    else {
        Write-Host "Could not send Information retrying in 1 hours..."
        Write-Host $(Get-Date)
        Start-Sleep -Seconds 3600
        $Retrycount = $Retrycount + 1
    }
}
}
While ($Stoploop -eq $false)

person Thomas Scheibelhofer    schedule 06.12.2016    source источник


Ответы (1)


поэтому для этого вам нужно будет сохранить объект, который включает все ваши неудачные попытки, а затем использовать этот объект для перезаписи существующего файла. Это также означает, что ваш try/catch должен находиться внутри вашего foreach, чтобы каждый компьютер можно было обрабатывать независимо.

$Stoploop = $false
[int]$Retrycount = "0"
$fails = @()

do {

Import-Csv "E:\Folder\Script\Remove-Admin-1.csv" | foreach {
    Try{
        $DomainName = "domain.local"
        $ComputerName = $($_.Computer)
        $UserName = $($_.User)
        $AdminGroup = [ADSI]"WinNT://$ComputerName/Administrators,group"
        $User = [ADSI]"WinNT://$DomainName/$UserName,user"
        $AdminGroup.Add($User.Path)
    } catch {
        $fails += $_
        if ($Retrycount -gt 24){
            Write-Host "Could not send Information after 24 retrys."
            $fails | export-csv "E:\Folder\Script\Remove-Admin-1.csv" -NoTypeInformation
            $Stoploop = $true
        }
        else {
            Write-Host "Could not send Information retrying in 1 hours..."
            Write-Host $(Get-Date)
            Start-Sleep -Seconds 3600
            $Retrycount = $Retrycount + 1
            $fails += $_
        }
    }
}
if($fails = 0){
    Write-Host "Job completed"
    $Stoploop = $true
} elseif ($Retrycount -gt 24){
    Write-Host "Could not send Information after 24 retrys."
    $fails | export-csv "E:\Folder\Script\Remove-Admin-1.csv" -NoTypeInformation -force
    $Stoploop = $true
} else {
    Write-Host "Could not send Information retrying in 1 hours..."
    Write-Host $(Get-Date)
    Start-Sleep -Seconds 3600
    $Retrycount = $Retrycount + 1
    $fails | export-csv "E:\Folder\Script\Remove-Admin-1.csv" -NoTypeInformation -force
}


}
While ($Stoploop -eq $false)
person Mike Garuccio    schedule 06.12.2016
comment
Привет, Майк, спасибо за быстрый ответ, к сожалению, это не совсем помогло. Для корректного заполнения csv добавил -header Computer,User и удалил эту строчку из CSV. Проблема, с которой я все еще сталкиваюсь, заключается в том, что она не заполняет CSV. Он переопределяет csv, но не помещает в него содержимое. Есть ли у вас какие-либо предложения о том, как решить эту проблему? Благодарю вас! - person Thomas Scheibelhofer; 06.12.2016