Get-ItemProperty para inspeccionar atributos y cifrado de archivos en Windows

Última actualización: 10/10/2025
Autor: Isaac
  • Interpreta atributos EFS y OneDrive convirtiendo el entero a System.IO.FileAttributes y comprobando banderas.
  • Usa Get-ItemProperty en FileSystem y Registro; evita sorpresas remotas con Out-String o leyendo valores concretos.
  • Complementa EFS con CMS (Protect/Unprotect-CmsMessage) para cifrado de contenido portable.

Atributos de archivos cifrados en Windows con PowerShell

Si trabajas con Windows y PowerShell, tarde o temprano necesitarás inspeccionar los atributos de archivos y carpetas cifrados, ya sea por el Cifrado EFS nativo, por ficheros protegidos via CMS o por el comportamiento de OneDrive Files On-Demand que añade banderas especiales al sistema de archivos. En todos esos escenarios, Get-ItemProperty es la llave inglesa que te permite leer propiedades con precisión y, además, moverte con soltura por el Registro y otros almacenes gracias a los proveedores de PowerShell.

En esta guía te explico, con ejemplos reales y varias técnicas, cómo consultar, interpretar y diagnosticar atributos (incluyendo los específicos de la nube), cómo enumerar y leer valores del Registro con el mismo cmdlet, cómo evitar trampas al ejecutar remotamente y cómo complementar el cifrado de archivos con el ecosistema CMS para cifrar/descifrar contenido. Todo ello, con comandos listos para copiar y pegar, y buenas prácticas para que no te dejes nada por el camino.

Qué es Get-ItemProperty y por qué es clave para atributos y Registro

Uso de Get-ItemProperty en PowerShell

El cmdlet Get-ItemProperty obtiene propiedades de los elementos que exponen los proveedores de PowerShell. Eso incluye archivos y carpetas (FileSystem), pero también claves y valores del Registro, certificados, variables de entorno, alias, etc. En el caso del sistema de archivos, nos interesa especialmente la propiedad Attributes, que encapsula las banderas del fichero o directorio, entre ellas Encrypted (EFS) y los indicadores de OneDrive como Pinned, Unpinned o RecallOnDataAccess.

La sintaxis más usada es directa: Get-ItemProperty <String[]>. Puedes filtrar por nombre de propiedad con -Name, pasar rutas literales con -LiteralPath y usar -Filter, -Include y -Exclude cuando el proveedor lo soporta (FileSystem sí). Además, CommonParameters como -Verbose, -ErrorAction o -OutVariable están disponibles para mejorar el diagnóstico mientras inspeccionas atributos delicados.

Sintaxis y parámetros esenciales (con enfoque en FileSystem y Registro)

Para trabajar cómodo conviene tener a mano la sintaxis admitida por el cmdlet, tanto con rutas habituales como con rutas literales donde no quieres interpretación de comodines:

Ejemplo de sintaxis A:
Get-ItemProperty <String[]> <String[]>] >] >]

Ejemplo de sintaxis B:
Get-ItemProperty <String[]>] -LiteralPath <String[]> >] >]

Los parámetros más útiles para nuestro cometido son -Path y -Name (para seleccionar propiedades concretas), -LiteralPath (evita que se interpreten comodines), los selectores -Include y -Exclude (operan sobre el contenido cuando incluyes comodines, por ejemplo C:\Windows\*), y el -Filter del proveedor FileSystem que es más eficiente a nivel de motor que filtrar después en PowerShell.

Un apunte práctico: -Credential existe, pero su utilidad con FileSystem locales es limitada; cobra sentido en proveedores remotos o cuando montas PSDrives con credenciales. Y no olvides que el cmdlet acepta rutas del Registro del tipo HKLM:\ y Registry::, lo que te permite trabajar con llaves y valores como si fueran ficheros, algo que facilita mucho las auditorías.

Ejemplos rápidos para entrar en calor

Veamos algunos ejemplos sencillos que sientan las bases antes de meternos de lleno con EFS y OneDrive:

Inspeccionar un directorio concreto y ver todas sus propiedades disponibles (Attributes incluido):
Get-ItemProperty C:\Windows

Listar todas las propiedades de un archivo concreto en formato de lista, algo útil cuando quieres ver si aparece Encrypted o banderas de nube:
Get-ItemProperty C:\Test\Weather.xls | Format-List

Registro: leer el valor ProgramFilesDir en CurrentVersion, útil cuando automatizas inventario:
Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name 'ProgramFilesDir'

Registro: listar todas las entradas bajo PowerShellEngine para ver nombres y datos de valores:
Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine

Interpretar correctamente los atributos: EFS, OneDrive y el resto de banderas

El campo Attributes es un flags enum de .NET () que puede devolverse como texto («Hidden, ReadOnly, …») o como número entero cuando lo consultas en ciertos contextos (por ejemplo, algunas rutas de OneDrive con Get-ItemProperty). Para no perderte, lo mejor es convertir explícitamente el valor a la enumeración y comprobar banderas individuales.

  He aquí cómo encontrar o determinar el número de modelo de mi teléfono Sony Xperia.

Comprobar si un archivo está cifrado con EFS (FILE_ATTRIBUTE_ENCRYPTED = 0x4000 = 16384):
$it = Get-ItemProperty -Path 'C:\ruta\fichero.ext';
$attr = $it.Attributes;
$esEfs = $attr.HasFlag(::Encrypted);
$esEfs

Convertir número: Si prefieres ver la traducción de un número «crudo» (por ejemplo, los que devuelve OneDrive), puedes hacer lo siguiente para obtener los nombres de banderas:
::ToObject(, 525328)

Con OneDrive Files On-Demand aparecen combinaciones que confunden porque suman varias banderas «cloud» además de las clásicas (Directory, Archive, ReparsePoint, Offline…). Por ejemplo, valores vistos en escenarios reales:

  • 525328 (carpeta): corresponde a Directory (0x10) + ReparsePoint (0x400) + Pinned (0x80000). Suele significar «siempre disponible en este dispositivo».
  • 5248544 (archivo): se descompone como ReparsePoint (0x400) + Offline (0x1000) + SparseFile (0x200) + Archive (0x20) + Unpinned (0x100000) + RecallOnDataAccess (0x400000). Esto encaja con «disponible online» (solo en la nube).

Para validar tus descomposiciones con PowerShell, usa comprobaciones de banderas individuales contra el número original, así verás exactamente qué bits están activos:
$n = 5248544
$fa =
@('Directory','Archive','Hidden','System','ReadOnly','Compressed','Encrypted','Offline','ReparsePoint','SparseFile','Temporary','Pinned','Unpinned','RecallOnOpen','RecallOnDataAccess') |
ForEach-Object {
$flag = ::Parse($fa, $_)
'{0,-18} : {1}' -f $_, ((($n) -band $flag))
}

Si lo único que te interesa es distinguir cifrado EFS de «placeholder» de OneDrive, céntrate en estas banderas clave: Encrypted (EFS), Pinned, Unpinned, RecallOnOpen, RecallOnDataAccess, Offline y ReparsePoint. Así podrás diferenciar un archivo protegido localmente por EFS de uno que sólo existe como stub en la nube.

Respondiendo las dudas típicas sobre atributos OneDrive y cómo explorarlos

FAQ rápida: Con números como 525328 y 5248544 aparecen tres preguntas frecuentes. Te dejo aquí las respuestas prácticas para tu día a día:

1) ¿Qué significa 525328 en una carpeta OneDrive? Es la suma de Directory (0x10) + ReparsePoint (0x400) + Pinned (0x80000). En la práctica, indica que es una carpeta de OneDrive vinculada al proveedor de nube (reparse point) y marcada como «Siempre disponible» en local.

2) ¿Qué otros valores me puedo encontrar y cómo explorarlos? Verás combinaciones con Unpinned (0x100000), RecallOnOpen (0x40000), RecallOnDataAccess (0x400000), Offline (0x1000), además de las clásicas Archive, Hidden, System, etc. Para descodificarlas:

– Usa ::ToObject() para traducir números a nombres de banderas.

– O valida bit a bit con -band / HasFlag() como en el ejemplo anterior.

– Si prefieres ver texto directamente para archivos locales, Get-Item devuelve la propiedad Attributes ya «resuelta»: (Get-Item 'C:\ruta\fichero').Attributes.

3) ¿Hay más atributos de archivo además de los de OneDrive? Sí: Encrypted (EFS), Compressed, ReadOnly, Hidden, System, Archive, Temporary, NotContentIndexed, IntegrityStream, NoScrubData, etc. En PowerShell puedes explorarlos todos enumerando la clase:
::GetNames()

Comprobar y establecer el cifrado EFS desde PowerShell

Para verificar si un archivo está protegido con EFS, ya viste la comprobación con la bandera Encrypted. Si necesitas establecer el cifrado de manera rápida, puedes tirar del clásico cipher.exe o usar la propia propiedad Attributes:

Activar EFS con línea de comandos:
cipher /E "C:\ruta\fichero.ext"

PowerShell (sumando la bandera Encrypted):
$i = Get-Item 'C:\ruta\fichero.ext'
$i.Attributes = $i.Attributes -bor ::Encrypted

Si quieres deshabilitar EFS, basta con restar la bandera con -band -bxor o usar cipher /D, lo que te da un control fino sin salir de PowerShell y manteniendo automatizaciones coherentes con Get-ItemProperty.

Trabajar con el Registro: enumeración, lectura puntual y navegación

El Registro en PowerShell se trata como otro almacén más gracias al proveedor Registry. Las entradas de valores son propiedades de cada clave, así que para verlas con mejor formato lo ideal es usar Get-ItemProperty. Un flujo típico sería:

  Configurar el mensaje de "No molestar" en el iPhone

Ver nombres de entradas (propiedad «Property») de una clave:
Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion | Select-Object -ExpandProperty Property

Ver entradas con nombres y datos (formato legible):
Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

Puedes navegar con Set-Location y usar . para la ubicación actual, igual que en el sistema de archivos:
Set-Location -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion
Get-ItemProperty -Path .

Lecturas puntuales típicas con -Name para valores concretos:
Get-ItemProperty -Path HKLM:\Software\Microsoft\Windows\CurrentVersion -Name DevicePath

Para escribir o crear valores tienes los cmdlets hermanos: Set-ItemProperty, New-ItemProperty, Rename-ItemProperty y Remove-ItemProperty, con soporte para tipos como String, ExpandString, Binary, DWord, MultiString o QWord según RegistryValueKind.

Precaución con la ejecución remota: el caso de MachineGuid

Existe una peculiaridad curiosa con Invoke-Command y el proveedor del Registro: si ejecutas Get-Item sobre HKLM:\Software\Microsoft\Cryptography\ en remoto, puede que el valor MachineGuid que veas sea el de tu equipo local aunque el PSComputerName muestre la máquina remota. Esto parece estar relacionado con la serialización del objeto devuelto por el proveedor.

Para evitar lecturas equivocadas, fuerza una salida plana o consulta los valores con Get-ItemProperty. Estas dos variantes devuelven el MachineGuid correcto del equipo remoto:
Invoke-Command -ComputerName 'PC1' -ScriptBlock { Get-Item 'HKLM:\Software\Microsoft\Cryptography\' | Out-String }
Invoke-Command -ComputerName 'PC1' -ScriptBlock { Get-ItemProperty 'HKLM:\Software\Microsoft\Cryptography\' -Name 'MachineGuid' }

Cuando tu auditoría dependa de valores críticos de Registro, es mejor validar con Get-ItemProperty o serializar a cadena antes de traer la respuesta a la sesión local, evitando así resultados confusos.

Proveedores de PowerShell y PSDrives: el mapa para llegar a todo

Los proveedores de PowerShell son componentes .NET que exponen almacenes de datos como si fueran unidades (PSDrives). Gracias a ellos, cmdlets como Get-Item, Get-ChildItem, Get-ItemProperty o Set-Location funcionan igual en FileSystem, Registry, Environment, Certificate, Variable, Function, Alias o WSMan. Puedes listar proveedores con Get-PSProvider y ver PSDrives activos con Get-PSDrive.

Algunos cmdlets universales que usarás sin parar con proveedores son: Get-Location (gl), Set-Location (cd), Copy-Item (cpi), Get-Item (gi), Set-Item (si), Get-ChildItem (dir/ls), además de toda la familia ItemProperty para el Registro. Recuerda: los proveedores comparten los mismos verbos, así que mismo músculo, diferente almacén.

Unos ejemplos cortos para moverte con soltura:

  • Alias: Set-Location Alias: y Get-ChildItem para listar alias; filtra por nombre con -Name R* o Where-Object.
  • Environment: Set-Location Env: y Get-ChildItem para ver variables; crea una nueva con New-Item -Path . -Name MiVariable -Value 'texto'.
  • Registry: Set-Location HKLM:\Software, Get-ChildItem para claves, Get-ItemProperty para datos; crea/elimina con los cmdlets de ItemProperty.

Casos de uso que combinan Get-ItemProperty con auditoría del sistema

Cuando haces inventario o diagnóstico, Get-ItemProperty aparece en infinidad de recetas. Por ejemplo, para listar aplicaciones instaladas consultando las claves de desinstalación:
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* |
Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
Sort-Object InstallDate

O para ver el historial de actualizaciones in-place de Windows desde el Registro:
Get-ItemProperty -Path 'HKLM:\SYSTEM\Setup\Source OS*' |
Select-Object PSChildName, ProductName, ReleaseId, DisplayVersion, CurrentBuild

En otras áreas del sistema puedes complementar tu auditoría con cmdlets y utilidades bien conocidas (no todos usan Get-ItemProperty, pero se integran en tus scripts): Get-Hotfix, Get-WindowsUpdateLog, ipconfig /all, powercfg (energy, sleepstudy, waketimers), Get-CimInstance para dispositivos, monitores o volúmenes, o Get-NetAdapterAdvancedProperty para red. La idea es que, con los proveedores y el Registro bajo control, compones un colector de evidencias robusto y conoces los artefactos en Windows.

En otras áreas del sistema puedes complementar tu auditoría con cmdlets y utilidades bien conocidas (no todos usan Get-ItemProperty, pero se integran en tus scripts): Get-Hotfix, Get-WindowsUpdateLog, ipconfig /all, powercfg (energy, sleepstudy, waketimers), Get-CimInstance para dispositivos, monitores o volúmenes, o Get-NetAdapterAdvancedProperty para red. La idea es que, con los proveedores y el Registro bajo control, compones un colector de evidencias robusto.

  Intel Smart Sound Technology: problemas, causas y cómo arreglarlos

En otras áreas del sistema puedes complementar tu auditoría con cmdlets y utilidades bien conocidas (no todos usan Get-ItemProperty, pero se integran en tus scripts): Get-Hotfix, Get-WindowsUpdateLog, ipconfig /all, powercfg (energy, sleepstudy, waketimers), Get-CimInstance para dispositivos, monitores o volúmenes, o Get-NetAdapterAdvancedProperty para red. La idea es que, con los proveedores y el Registro bajo control, compones un colector de evidencias robusto.

Cifrar y descifrar datos con CMS: complemento ideal al atributo Encrypted

El atributo Encrypted (EFS) protege a nivel de sistema de archivos. Cuando necesites cifrar contenido portable para compartir con terceros, los cmdlets CMS de PowerShell son tu aliado: Protect-CmsMessage (cifrar), Unprotect-CmsMessage (descifrar) y Get-CmsMessage (inspeccionar metadatos).

Creación rápida de un certificado de cifrado desde un INF (ajusta el Subject a tu identidad), solicitud con certreq y verificación en el almacén del usuario:
certreq.exe -new DocumentEncryption.inf DocumentEncryption.cer
Get-ChildItem -Path Cert:\CurrentUser\My -DocumentEncryptionCert

Con el certificado listo, puedes cifrar un texto a archivo y luego verificar/descifrar:

$Text = 'Texto secreto que quiero proteger';
Protect-CmsMessage -To 'cn=tu@dominio.local' -Content $Text -OutFile MiTextoCifrado.txt
Get-CmsMessage -Path .\MiTextoCifrado.txt | Unprotect-CmsMessage -To 'cn=tu@dominio.local'

Esta combinación te permite cubrir tanto el atributo Encrypted (EFS) en disco como el cifrado de mensajes para intercambio seguro, y todo ello visible/gestionable con los mismos principios que ya manejas con Get-ItemProperty.

Trucos y formatos para presentar la información con claridad

Cuando inspeccionas atributos, la presentación importa. Para ver listas legibles usa Format-List (FL) y Format-Table (FT); si trabajas con rutas largas o muchas propiedades, Out-String a veces evita sorpresas con proveedores como el del Registro:

Formato de lista completo de un archivo:
Get-ItemProperty 'C:\ruta\fichero.ext' | Format-List *

Salida textual (útil en remoto con Invoke-Command):
Get-Item 'HKLM:\Software\Microsoft\Cryptography\' | Out-String

Para exportar tus hallazgos a CSV (inventario, auditoría), selecciona sólo lo relevante y guarda con Export-Csv, lo que facilita comparativas a futuro y revisiones por terceros de tu equipo:

Get-ChildItem 'C:\Users\tu\OneDrive' -Recurse -File |
Select-Object FullName, @{n='AttrNum';e={(Get-ItemProperty $_.FullName).Attributes}}, @{n='Attributes';e={(Get-Item $_.FullName).Attributes}} |
Export-Csv C:\Temp\oneDrive_attrs.csv -NoTypeInformation -Encoding UTF8

Buenas prácticas y notas finales para no tropezar

  • Diferencia EFS de nube: que un archivo no esté «siempre disponible» no significa que esté cifrado. Busca explícitamente la bandera Encrypted cuando tu objetivo sea EFS.
  • Usa LiteralPath si hay caracteres raros en rutas para evitar que se interpreten como comodines, especialmente en el Registro y rutas UNC.
  • Proveedor FileSystem soporta filters: úsalo para eficiencia cuando escanees grandes árboles de directorios.
  • Invoke-Command: si lees el Registro remoto, opta por Get-ItemProperty o serializa a texto con Out-String para evitar desajustes (caso MachineGuid).

Con este arsenal sabrás en todo momento si un elemento está cifrado por EFS, si es un placeholder de OneDrive, cómo descodificar números de atributos aparentemente crípticos, y cómo apoyarte en los proveedores de PowerShell para explorar el Registro y otros almacenes de forma homogénea. Todo ello con ejemplos reproducibles y comandos que puedes integrar en tus scripts de inventario, auditoría o seguridad sin romper tus flujos actuales.

cambiar atributos de un archivo en windows-6
Artículo relacionado:
Cómo cambiar los atributos de archivos en Windows