Я делаю скрипт, который автоматизирует создание нескольких вещей на некоторых межсетевых экранах (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?
Спасибо!
Антонио. (Извините за английский, а не за мой родной язык).