El Blog de Gualtrysoft

Windows 2000/2003/2008, Active Directory, VBScript, Hyper-V, PowerShell y todo aquello interesante a la hora de usar, configurar y administrar Windows Server. También tenemos longanizas…

Script PowerShell Para Agregar Entradas De Seguridad En La ACL De Una Clave Del Registro

Posted by urpiano en Martes 26 \26\UTC enero \26\UTC 2010

Este script se encarga de dar de alta entradas de seguridad en una clave del registro. Estas entradas corresponden a tantos usuarios o grupos como se establezcan con el parámetro $Usuarios, parámetro que es un array de cadena, cada una de ellas un nombre NetBios (dominio o equipo\usuario o grupo).

Sintaxis

<Ruta>\Agregar-PermisosAClaveDeRegistro.vbs -Clave:Ruta -Usuarios:ListaUsuarios -Permisos:Derechos [-Herencia] [-Propagacion] [-Denegacion] [-Reemplazar] [-Ayuda]

Siendo

Etiqueta Dato ¿Requerido? Descripción
Clave Ruta
Ruta de la clave en el registro. Se puede especificar usando los PSDrives del registro (HKLM: y HKCU:) o bien directamente con registry::Ruta (por ejemplo, tan válido es “HKCU:\Console” como “registry::HKCU\Console”); esta segunda manera es obligada cuando se acceden a las ramas HKCR, HKU o HKCC
Usuarios ListaUsuarios
Array de cadenas con identificadores NetBios de usuarios o grupos. Por ejemplo: “dominio\usuario1″,”equipo\usuario2”
Permisos Derechos
Cadena de valores separados por comas. Por ejemplo “ExecuteKey, ReadKey”. Los posibles valores son:
      · ChangePermissions
      · CreateLink
      · CreateSubKey
      · Delete
      · EnumerateSubKeys
      · ExecuteKey
      · FullControl
      · Notify
      · QueryValues
      · ReadKey
      · ReadPermissions
      · SetValue
      · TakeOwnership
      · WriteKey
Herencia   No
Si se pasa este modificador, se marcará que los permisos a establecer son heredables
Propagacion   No
Si se pasa este modificador, se procederá a propagar la herencia de los permisos a establecer
Denegacion   No
Si se pasa este modificador, la entrada ACE será de tipo denegar, en caso contrario será de tipo permitir
Reemplazar   No
Si se pasa este modificador los permisos que establece la ACE sustituirán a aquellos permisos que tuvieran establecidos con anterioridad los usuarios y/o grupos especificados por el parámetro Usuarios; en caso contrario la ACE se agregará a lo que ya tuvieran
?   No
Muestra la ayuda en línea.

Ejemplos:

– Reemplazaremos los permisos de la clave del registro HKU:\.Default\TIA\Nominas a los usuarios “TIA\Filemon”,”TIA\Ofelia”, pasando a denegar la lectura y ejecución (“ExecuteKey, ReadKey”) de la misma, activando la herencia y propagándola :

.\Agregar-PermisosAClaveDeRegistro -Clave:HKU:\.Default\TIA\Nominas -Usuarios:"TIA\Filemon","TIA\Ofelia" -Herencia -Propagacion -Permisos:"ExecuteKey, ReadKey" -Denegacion -Reemplazar

– Agregaremos a la clave HKU:\.Default\TIA\Nominas a los usuarios “TIA\Filemon”,”TIA\Ofelia” el permiso de tomar posesión de la misma (“TakeOwnership”):

.\Agregar-PermisosAClaveDeRegistro- -Clave:HKU:\.Default\TIA\Nominas -Usuarios:"TIA\Filemon","TIA\Ofelia" -Permisos:"TakeOwnership"

Este es el código del script



param($Clave, [String[]]$Usuarios, [String]$Permisos, [Switch]$Herencia, `
      [Switch]$Propagacion, [Switch]$Denegacion, [Switch]$Reemplazar, `
      [Switch]$Ayuda)
#*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
#*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
#* Agregar-PermisosAClaveDeRegistro.ps1                                *
#*                                                                     *
#* Este script se encarga de dar de alta entradas de  seguridad en una *
#* clave del registro. Estas entradas corresponden a tantos usuarios o *
#* grupos como se establezcan con el parámetro $Usuarios, parámetro    *
#* que es un array de cadena, cada una de ellas un nombre NetBios      *
#* (dominio o equipo\usuario o grupo).                                 *
#*                                                                     *
#* Sintaxis                                                            *
#*                                                                     *
#* <ruta>\Agregar-PermisosAClaveDeRegistro.ps1 [-Clave] Ruta           *
#* [-Usuarios] ListaUsuarios [-Permisos] Derechos [-Herencia]          *
#* [-Propagacion] [-Denegacion] [-Reemplazar] [-Ayuda]                 *
#*                                                                     *
#* Siendo                                                              *
#*                                                                     *
#* - Clave: Ruta (Requerido):                                          *
#*         Ruta de la clave en el registro. Se puede especificar       *
#*         usando los PSDrives del registro (HKLM: y HKCU:) o bien     *
#*         directamente con registry::Ruta (por ejemplo, tan válido es *
#*         "HKCU:\Console" como "registry::HKCU\Console"); esta        *
#*         segunda manera es obligada cuando se acceden a las ramas    *
#*         HKCR, HKU o HKCC                                            *
#*                                                                     *
#* - Usuarios: ListaUsuarios (Requerido):                              *
#*         Array de cadenas con identificadores NetBios de usuarios o  *
#*         grupos. Por ejemplo: "dominio\usuario1","equipo\usuario2"   *
#*                                                                     *
#* - Permisos: Derechos (Requerido):                                   *
#*         Cadena de valores separados por comas. Por ejemplo          *
#*         "ExecuteKey, ReadKey". Los posibles valores son:            *
#*                  · QueryValues                                      *
#*                  · SetValue                                         *
#*                  · CreateSubKey                                     *
#*                  · EnumerateSubKeys                                 *
#*                  · Notify                                           *
#*                  · CreateLink                                       *
#*                  · Delete                                           *
#*                  · ReadPermissions                                  *
#*                  · WriteKey                                         *
#*                  · ExecuteKey                                       *
#*                  · ReadKey                                          *
#*                  · ChangePermissions                                *
#*                  · TakeOwnership                                    *
#*                  · FullControl                                      *
#*                                                                     *
#* - Herencia: (Opcional):                                             *
#*         Si se pasa este modificador, se marcará que los permisos a  *
#*         establecer son heredables                                   *
#*                                                                     *
#* - Propagacion: (Opcional):                                          *
#*         Si se pasa este modificador, se procederá a propagar la     *
#*         herencia de los permisos a establecer                       *
#*                                                                     *
#* - Denegacion: (Opcional):                                           *
#*         Si se pasa este modificador, la entrada ACE será de tipo    *
#*         denegar, en caso contrario será de tipo permitir            *
#*                                                                     *
#* - Reemplazar: (Opcional):                                           *
#*         Si se pasa este modificador los permisos que establece la   *
#*         ACE sustituirán a aquellos permisos que tuvieran            *
#*         establecidos con anterioridad los usuarios y/o grupos       *
#*         especificados por el parámetro Usuarios; en caso contrario  *
#*         la ACE se agregará a lo que ya tuvieran                     *
#*                                                                     *
#* - Ayuda: ayuda (Opcional):                                              *
#*         Muestra la ayuda en línea                                   *
#*                                                                     *
#*                                                                     *
#* Ejemplos:                                                           *
#*                                                                     *
#* · Reemplazaremos los permisos de la clave del registro              *
#* HKU:\.Default\TIA\Nominas a los usuarios                            *
#* "TIA\Filemon","TIA\Ofelia", pasando a denegar la lectura y          *
#* ejecución de la misma, activando la herencia y propagándola:        *
#*                                                                     *
#* .\Agregar-PermisosAClaveDeRegistro `                                *
#* -Clave registry::HKU:\.Default\TIA\Nominas `                        *
#* -Usuarios "TIA\Filemon","TIA\Ofelia" -Herencia -Propagacion `       *
#* -Permisos "ExecuteKey, ReadKey" -Denegacion -Reemplazar             *
#*                                                                     *
#* · Agregaremos a la clave HKU:\.Default\TIA\Nominas a los usuarios   *
#* "TIA\Filemon","TIA\Ofelia" el permiso de tomar posesión:            *
#*                                                                     *
#* .\Agregar-PermisosAClaveDeRegistro `                                *
#* -Clave registry::HKU:\.Default\TIA\Nominas `                        *
#* -Usuarios "TIA\Filemon","TIA\Ofelia" -Permisos "TakeOwnership"      *
#*                                                                     *
#*                                                                     *
#*                                                                     *
#*                                                                     *
#* © Fernando Reyes                                                    *
#* Enero De 2010                                                       *
#*°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°*
#*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
Function Mostrar-Ayuda([String]$Mensaje = "")
{
#***********************************************************************
#* Procedimiento: Mostrar-Ayuda                                        *
#* Tipo         : Sub                                                  *
#* Devolución   : Ninguna                                              *
#* Fecha y Hora : 20/01/2010 15:04:03                                  *
#* Autor        : Fernando Reyes                                       *
#*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
#* Propósito    : Este procedimiento muestra la ayuda en línea.        *
#*                Recibe un parámetro de tipo cadena que si viene      *
#*                será mostrado antes de la línea; pensado para que    *
#*                se muestre un error que se haya detectado.           *
#***********************************************************************

    #Si hay que mostrar algún texto previo a la ayuda, lo hacemos
    If ($Mensaje.Length -gt 0)
    {
        Write-Host   $Mensaje
        Write-Host
        Write-Host
    }

    # A continuación, mostramos la ayuda por pantalla
    Write-Host "Este script se encarga de dar de alta entradas de" `
               "seguridad en una clave del"
    Write-Host "registro. Estas entradas corresponden a tantos usuarios o" `
               "grupos como se"
    Write-Host "establezcan con el parámetro `$Usuarios, parámetro" `
               "que es un array de cadena,"
    Write-Host "cada una de ellas un nombre NetBios" `
               "(dominio o equipo\usuario o grupo)."
    Write-Host
    Write-Host "Sintaxis"
    Write-Host
    Write-Host "<ruta>\Agregar-PermisosAClaveDeRegistro.ps1 [-Clave] Ruta" `
               "[-Usuarios] ListaUsuarios [-Permisos] Derechos" `
               "[-Herencia] [-Propagacion] [-Denegacion]" `
               "[-Reemplazar] [-Ayuda] "
    Write-Host
    Write-Host "Siendo"
    Write-Host
    Write-Host "· -Clave: Ruta (Requerido):"
    Write-Host "Ruta de la clave en el registro. Se puede especificar usando"
    Write-Host "los PSDrives del registro (HKLM: y HKCU:) o bien directamente"
    Write-Host "con registry::Ruta (por ejemplo, tan válido es" `
               """HKCU:\Console"""
    Write-Host "como ""registry::HKCU\Console""); esta segunda manera" `
               "es obligada"
    Write-Host "cuando se acceden a las ramas HKCR, HKU o HKCC"
    Write-Host
    Write-Host "· -Usuarios: ListaUsuarios (Requerido):"
    Write-Host "Array de cadenas con identificadores NetBios de usuarios o"
    Write-Host "grupos. Por ejemplo: ""dominio\usuario1"",""equipo\usuario2"""
    Write-Host
    Write-Host "· -Herencia: abstract1 (Opcional):"
    Write-Host "Si se pasa este modificador, se marcará que los permisos a"
    Write-Host "establecer son heredables"
    Write-Host
    Write-Host "· -Propagacion: abstract2 (Opcional):"
    Write-Host "Si se pasa este modificador, se procederá a propagar la"
    Write-Host "herencia de los permisos a establecer"
    Write-Host
    Write-Host "· -Permisos: Derechos (Requerido):"
    Write-Host "Cadena de valores separados por comas. Por ejemplo" `
               """ExecuteKey,"
    Write-Host "ReadKey"". Los posibles valores son:"
    Write-Host "    · QueryValues"
    Write-Host "    · SetValue"
    Write-Host "    · CreateSubKey"
    Write-Host "    · EnumerateSubKeys"
    Write-Host "    · Notify"
    Write-Host "    · CreateLink"
    Write-Host "    · Delete"
    Write-Host "    · ReadPermissions"
    Write-Host "    · WriteKey"
    Write-Host "    · ExecuteKey"
    Write-Host "    · ReadKey"
    Write-Host "    · ChangePermissions"
    Write-Host "    · TakeOwnership"
    Write-Host "    · FullControl"
    Write-Host
    Write-Host "· -Denegacion: (Opcional):"
    Write-Host "Si se pasa este modificador, la entrada ACE será de tipo"
    Write-Host "denegar, en caso contrario será de tipo permitir"
    Write-Host
    Write-Host "· -Reemplazar: (Opcional):"
    Write-Host "Si se pasa este modificador los permisos que establece la ACE"
    Write-Host "sustituirán a aquellos permisos que tuvieran establecidos con"
    Write-Host "anterioridad los usuarios y/o grupos especificados" `
               "por el"
    Write-Host "parámetro Usuarios; en caso contrario la ACE se " `
               "agregará a lo"
    Write-Host "que ya tuvieran"
    Write-Host   
    Write-Host "· -Ayuda:"
    Write-Host "Muestra la ayuda en línea"
    Write-Host   
    Write-Host   
    Write-Host "Ejemplos:"
    Write-Host   
    Write-Host "- Reemplazaremos los permisos de la clave del reg" + `
               "istro"
    Write-Host "HKU:\.Default\TIA\Nominas a los usuarios ""TIA\Filemon""," `
               """TIA\Ofelia"", pasando a"
    Write-Host "denegar la lectura ""ExecuteKey, ReadKey"" de" `
               "la misma, activando la herencia y"
    Write-Host "propagándola    :"
    Write-Host   
    Write-Host ".\Agregar-PermisosAClaveDeRegistro ``"
    Write-Host "-Clave registry::HKU:\.Default\TIA\Nominas ``"
    Write-Host "-Usuarios ""TIA\Filemon"",""TIA\Ofelia"" -Herencia -Prop" `
               "agacion ``"
    Write-Host "-Permisos ""ExecuteKey, ReadKey"" -Denegacion -Reemplazar"
    Write-Host   
    Write-Host "- Agregaremos a la clave HKU:\.Default\TIA\Nominas" `
               "a los usuarios"
    Write-Host "TIA\Filemon"",""TIA\Ofelia"" el permiso de tomar" `
               "posesión de la misma"
    Write-Host
    Write-Host ".\Agregar-PermisosAClaveDeRegistro ``"
    Write-Host "-Clave registry::HKU:\.Default\TIA\Nominas ``"
    Write-Host "-Usuarios ""TIA\Filemon"",""TIA\Ofelia"" -Permisos" `
               """TakeOwnership"""
    Write-Host
    Write-Host
    Write-Host

} # Mostrar-Ayuda


Function Comprobar-Parametros()
{
#***********************************************************************
#* Procedimiento: Comprobar-Parametros                                 *
#* Tipo         : Función                                              *
#* Devolución   : Booleana                                             *
#* Fecha y Hora : 20/01/2010 15:23:07                                  *
#* Autor        : Fernando Reyes                                       *
#*¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*
#* Propósito    : Esta función comprueba si se han pasado los          *
#*                parámetros requeridos y con valor. En caso de no     *
#*                haberse pasado se devuelve $false y se invoca a la   *
#*                ayuda en línea, pasandole al método de ayuda una     *
#*                cadena con los errores detectados.                   *
#***********************************************************************

    # Si se ha pasado el método de invocar la ayuda, se muestra éste y se
    # sale de la función devolviendo false
    If($Ayuda -eq $true)
    {
        Mostrar-Ayuda ""
        Return $false    
    }
    
    # Creamos un array dinámico donde iremos guardando los nombres de los
    # parámetros que falten
    $Faltan = @()
    
    # Comprobamos si se ha pasado la ruta de la clave
    If($Clave -eq $null -or $Clave -eq "")
    {
        $Faltan += "Clave"
    }

    # Comprobamos si se ha pasado el/os usuario/s y/o grupo/s a los que
    # afectará la ACE a crear
    If($Usuarios -eq $null -or $Usuarios -eq "")
    {
        $Faltan += "Usuarios"
    }

    # Comprobamos si se han pasado los permisos que se establecerán con la ACE
    If($Permisos -eq $null -or $Permisos -eq "")
    {
        $Faltan += "Permisos"
    }

    # Si están todos los parámetros requeridos, se sale de la función
    # devolviendo $true
    If($Faltan.Count -eq 0)
    {
        Return $true
    }
    Elseif($Faltan.Count -eq 1)
    {
        # Falta un parámetro requerido; montamos el mensaje, invocamos la ayuda
        # pasando el mensaje y salimos de la función devolviendo $false
        $Mensaje = "Falta el parámetro requerido " + $Faltan[0]
        Mostrar-Ayuda $Mensaje
        Return $false
    }
    Else
    {    
    
        # Falta más de un parámetro requerido. Iniciamos el mensaje
        $Mensaje = "Faltan los parámetros requeridos "
        
        # En est bucle recorremos los elementos del array para ir completando
        # el mensaje
        For($i=0;$i -lt $Faltan.Count;$i++)
        {
             If($i -eq 0)
             {
                 # Si es el primer elemento del array, tan solo hay que
                 # concatenarlo al mensaje
                 $Mensaje = $Mensaje + $Faltan[$i]
             }
             ElseIf($i -eq ($Faltan.Count - 1))
             {
                 # Si es el último elemento del array, hay que poner " y " entre
                 # el mensaje montado hasta ahora y el nombre del parámetro
                 $Mensaje = $Mensaje + " y " + $Faltan[$i]
             }
             Else
             {
                 # Al no ser ni el primero ni el último elemento del array,
                 # debemos separar el nombre del parámetro del mensaje montado
                 # hasta ahora con una coma.
                 $Mensaje = $Mensaje + ", " + $Faltan[$i]
             }
        }
        # Una vez montado el mensaje, invocamos la ayuda pasando el mensaje
        # y se salimos de la función devolviendo $false
        Mostrar-Ayuda $Mensaje
        Return $false
    }
} #Comprobar-Parametros

# Cuerpo del script

If(Comprobar-Parametros -eq $true)
{
    # Obtenemos la ACL de la clave
    $ACL = Get-Acl -Path $Clave
    
    # Establecemos la herencia si corresponde, en caso contrario no la
    # establecemos
    If ($Herencia -eq $true)
    {
        $strHerencia = [string] "ContainerInherit, ObjectInherit"
    }
    Else
    {
        $strHerencia = [string] "None"
    }
    $objHerencia = [System.Security.AccessControl.InheritanceFlags] $strHerencia
    
    # Establecemos la propagación si corresponde, en caso contrario no la
    # establecemos
    If ($Propagacion -eq $true)
    {
        $strPropagacion = [string] "InheritOnly"
    }
    Else
    {
        $strPropagacion = [string] "None"
    }
    $objPropagacion = `
                [System.Security.AccessControl.PropagationFlags] $strPropagacion
    
    # Establecemos los permisos. Se trata de una cadena de valores separados
    # por comas; estos valores pueden ser QueryValues, SetValue, CreateSubKey,
    # EnumerateSubKeys, Notify, CreateLink, Delete, ReadPermissions, WriteKey,
    # ExecuteKey, ReadKey, ChangePermissions, TakeOwnership y FullControl.
    $objPermisos = [System.Security.AccessControl.RegistryRights] $Permisos
    
    #Establecemos si se trata de una denegación o de una concesion
    If ($Denegacion -eq $true)
    {
        $Tipo = [System.Security.AccessControl.AccessControlType] "Deny"
    }
    Else
    {
        $Tipo = [System.Security.AccessControl.AccessControlType] "Allow"
    }
    
    # Ya tenemos todo lo referente a los permisos, ahora recorremos el array
    # de descriptores de identidad (en formato NT para ir agregando a la ACL una
    # ACE por cada uno de ellos
    ForEach($Usuario In $Usuarios)
    {
        $Identidad = [System.Security.Principal.NTAccount] $Usuario
        
        # Creamos la ACE
        $ACE = New-Object System.Security.AccessControl.RegistryAccessRule(`
                                $Identidad, $objPermisos, $objHerencia, `
                                $objPropagacion, $Tipo)
                                
        # Agregamos la ACE a la ACL, reemplazando una existente referente al
        # usuario o no, según el modificador $Reemplazar
        If($Reemplazar -eq $true)
        {
            $ACL.ResetAccessRule($ACE)
        }
        Else
        {
            $ACL.AddAccessRule($ACE)
        }
        
    }
    
    # Una vez agregadas las nuevas ACEs a la ACL, la establecemos en la clave
    # con Set-Acl
    Set-Acl -Path $Clave -AclObject $ACL

    # Eliminamos las funciones
    Remove-Item function:Comprobar-Parametros
    Remove-Item function:Mostrar-Ayuda
}

 

 

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: