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
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.