Cómo montar y desmontar archivos ISO dinámicamente con PowerShell

En este post, proporcionaremos un script PowerShell que los administradores de TI pueden utilizar para montar y desmontar archivos ISO dinámicamente.

Antecedentes

Los archivos ISO, esencialmente una copia completa de un disco en formato digital, se utilizan mucho para distribuir software (incluido malware, por desgracia). Los profesionales de TI y los proveedores de servicios gestionados (MSP) pueden preferir bloquear el montaje de archivos ISO en general, o pueden encontrarse con la necesidad de activar o desactivar el montaje de estas imágenes ISO de forma dinámica, especialmente en sistemas empresariales. Este script de PowerShell ayuda a controlar esta función con precisión, garantizando que la seguridad y el cumplimiento de las políticas se respeten con creces.

El script para montar y desmontar archivos ISO dinámicamente

#Requires -Version 5.1

<#
.SYNOPSIS
    Enables or disables the mounting of ISO images.
.DESCRIPTION
    Enables or disables the mounting of ISO images.
.EXAMPLE
     -Enable
    Enables mounting of ISO images.
.EXAMPLE
     -Disable
    Disables mounting of ISO images.
.OUTPUTS
    None
.NOTES
    Minimum OS Architecture Supported: Windows 10, Windows Server 2016
    Release Notes:
    Initial Release
By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use.
    Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. 
    Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. 
    Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. 
    Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. 
    Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. 
    Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. 
    EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).
#>

[CmdletBinding()]
param (
    [Parameter()]
    [switch]
    $Enable,
    [Parameter()]
    [switch]
    $Disable
)

begin {
    function Set-ItemProp {
        param (
            $Path,
            $Name,
            $Value,
            [ValidateSet("DWord", "QWord", "String", "ExpandedString", "Binary", "MultiString", "Unknown")]
            $PropertyType = "DWord"
        )
        # Do not output errors and continue
        $ErrorActionPreference = [System.Management.Automation.ActionPreference]::SilentlyContinue
        if (-not $(Test-Path -Path $Path)) {
            # Check if path does not exist and create the path
            New-Item -Path $Path -Force | Out-Null
        }
        if ((Get-ItemProperty -Path $Path -Name $Name)) {
            # Update property and print out what it was changed from and changed to
            $CurrentValue = Get-ItemProperty -Path $Path -Name $Name
            try {
                Set-ItemProperty -Path $Path -Name $Name -Value $Value -Force -Confirm:$false -ErrorAction Stop | Out-Null
            }
            catch {
                Write-Error $_
            }
            Write-Host "$Path$Name changed from $CurrentValue to $(Get-ItemProperty -Path $Path -Name $Name)"
        }
        else {
            # Create property with value
            try {
                New-ItemProperty -Path $Path -Name $Name -Value $Value -PropertyType $PropertyType -Force -Confirm:$false -ErrorAction Stop | Out-Null
            }
            catch {
                Write-Error $_
            }
            Write-Host "Set $Path$Name to $(Get-ItemProperty -Path $Path -Name $Name)"
        }
        $ErrorActionPreference = [System.Management.Automation.ActionPreference]::Continue
    }
    function Test-IsElevated {
        $id = [System.Security.Principal.WindowsIdentity]::GetCurrent()
        $p = New-Object System.Security.Principal.WindowsPrincipal($id)
        $p.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)
    }
}
process {
    if (-not (Test-IsElevated)) {
        Write-Error -Message "Access Denied. Please run with Administrator privileges."
        exit 1
    }

    if ($env:Action -like "Enable") {
        $Enable = $true
    }
    elseif ($env:Action -like "Disable") {
        $Disable = $true
    }

    # Use a unique number that isn't likely to be used
    # "ninja" to something close to a number plus 1 at the end: "41470" + "1"
    $GroupName = "414701"

    # Mount HKEY_CLASSES_ROOT as HKCR: for the current session
    New-PSDrive -PSProvider registry -Root HKEY_CLASSES_ROOT -Name HKCR

    if ($Enable -and $Disable) {
        Write-Error "Both Enable and Disable can not be used at the same time."
        exit 1
    }
    elseif ($Enable) {
        # Enables the use of ISO mounting by removing registry settings

        # ErrorAction set to SilentlyContinue for when the registry settings don't exist
        Remove-ItemProperty -Path "HKLM:SOFTWAREPoliciesMicrosoftWindowsDeviceInstallRestrictionsDenyDeviceIDs" -Name "$GroupName" -ErrorAction SilentlyContinue
        Write-Host "Removed $GroupName from HKLM:SOFTWAREPoliciesMicrosoftWindowsDeviceInstallRestrictionsDenyDeviceIDs"

        Remove-ItemProperty -Path "HKLM:SOFTWAREPoliciesMicrosoftWindowsDeviceInstallRestrictions" -Name "DenyDeviceIDsRetroactive" -ErrorAction SilentlyContinue
        Write-Host "Removed DenyDeviceIDsRetroactive from HKLM:SOFTWAREPoliciesMicrosoftWindowsDeviceInstallRestrictionsDenyDeviceIDs"

        Remove-ItemProperty -Path "HKCR:Windows.IsoFileshellmount" -Name "ProgrammaticAccessOnly" -ErrorAction SilentlyContinue
        Write-Host "Removed ProgrammaticAccessOnly from HKCR:Windows.IsoFileshellmount"
    }
    elseif ($Disable) {
        # Disables the use of ISO mounting by creating registry settings

        Set-ItemProp -Path "HKLM:SOFTWAREPoliciesMicrosoftWindowsDeviceInstallRestrictionsDenyDeviceIDs" -Name "$GroupName" -Value "SCSICdRomMsft____Virtual_DVD-ROM_" -PropertyType String
        Set-ItemProp -Path "HKLM:SOFTWAREPoliciesMicrosoftWindowsDeviceInstallRestrictions" -Name "DenyDeviceIDsRetroactive" -Value "1" -PropertyType DWord
        Set-ItemProp -Path "HKCR:Windows.IsoFileshellmount" -Name "ProgrammaticAccessOnly" -Value "" -PropertyType String
    }
    else {
        Write-Error "Enable or Disable is required."
        exit 1
    }
    Write-Host "Any logged in users will need to log out and back in for changes to take effect."
}
end {
    $ScriptVariables = @(
        [PSCustomObject]@{
            name           = "Action"
            calculatedName = "action"
            required       = $true
            defaultValue   = [PSCustomObject]@{
                type  = "TEXT"
                value = "Disable"
            }
            valueType      = "DROPDOWN"
            valueList      = @(
                [PSCustomObject]@{
                    type  = "UNDEFINED"
                    value = "Disable"
                },
                [PSCustomObject]@{
                    type  = "UNDEFINED"
                    value = "Enable"
                }
            )
            description    = "Used to enable or disable the mounting of ISO images."
        }
    )
}

 

Accede a más de 300 scripts en el Dojo de NinjaOne

Obtén acceso

Análisis detallado

El script proporcionado está diseñado para alternar la capacidad de montaje de imágenes ISO. Analicemos sus componentes:

  • Parámetros: El script acepta dos opciones: $Enable y $Disable. Dictan el comportamiento del script, activando o desactivando el montaje ISO.
  • Función Set-ItemProp: esta función interna se encarga de la creación o modificación de una propiedad del registro. Atiende a diferentes tipos de propiedades, garantizando flexibilidad en la gestión de las claves del Registro de Windows.
  • Función Test-IsElevated: comprueba si el script se ejecuta con privilegios administrativos. Esto garantiza que los cambios se apliquen a todo el sistema y no se limiten a la sesión del usuario.
  • Bloque de proceso: el componente principal del script. Aquí reside la lógica:
  • comprueba los derechos administrativos.
  • Determina la acción en función de los parámetros o variables de entorno proporcionados.
  • Elimina (habilita) o establece (deshabilita) claves de registro específicas para controlar la capacidad de montaje de ISO.

Posibles casos de uso

Veamos un caso práctico: El departamento informático de Acme Corp envía una actualización de software mediante archivos ISO a todos los sistemas de los empleados. Una vez concluida la actualización, pretenden desactivar temporalmente la capacidad de montaje de ISO. Al desplegar este script en toda la empresa, pueden controlar esta funcionalidad, garantizando que los usuarios curiosos no monten ISO no oficiales o no autorizadas.

Comparaciones

Aunque la intervención manual o las herramientas basadas en GUI pueden gestionar los permisos de montaje ISO, resultan ineficaces para las operaciones a gran escala. Nuestro script ofrece un método automatizado, sin complicaciones y robusto en comparación con los procesos manuales que requieren mucho tiempo.

FAQ

  • ¿El script requiere privilegios de administrador?
    Sí, para realizar cambios en todo el sistema, el script debe ejecutarse con derechos administrativos.
  • ¿Puedo activar y desactivar simultáneamente?
    No. El script requiere una acción distinta, ya sea activar o desactivar.

Implicaciones

Gestionar la capacidad de montar archivos ISO puede tener profundas implicaciones de seguridad. Las ISO no autorizadas pueden introducir malware o software no deseado. Al controlar esta función, los departamentos de TI pueden garantizar que sólo se montan las ISO autorizadas, mitigando así las posibles amenazas.

Recomendaciones

  • Haz siempre una copia de seguridad de la configuración del registro antes de realizar cambios.
  • Prueba el script en un entorno controlado antes de implantarlo en toda la empresa.
  • Supervisa los comportamientos del sistema tras la implantación para identificar cualquier resultado inesperado.

Reflexiones finales

Para plataformas como NinjaOne, que se ocupa de las operaciones y la gestión de TI, este tipo de scripts tienen un valor incalculable, ya que muestran la versatilidad de la plataforma y su adecuación a las necesidades de TI actuales. Gracias a estas herramientas, los profesionales de TI pueden aprovechar toda la potencia de PowerShell, haciendo que la gestión del sistema sea eficiente y segura.

Próximos pasos

La creación de un equipo de TI próspero y eficaz requiere contar con una solución centralizada que se convierta en tu principal herramienta de prestación de servicios. NinjaOne permite a los equipos de TI supervisar, gestionar, proteger y dar soporte a todos sus dispositivos, estén donde estén, sin necesidad de complejas infraestructuras locales.

Obtén más información sobre NinjaOne Endpoint Management, echa un vistazo a un tour en vivoo tu prueba gratuita de la plataforma NinjaOne.

Categorías:

Quizá también te interese…

Ver demo×
×

¡Vean a NinjaOne en acción!

Al enviar este formulario, acepto la política de privacidad de NinjaOne.

Términos y condiciones de NinjaOne

Al hacer clic en el botón «Acepto» que aparece a continuación, estás aceptando los siguientes términos legales, así como nuestras Condiciones de uso:

  • Derechos de propiedad: NinjaOne posee y seguirá poseyendo todos los derechos, títulos e intereses sobre el script (incluidos los derechos de autor). NinjaOne concede al usuario una licencia limitada para utilizar el script de acuerdo con estos términos legales.
  • Limitación de uso: solo podrás utilizar el script para tus legítimos fines personales o comerciales internos, y no podrás compartirlo con terceros.
  • Prohibición de republicación: bajo ninguna circunstancia está permitido volver a publicar el script en ninguna biblioteca de scripts que pertenezca o esté bajo el control de cualquier otro proveedor de software.
  • Exclusión de garantía: el script se proporciona «tal cual» y «según disponibilidad», sin garantía de ningún tipo. NinjaOne no promete ni garantiza que el script esté libre de defectos o que satisfaga las necesidades o expectativas específicas del usuario.
  • Asunción de riesgos: el uso que el usuario haga del script corre por su cuenta y riesgo. El usuario reconoce que existen ciertos riesgos inherentes al uso del script, y entiende y asume cada uno de esos riesgos.
  • Renuncia y exención: el usuario no hará responsable a NinjaOne de cualquier consecuencia adversa o no deseada que resulte del uso del script y renuncia a cualquier derecho o recurso legal o equitativo que pueda tener contra NinjaOne en relación con su uso del script.
  • CLUF: si el usuario es cliente de NinjaOne, su uso del script está sujeto al Contrato de Licencia para el Usuario Final (CLUF).