2016-12-06 2 views
0

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

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

То, что я хотел бы сделать, - это когда возвращает сообщение об ошибке 0 (успешно), я хотел бы удалить текущую работу csv-line из 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) 

ответ

0

так, чтобы сделать это, вы будете нуждаться, чтобы сохранить объект, который включает в себя все ваши неудачные попытки, а затем использовать этот объект для перезаписи существующего файла. Это также означает, что ваш 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) 
+0

Hi Mike, благодарит вас за быстрый ответ, к сожалению, он не совсем понял, как это работает. Чтобы заполнить csv правильно добавленный -header Computer, User и удалить эту строку из CSV. Проблема, я все еще сталкиваюсь с тем, что она не заполняет CSV. Он переопределяет csv, но не помещает в него контент. Есть ли у вас какие-либо предложения о том, как это решить? Спасибо! –

Смежные вопросы