Использование invoke-webrequest со специальными символами в URI приводит к некорректной работе вызова API - PullRequest
0 голосов
/ 19 октября 2019

Я делаю скрипт, который автоматизирует создание нескольких вещей на некоторых межсетевых экранах (Sophos XG). Этот читает CSV с 2 столбцами и создает вызов API для создания IP-хоста в брандмауэре с именем (первый столбец) и IP (второй столбец). Идеально для массовой загрузки.

Работает нормально, за исключением случаев, когда некоторые переменные имеют специальные символы (например, + или &) либо в переменной пароля ($ _CONTRASEÑA_API), либо в имени IP ($ _NOMBRE_IP). Если у пароля или имени нет этих символов, он работает безупречно.

Вот код:

# ---------------------
# Creacion IP Host - XG
# ---------------------
# Versiones
#
# 1.0 - Version original
#
# ---------------------

# Declaracion variables globales
# ------------------------------
$_IP_FIREWALL = "190.80.80.80"
$_PUERTO_FIREWALL = "4444"
$_USUARIO_API = "admin"
$_CONTRASEÑA_API = "SecurePassword+"
$_RUTA_TRABAJO = "c:\Workfolder\IPHostCSV\"
$_NOMBRE_ARCHIVO_CSV = "test.csv"

# Permitir conexiones SSL
# -----------------------
add-type @"
    using System.Net;
    using System.Security.Cryptography.X509Certificates;
    public class TrustAllCertsPolicy : ICertificatePolicy {
        public bool CheckValidationResult(
            ServicePoint srvPoint, X509Certificate certificate,
            WebRequest request, int certificateProblem) {
            return true;
        }
    }
"@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy


# Bucle principal
# ---------------
foreach($linea in [System.IO.File]::ReadLines("$_RUTA_TRABAJO$_NOMBRE_ARCHIVO_CSV"))
    {

    # Obtencion Parametros CSV
    # ------------------------
    $_NOMBRE_IP = ($linea -split ',')[0]
    $_DIRECCION_IP =  ($linea -split ',')[1]
    $_MASCARA =  ($linea -split ',')[2]

    # Consulta API
    # ------------
    echo "[INFO] Procesando Host: $($_NOMBRE_IP) IP: $($_DIRECCION_IP)"
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 
    $_URL_API = "https://$($_IP_FIREWALL):$($_PUERTO_FIREWALL)/webconsole/APIController?reqxml=<Request><Login><UserName>$($_USUARIO_API)</UserName><Password>$($_CONTRASEÑA_API)</Password></Login><Set><IPHost><Name>$($_NOMBRE_IP)</Name><IPFamily>IPv4</IPFamily><HostType>IP</HostType><IPAddress>$($_DIRECCION_IP)</IPAddress></IPHost></Set></Request>"
    $_RESULTADO_API = Invoke-WebRequest -Uri "$_URL_API"
    [xml] $_CODIGO_XML = $_RESULTADO_API.Content


    # Revision Resultados
    # -------------------
    if($_CODIGO_XML.Response.IPHost.Status.code -eq 200)
            {
            echo "[ OK ] CODIGO: $($_CODIGO_XML.Response.IPHost.Status.code) - Procesado OK"
            $_NOMBRE_IP | Out-File -Append -Encoding utf8 -FilePath "$($_RUTA_TRABAJO)OK.txt"
            } else {
            echo "[WARN] CODIGO: $($_CODIGO_XML.Response.IPHost.Status.code) - Problema en la ejecuccion $($_CODIGO_XML.Response.IPHost.Status.'#text')"
            $_NOMBRE_IP | Out-File -Append -Encoding utf8 -FilePath "$($_RUTA_TRABAJO)NO_OK.txt"
            }
    }

В основном эти 2 строки

 $_URL_API = "https://$($_IP_FIREWALL):$($_PUERTO_FIREWALL)/webconsole/APIController?reqxml=<Request><Login><UserName>$($_USUARIO_API)</UserName><Password>$($_CONTRASEÑA_API)</Password></Login><Set><IPHost><Name>$($_NOMBRE_IP)</Name><IPFamily>IPv4</IPFamily><HostType>IP</HostType><IPAddress>$($_DIRECCION_IP)</IPAddress></IPHost></Set></Request>"
    $_RESULTADO_API = Invoke-WebRequest -Uri "$_URL_API"
    [xml] $_CODIGO_XML = $_RESULTADO_API.Content

Сделай звонок. Любая идея, как избежать ошибки, когда специальные символы используются в пароле или в любом другом месте в URI?

Спасибо!

Антонио. (Извините за английский, а не за мой родной язык).

1 Ответ

2 голосов
/ 19 октября 2019

Пользователь метод UrlEncode HttpUtility. Это преобразует спецсимвол в их дружественную альтернативу URL.

$_URL_API_Encoded = [System.Web.HttpUtility]::UrlEncode($_URL_API)
$_RESULTADO_API = Invoke-WebRequest -Uri "$_URL_API_Encoded"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...