Removendo perfis de Apps
Tags: veracode, powershell, ptbr, script
Published: 2022-12-16 23:05:33

Em alguns casos pode ser preciso limpar uma grande quantidade de perfis de aplicação na plataforma da Veracode, como quando descontinuamos alguns projetos. Pensando no caso onde temos um identificador ou prefixo nos nomes desse projeto, podemos automatizar esse processo levantando todos os nomes e filtrando os com esse prefixo, mas como faríamos isso? 

Para começar, precisamos levantar quais são os nomes dos perfis e os IDs deles, já que para as automações da Veracode normalmente utilizamos como parâmetro esse ID. De uma forma bem simples, vamos usar uma das ações do Wrapper para pegar a listagem de todos os projetos (caso não saiba o que é o Wrapper nem como usá-lo, consulte esse [artigo](https://docs.veracode.com/r/c_about_wrappers)):

```
[xml]$listaPerfisApp = $(./VeracodeAPI.exe -action GetAppList)
$nomesApps = $listaPerfisApp.applist.app.app_name
$idApps = $listaPerfisApp.applist.app.app_id
```
Usando a tag de XML, podemos trabalhar com o retorno e criar duas listas, armazenando os dois dados que precisamos. 

Nosso próximo passo é definir qual vai ser o nosso texto validador, que pode ser um prefixo ou um trecho comum de texto, para saber quais perfis podemos remover. Vamos aproveitar para criar um índice e zerar ele:

```
$validadorNome = "DELETAR"
[int]$indice = 0
```

Agora só precisamos validar, nome a nome, quais os que tem o trecho que queremos e então utilizar a ação do Wrapper para remover, passando o ID como parâmetro: 

```
foreach ($nomeApp in $nomesApps) {
    if ($nomeApp -like "*$validadorNome*") {
        $appID = $idApps[$indice]
        Write-Host "Removendo perfil: $nomeApp - $appID"
        [xml]$Status = ./VeracodeAPI.exe -action deleteapp -appid "$appID"

        # Faz a validacao
        $resultado = $status.deleteapp.result
        if ($resultado -eq "success") {
            Write-Host "O perfil $nomeApp foi removido com sucesso"
        } else {
            Write-Host "Erro ao deletar o perfil: $nomeApp"
            Write-Host $Status
        }
    }
    $indice = $indice + 1
}
```
Incrementamos o índice conforme cada execução do laço de repetição, para termos nomes e IDs com seus valores equivalentes. 
Como o retorno da ação é em XML, optei por fazer uma filtragem dele, melhorando a exibição para o usuário. 

No final, adicionando ao começo do script uma etapa para validar se o Wrapper está configurado e configurá-lo caso não esteja, nosso script vai ficar assim:

```
# Configura o Wrapper
$validador = Test-Path ./VeracodeAPI.exe
if ($validador -ne "True") {
    $urlDownloadAPI = "https://tools.veracode.com/integrations/API-Wrappers/C%23/bin/VeracodeC%23API.zip"
    Invoke-WebRequest -Uri "$urlDownloadAPI" -OutFile "VeracodeAPI.zip"
    Expand-Archive -Path "VeracodeAPI.zip" -Force
    Move-Item -Path "VeracodeAPI/VeracodeC#API.exe" -Destination "./VeracodeAPI.exe" -Force
    Remove-Item -Path VeracodeAPI -Recurse
    Remove-Item -Path VeracodeAPI.zip
}

# Recebe a lista de todos os nomes e IDs
[xml]$listaPerfisApp = $(./VeracodeAPI.exe -action GetAppList)
$nomesApps = $listaPerfisApp.applist.app.app_name
$idApps = $listaPerfisApp.applist.app.app_id

# Define um prefixo para validação do nome e o indice
$validadorNome = "DELETAR"
[int]$indice = 0

# Valida se existe algum nome com o prefixo
foreach ($nomeApp in $nomesApps) {
    if ($nomeApp -like "*$validadorNome*") {
        $appID = $idApps[$indice]
        Write-Host "Removendo perfil: $nomeApp - $appID"
        [xml]$Status = ./VeracodeAPI.exe -action deleteapp -appid "$appID"

        # Faz a validacao
        $resultado = $status.deleteapp.result
        if ($resultado -eq "success") {
            Write-Host "O perfil $nomeApp foi removido com sucesso"
        } else {
            Write-Host "Erro ao deletar o perfil: $nomeApp"
            Write-Host $Status
        }
    }
    $indice = $indice + 1
}
```
E nosso output vai ficar:
![Retorno do terminal](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/14otdcc8mru6xaq0r0wi.png)

Existem outras formas de fazer esse processo, inclusive mais elegantes e otimizadas, mas a ideia desse artigo era mostrar como de uma forma simples podemos lidar com a remoção de vários perfis de Apps utilizando Powershell.

Pode acessar esse [script na integra](https://github.com/M3Corp-Community/Veracode/blob/main/SOs/Windows/RemoveAppIndice.ps1) e outros exemplos em nosso [GitHub](https://github.com/M3Corp-Community/Veracode).