Listar los permisos de acceso a la carpeta del usuario

14

Tengo un usuario en un dominio que tiene acceso a múltiples subcarpetas en varias carpetas. Sus derechos se definieron de manera bastante granular. Ahora deja la empresa, pero seguirá trabajando para una empresa como recurso contratado.

Necesito encontrar todas las carpetas a las que tuvo acceso y revocar sus permisos, luego configurarlo con un conjunto diferente de permisos de acceso.

¿Existe alguna herramienta (freeware, preferiblemente) que enumere todos los permisos NTFS para un usuario determinado? He intentado con AccessEnum de Sysinternals, pero la lista no se puede filtrar por nombre de usuario y es inútil para mí. También he mirado CACLS, pero por lo que puedo decir, muestra permisos ordenados por archivo, no por usuario.

¿Algunas ideas?

imagodei
fuente
1
Es por eso que siempre debe otorgar membresía basada en grupos, incluso si solo hay un usuario en el grupo. Podrías haberlo eliminado del grupo. Mientras tanto, mientras espera una respuesta, puede deshabilitar su cuenta en AD.
MDMarra
¿Probaste esta herramienta: AccessChk v5.0? Como parte de garantizar que han creado un entorno seguro, los administradores de Windows a menudo necesitan saber qué tipo de acceso tienen los usuarios o grupos específicos a recursos que incluyen archivos, directorios, claves de registro, objetos globales y servicios de Windows. AccessChk responde rápidamente estas preguntas con una interfaz y salida intuitivas. Encontrado aquí: technet.microsoft.com/en-us/sysinternals/bb664922.aspx
Luke99
@ MarkM: Tan cierto ... Es solo que cuando el usuario necesita acceder a una sola carpeta, lo agrega. Luego, en pocos meses, necesita otro acceso a un recurso compartido completamente diferente. Y en pocos meses nuevamente en 2 o 3 carpetas. ¿Cómo se crea un grupo con un nombre significativo para dicho usuario? "Username_granular_access_group"? Esto probablemente haría el truco. @ Luke99: herramienta interesante de Sysinternals. ¿Cómo podría extrañarlo? De todos modos, veo que muestra todas las carpetas a las que el usuario tiene acceso directo o indirecto. ¿Hay alguna manera de mostrar solo las carpetas donde el usuario está explícitamente listado en ACL (excluyendo el acceso a través de grupos)?
imagodei

Respuestas:

13

Esto parece hacer el truco (quizás con una advertencia), para encontrar todas las carpetas a las que el usuario "someuser" tiene acceso, en este ejemplo en la unidad C, utilizando el comando icacls incorporado de Windows:

icacls c:\*. /findsid someuser /t /c /l

El / t es necesario para indicarle que repita directorios. El / c es necesario para indicarle que continúe, incluso si encuentra errores. El / l hace que funcione con enlaces simbólicos (si los hay). (Esa última es una L, y estas banderas pueden ser mayúsculas o minúsculas).

Los *.antiguos de DOS lo reconocerán como la forma de decir "buscar directorios, no archivos". Por supuesto, si desea buscar archivos y no carpetas, cámbielos *.*y, por supuesto, puede apuntarlos a cualquier unidad o ejecutarlos desde cualquier carpeta y dejar la ruta de la unidad / carpeta y dejar que busque en relación con eso solo carpeta

Busqué la misma respuesta que el OP, y encontré esta entrada, pero me decepcionó ver solo una oferta basada en una herramienta descargable. Como otros, preferí usar algo incorporado, y lo encontré en esta herramienta icacls.

Y he confirmado que funciona en Windows Server 2012, 2008 y Windows 7, por lo que sospecho que funcionará también en Server 2003, Windows 8, etc.

La lista resultante será carpetas indicadas línea tras línea, tales como:

SID encontrado: c: \ somedir \ somesubdir.

Tenga en cuenta que si ejecuta esto como un usuario que no tiene permisos para recorrer algunos directorios, obtendrá errores intercalados en los resultados, tales como:

c: \ Información del volumen del sistema: acceso denegado.

Y si puede estar buscando una unidad completa, eso podría dar lugar a cientos de tales errores, lo que dificultaría encontrar dentro de ellos los resultados.

Algunos pueden pensar que la respuesta es ejecutar la línea de comando como administrador, pero eso simplemente provocará que aparezcan muchos más errores, ya que ahora atravesará carpetas que anteriormente estaban ocultas.

Ahora, si estaba interesado en ocultar esos errores, no podrá usar un comando de búsqueda para canalizar solo los resultados que sí tienen éxito (los que sí se refieren a "SID encontrado"), porque los errores NO se filtrarán por la tubería al comando encontrar. En cambio, si desea eliminar todos los errores, debe utilizar el truco bastante oscuro de redirigir la secuencia de errores (stderr) al "depósito de bits" mediante el uso 2>nul:. Entonces el ejemplo anterior se convertiría en:

icacls c:\*. /findsid someuser /t /c /l 2>nul:

Solo tenga en cuenta que algunas de las carpetas que generaron tales errores, cuyos errores ahora están ocultos, bien pueden ser carpetas a las que el "usuario" tiene acceso, pero que USTEDES no tienen. Por lo tanto, puede pensar dos veces antes de simplemente ignorar estos errores. pero si quieres, así es como puedes hacerlo.

Me doy cuenta de que esa posibilidad limita el valor de esta respuesta. Si alguien con más familiaridad con las cosas quisiera ampliar o corregir mi respuesta, lo agradecería.

charlie arehart
fuente
Parece que debería ser obvio, pero vale la pena señalar: Buscando *. NO es igual a buscar directorios solamente, o todos los directorios. Los nombres de directorio pueden tener extensiones y los archivos no tienen que tener extensiones. Si quieres ser minucioso, déjalo buscar todo.
Scott E
6

Puede usar PowerShell sin necesidad de descargar nada más. Esto funcionará con v2.0 y posterior:

$ReferenceAccountName = 'DOMAIN\Username'
[string[]]$SearchDirectories = @('X:\SomeDirectory', 'F:\AnotherDirectory')

foreach ($RootDir in $SearchDirectories) {
    $DirACL = Get-Acl -Path $RootDir
    foreach ($ACL in $DirACL.Access){
        if ($ACL.IdentityReference -like $ReferenceAccountName){
            Write-Output $RootDir
        }
    }
    foreach ($Directory in (Get-ChildItem -Path $RootDir -Recurse | `
                            Where-Object -FilterScript {$_.Attributes `
                            -contains 'Directory'})){
        $DirACL = Get-Acl -Path $Directory.FullName
        foreach ($ACL in $DirACL.Access){
            if ($ACL.IdentityReference -like $ReferenceAccountName){
                Write-Output $Directory.FullName
            }
        }
    }
}

No es tan limpio como lo que está disponible con PowerShell v3 y encendido, pero funcionará. Esto generará una lista de los directorios encontrados en formato de cadena.

Puede generarlos fácilmente como objetos y continuar trabajando con ellos (exportarlos a un archivo CSV, eliminar las entradas a medida que las encuentre, actualizar un ticket con la información ... etc.) manipulando el objeto de entrada de Write- Llamadas de salida.

Jon
fuente
¿Sería también posible "excluir" los permisos heredados? (es decir, buscar en todas las carpetas, donde se ha agregado "DOMINIO \ Nombre de usuario" de manera explícita
dognose
1
Sí, puedes:if ($ACL.IdentityReference -like $ReferenceAccountName -and !$ACL.IsInherited){
dognose
3

Encontré una solución a mi propia pregunta. Es, creo, muy simple y limpio. Solo tiene que instalar subinacl y ejecutar una línea desde el símbolo del sistema.

Puedes descargar subinacl aquí . Aunque oficialmente solo es compatible con Windows 2000, Windows XP y Windows Server 2003, también debería funcionar en Windows Vista, Windows Server 2008 y Windows 7.

A continuación, ejecuta lo siguiente desde el símbolo del sistema:

subinacl /testmode /noverbose /outputlog=c:\TEXTFILENAME.TXT /subdirectories=directoriesonly X:\*.* /findsid=DOMAIN\username

Donde X: es la unidad que está escaneando y el nombre de usuario es el usuario cuyos permisos desea enumerar. El escaneo puede llevar algo de tiempo y obtienes los resultados en TEXTFILENAME.TXT.

Si usa el interruptor / noverbose , obtendrá una lista compacta de permisos de acceso, básicamente verá a qué directorios tiene acceso el usuario (con máscaras de acceso y algunas otras cosas que pueden ser útiles a veces).

Utilicé OpenOffice Calc para importar la lista y luego apliqué un filtro personalizado y filtré solo para aquellas líneas que comienzan con + FILE . Estas líneas contienen directorios a los que el usuario tiene acceso. Así es como al usar herramientas simples, terminas con solo información relevante.

Dado que la herencia a menudo está habilitada en los directorios principales, la cantidad real de directorios que puede necesitar visitar para ajustar los permisos suele ser significativamente menor que la lista misma.

imagodei
fuente