none
Script para comprobar en un servidor de File las carpetas con owner eliminado y permisos heredables activados RRS feed

  • Pregunta

  • Buenos dias ,

    Os comento el problema que estoy teniendo a ver si alguien de vosotros podria echarme una mano . Tengo una gran red de usuarios donde con el paso del tiempo se ha ido regenerando el personal . Ahora nos encontramos que un gran numero de carpetas tienen owners que son usuarios que ya borramos en su momento.

    Esas carpetas han cojido un SID de usuario borrado , y ahora estoy intentando hacer un script que me muestre las carpetas cuyos permisos son heredables y las carpetas con owners borrados . He estado cotilleando sobre icacls.exe y takeown pero no veo resultados .No consigo hacer un script que me muestre de todas las carpetas ,las que tengan un owner borrado y si tienen activada la opcion de heredar permisos .

    Podriais echarme una mano?

    Muchisimas gracias ;

    Jordi R.

    jueves, 26 de mayo de 2016 6:56

Todas las respuestas

  • Alguien podria echarme una mano? Sigo buscando sin exito :(
    martes, 31 de mayo de 2016 7:26
  • Hola,

    ¿Solo quieres saber que carpetas son o también quieres cambiar automáticamente el propietario para que se pueda eliminar el SID huerfano?

    Díme que necesitas y te preparo un script.

    Un saludo.

    Diego Fernández

    martes, 31 de mayo de 2016 8:00
  • Bueno, como tenía un hueco libre, me he entretenido en hacerte un script, que aunque a lo mejor no hace todo lo que quieres, por lo menos te dará información y una base para llegar a tu objetivo.

    El script está basado en el módulo powershell NTFSSecurity de Raimund Andrée:

    https://ntfssecurity.codeplex.com/downloads/get/639442

    Necesitarás descargarlo y instalarlo. En la página tienes todas las instrucciones.

    Para los "puristas". Este script puede hacerse con mucho menos código, incluso es posible hacerlo en una línea, pero lo hago así de modo que el código sea mas legible y el destinatario pueda modificarlo fácilmente para que haga todo lo que necesita. Además, no soy ningún experto, de modo que así también me resulta mas sencillo.

    Una vez tengas el módulo, ejecutas el script y le pasas como primer parámetro la ruta "raiz" en la que quieres buscar, y como segundo parámetro el grupo o usuario que querrías que fuera el nuevo propietario de las carpetas huerfanas.

    Durante la ejecución, te preguntará si deseas cambiar el propietario o únicamente ver que carpetas son.

    #Requires -Modules NTFSSecurity
    #Requires -Version 3
    [CmdletBinding()]
    Param
    (
    	[Parameter(Mandatory=$True,
      		Position = 0,
    		HelpMessage = "Indica la ruta local o UNC")]
    	[Alias("Path")]
    	[ValidateNotNullOrEmpty()]
      	[string]$UNCPath,
    	
    	[Parameter(Mandatory=$False,
      		Position = 1,
    		HelpMessage = "Indica el nuevo propietario")]
    	[ValidateNotNullOrEmpty()]
      	[string]$Owner = "BUILTIN\Administrators"
    )
    
    Clear-Host;
    $Error.Clear();
    
    #Region Init
    #Load modules needed
    $Modules = "NTFSSecurity"
    ForEach ($Module in $Modules)
    {
    	If ((Get-Module | ForEach-Object {$_.Name}) -notcontains $Module)
    	{
    		Import-Module $Module
    	}
    }
    
    #Initialize script variables
    $ScriptVariables = "Progress","Folders", "Folder","Modules", "Module", "FolderRights", "Var", "NullOwners", "NullOwner"
    ForEach ($Var in $ScriptVariables)
    {
    	$Var = $null;
    }
    #EndRegion Init
    
    Try
    {
    	#Test if folder supplied from arguments is valid
    	If (Test-Path $UNCPath)
    	{
    		#Read folders recursive
    		$Folders = @()
    		$Folders += Get-Item -Path $UNCPath
    		$Folders += Get-ChildItem2 -Path $UNCPath -Directory -Recurse 
    		$Progress = 0
    		$NullOwners = @()
    		ForEach ($Folder in $Folders)
    		{
    			$Progress++
    			$Activity = "Localizando carpetas con propietario huerfano"
    			Write-Progress -Activity $Activity -CurrentOperation $Folder -PercentComplete (($Progress / $Folders.Count)  * 100) -ErrorAction SilentlyContinue
    			$NullOwner = Get-NTFSOwner -Path $Folder | Where-Object { $_.Owner.AccountName -eq "" }
    			$NullOwners += $NullOwner
    			
    		}
    		$ChangeOwner = Read-Host -Prompt "¿Deseas cambiar el propietario de las carpetas huerfanas? (S/N)"
    		If (($ChangeOwner -eq "S") -or ($ChangeOwner -eq "s"))
    		{
    			$Progress = 0
    			ForEach ($Folder in $NullOwners)
    			{
    				$Progress++
    				#Asign new owner to every folder
    				$Activity = "Asignando $Owner como propietario..."
    				Write-Progress -Activity $Activity -CurrentOperation $Folder -PercentComplete (($Progress / $NullOwners.Count)  * 100) -ErrorAction SilentlyContinue
    				Set-NTFSOwner -Path $Folder -Account $Owner
    			}
    		}
    		ElseIf (($ChangeOwner -eq "N") -or ($ChangeOwner -eq "n"))
    		{
    			Write-Output "No se cambiará el propietario de las carpetas."
    			Write-Output "Las carpetas con propietario huerfano son:"
    			$NullOwners | Format-Table -AutoSize -Wrap
    		}
    		Else
    		{
    			Write-Output "No se reconoce la respuesta."
    		}
    	}
    	Else
    	{
    		Write-Host -Foreground "Red" "ERROR: La ruta indicada no existe o no es accesible."
    		return
    	}
    }
    Catch
    {
    	Write-Output "Error en $Folder"
    	Write-Output $Error;
    }
    Finally
    {
    	#Clean
    	ForEach ($Module in $Modules)
    	{
    		If ((Get-Module | ForEach-Object {$_.Name}) -contains $Module)
    		{
    			Remove-Module $Module
    		}
    	}
    	ForEach ($Var in $ScriptVariables)
    	{
    		Remove-Variable $Var -ErrorAction SilentlyContinue
    	}
    }
    
    <#
        .SYNOPSIS
            Locate orphaned owners and optionaly set new owner on child folders from path supplied
    
        .DESCRIPTION
    		Script to change owner of recursive folders from UNC Path supplied. 
    		Require Powershell module NTFSSecurity.
    		
        .Parameter Environment
            UNCPach. Posibles values are: any UNC Path or any local Path.
    		Owner. Not required. Posibles values are: Domain/Local User or Domain/local Group. Default value BUILTIN\Administrators
    
        .EXAMPLE
            .\Set-FolderOwner.ps1 -Path "\\server\share\folder" -Owner "BUILTIN\Administrators"
                
        .FUNCTIONALITY
            PowerShell Language
    
        .NOTES
    		Credit to Raimund Andrée by NTFSSecurity Powershell module. https://social.technet.microsoft.com/profile/raimund%20andr%C3%A9e/
            Credit to Diego Fernández.
    #>

    Espero que te sirva.

    Un saludo.

    Diego.

    martes, 31 de mayo de 2016 11:14