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
1 comment
Eres un figura… Gracias Saludos