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)
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)