Home Uncategorized PowerShell: Trabajando con el sistema de archivos y permisos NTFS

PowerShell: Trabajando con el sistema de archivos y permisos NTFS

by José Luis Sánchez Borque

Una tarea básica en cualquier Sistema Operativo es trabajar con el sistema de archivos. En el caso de Windows  NTFS

Podemos empezar por lo más sencillo que es examinar la estructura de carpetas y archivos. Vamos el equivalente del Dir de toda la vida..

Podemos ver el cmdLet asociado al Dir (lo que conocemos como alias) de la siguiente manera:

PS C:\> alias dir

CommandType Name Version Source
----------- ---- ------- ------
Alias dir -> Get-ChildItem

Así pués podemos utilizar Get-ChildItem para examinar las carpetas y archivos del directorio actual. En el ejemplo C:\

PS C:\> Get-ChildItem

 Directory: C:\

Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 08/02/2018 6:39 datos
d----- 16/07/2016 15:23 PerfLogs
d-r--- 09/01/2018 11:10 Program Files
d----- 16/07/2016 15:23 Program Files (x86)
d-r--- 09/01/2018 11:05 Users
d----- 09/01/2018 11:45 Windows

Podemos hacer búsquedas más depuradas con los parámetros oportunos. Por ejemplo buscar todos los archivos con extensión .csv en todo el disco duro.

PS C:\> Get-ChildItem c:\ -Include *.csv -Recurse

 Directory: C:\Windows\System32\adprep

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 09/01/2018 11:39 1524500 00232167-f3a4-43c6-b503-9acb7a81b01c.dcpromo.csv
-a---- 09/01/2018 11:39 1508276 134428a8-0043-48a6-bcda-63310d9ec4dd.dcpromo.csv
-a---- 09/01/2018 11:39 1548004 4444c516-f43a-4c12-9c4b-b5c064941d61.dcpromo.csv
-a---- 09/01/2018 11:39 1508734 a662b036-dbbe-4166-b4ba-21abea17f9cc.dcpromo.csv

 Directory: C:\Windows\WinSxS\amd64_microsofe_2b27920f7d2fb9f3

Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 08/02/2018 5:24 12 00232167-f3a4-43c6-b503-9acb7a81b01c.dcpromo.csv
-a---- 08/02/2018 5:24 12 134428a8-0043-48a6-bcda-63310d9ec4dd.dcpromo.csv
-a---- 08/02/2018 5:24 12 4444c516-f43a-4c12-9c4b-b5c064941d61.dcpromo.csv
-a---- 08/02/2018 5:24 12 a662b036-dbbe-4166-b4ba-21abea17f9cc.dcpromo.csv

Podemos crear una carpeta con New-Item

PS C:\>New-Item -path c:\datos -type directory

Podemos incluso utilizar bucles para crear estructuras con un patrón común, valido para colegios, cursos, etc

PS C:\>foreach ($in in 1..10) { new-item -path c:\datos\usuario$in -type directory }

Si nos hemos equivocado podemos borrar la carpeta que queramos.

C:\PS>Remove-Item C:\datos\usuario1

O borrar desde la carpeta donde estamos (ojo!!!!) todos los archivos .doc.

C:\PS>Remove-Item * -Include *.doc

Podemos también utilizar Get-Acl para ver la Lista de Control de Acceso (ACL) de la carpeta o archivo

PS C:\> Get-Acl -Path "c:\datos" | format-list

Path : Microsoft.PowerShell.Core\FileSystem::C:\datos
 Owner : BUILTIN\Administrators
 Group : PROFE\Domain Users
 Access : NT AUTHORITY\SYSTEM Allow FullControl
 BUILTIN\Administrators Allow FullControl
 BUILTIN\Users Allow ReadAndExecute, Synchronize
 BUILTIN\Users Allow AppendData
 BUILTIN\Users Allow CreateFiles
 CREATOR OWNER Allow 268435456
 Audit :
 Sddl : O:BAG:DUD:AI(A;OICIID;FA;;;SY)(A;OICIID;FA;;;BA)(A;OICIID;0x1200a9;;;BU)(A;CIID;LC;;;BU)(A;CIID;DC;;;BU)(A;OIC
 IIOID;GA;;;CO)

Podemos hacerlo de varias formas, como siempre…

PS C:\> $acl = ((Get-Item c:\datos).GetAccessControl('Access'))
PS C:\> echo $acl

Path Owner Access
 ---- ----- ------
 NT AUTHORITY\SYSTEM Allow FullControl...

Una más…

PS C:\> $acl = ((Get-Item c:\datos).GetAccessControl('Access')).access
PS C:\> echo $acl

FileSystemRights : FullControl
 AccessControlType : Allow
 IdentityReference : NT AUTHORITY\SYSTEM
 IsInherited : True
 InheritanceFlags : ContainerInherit, ObjectInherit
 PropagationFlags : None

FileSystemRights : FullControl
 AccessControlType : Allow
 IdentityReference : BUILTIN\Administrators
 IsInherited : True
 InheritanceFlags : ContainerInherit, ObjectInherit
 PropagationFlags : None

FileSystemRights : CreateFiles
 AccessControlType : Allow
 IdentityReference : BUILTIN\Users
 IsInherited : True
 InheritanceFlags : ContainerInherit
 PropagationFlags : None

FileSystemRights : 268435456
 AccessControlType : Allow
 IdentityReference : CREATOR OWNER
 IsInherited : True
 InheritanceFlags : ContainerInherit, ObjectInherit
 PropagationFlags : InheritOnly

Encontraremos en el siguiente enlace información para cambiar los permisos desde PowerShell “puro”

Cambiar los permisos NTFS desde PowerShell

Veamos un ejemplo….. sencillo

PS C:\> $acl = ((Get-Item c:\datos).GetAccessControl('Access'))
PS C:\> $ar = new-object System.Security.AccessControl.FileSystemAccessRule("demo", 'Modify','ContainerInherit,ObjectInherit', 'None', 'Allow')
PS C:\> $acl.SetAccessRule($ar)
PS C:\> set-acl -Path c:\datos -AclObject $acl
PS C:\> $acl = ((Get-Item c:\datos).GetAccessControl('Access'))
PS C:\> echo $acl

Personalmente utilizo en este caso iCacls para cambiar los permisos. Evolución de la instrucción Cacls. ¿Porqué? Por la simplicidad de la intrucción versus la que os he puesto en el ejemplo anterior.

Para asignar el permiso de Modify al usuario demo, utilizamos la siguiente instrucción:

PS C:\> icacls c:\datos /grant demo:M

Podemos complicar la instrucción añadiendo Full Control al grupo “Administrators”, y bloquear la herencia sobre dicha carpeta.

PS C:\> icacls c:\datos /grant demo:m administrators:f /inheritance:r
  
processed file: c:\datos Successfully processed 1 files; Failed processing 0 files

Veamos los permisos establecidos:

PS C:\> icacls c:\datos
 c:\datos BUILTIN\Administradores:(F)
 IA\demo:(M)

Compartiendo carpetas

Veamos como podemos compartir carpetas mediante powershell. En primer lugar podemos ver que cmd-lets afectan al tema de recursos compartidos con la siguiente instrucción:

PS C:\> Get-Command -module storage -name "*fileshare"

CommandType Name              Version Source
----------- ----              ------- ------
Function    Debug-FileShare   2.0.0.0 storage
Function    Get-FileShare     2.0.0.0 storage
Function    New-FileShare     2.0.0.0 storage
Function    Remove-FileShare  2.0.0.0 storage
Function    Set-FileShare     2.0.0.0 storage

Veamos en primer lugar que recursos compartidos tenemos:

PS C:\> Get-FileShare -Protocol SMB

Name     HealthStatus  OperationalStatus
----     ------------  -----------------
ADMIN$   Healthy       Online
C$       Healthy       Online
NETLOGON Healthy       Online
SYSVOL   Healthy       Online

Podemos ver la información detallada de cualquier de ellos:

PS C:\> Get-FileShare -name netlogon | select *

HealthStatus : Healthy
OperationalStatus : Online
ShareState : Online
FileSharingProtocol : SMB
ObjectId : {1}\\W2016AD\root/Microsoft/Windows/Storage/Providers_v2\WSP_FileShare.ObjectId="{5cf061d6-f524
 -11e7-965c-806e6f6e6963}:FX:SMB||*||NETLOGON"
PassThroughClass :
PassThroughIds :
PassThroughNamespace :
PassThroughServer :
UniqueId : smb|W2016AD.profe.local/NETLOGON
ContinuouslyAvailable : False
Description : Logon server share
EncryptData : False
Name : NETLOGON
VolumeRelativePath : Windows\SYSVOL\sysvol\profe.local\SCRIPTS
PSComputerName :
CimClass : ROOT/Microsoft/Windows/Storage:MSFT_FileShare
CimInstanceProperties : {ObjectId, PassThroughClass, PassThroughIds, PassThroughNamespace...}
CimSystemProperties : Microsoft.Management.Infrastructure.CimSystemProperties

Y como es evidente saber los permisos sobre dicho recurso compartido:

PS C:\> Get-SmbShareAccess netlogon

Name       ScopeName AccountName            AccessControlType AccessRight
----       --------- -----------            ----------------- -----------
NETLOGON   *         Everyone               Allow             Read
NETLOGON   *         BUILTIN\Administrators Allow             Full

Veamos como crear un nuevo recurso compartido.  La explicación de los parámetros está clara con la siguiente instrucción:

PS C:\> New-SmbShare -Name "Demo" -Path "C:\datos\demo" -FullAccess "Everyone"

Name ScopeName Path             Description
---- --------- ----             -----------
Demo *         C:\datos\demo

Vamos a verificar que todo está ok.

PS C:\> Get-SmbShareAccess demo

Name  ScopeName  AccountName  AccessControlType AccessRight
----  ---------  ----------- ----------------- -----------
Demo  *          Everyone     Allow            Full

Ojo que el grupo EveryOne es Todos en las versiones en castellan

Podemos hacer lo propio con el permiso de Change, y verificar que todo esté correcto.

PS C:\> New-SmbShare -Name "Prueba" -Path "C:\datos\prueba" -ChangeAccess "Everyone"

Name   ScopeName  Path              Description
----   ---------  ----              -----------
Prueba *          C:\datos\prueba
PS C:\> Get-SmbShareAccess prueba

Name    ScopeName AccountName AccessControlType  AccessRight
----    --------- ----------- -----------------  -----------
Prueba  *         Everyone    Allow              Change

Podemos también borrarlos de la siguiente manera:

PS C:\> Get-FileShare -Protocol SMB

Name     HealthStatus OperationalStatus
----     ------------ -----------------
ADMIN$   Healthy      Online
C$       Healthy      Online
Demo     Healthy      Online
NETLOGON Healthy      Online
Prueba   Healthy      Online
SYSVOL   Healthy      Online

PS C:\> Remove-SmbShare -Name Prueba -force

PS C:\> Remove-SmbShare -Name Demo -force

PS C:\> Get-FileShare -Protocol SMB

Name     HealthStatus OperationalStatus
----     ------------ -----------------
ADMIN$   Healthy      Online
C$       Healthy      Online
NETLOGON Healthy      Online
SYSVOL   Healthy      Online

Os dejo en este video una demostración de la asignación de permisos sobre carpetas:

Asignar permisos NTFS con iCacls desde PowerShell

 

Leave a Comment