3.1 Структура файловой системы Windows
Файловая система Windows основана на NTFS (New Technology File System) и имеет иерархическую структуру, начинающуюся с корневого каталога каждого диска.
Основные диски и разделы
# Просмотр всех дисков в системе
Get-WmiObject -Class Win32_LogicalDisk | Select-Object DeviceID, Size, FreeSpace, FileSystem
# Или через PowerShell 5.0+
Get-Volume | Select-Object DriveLetter, FileSystemLabel, Size, SizeRemaining
Структура диска C:
C:\
├── Windows\ # Системные файлы Windows
├── Program Files\ # 64-битные программы
├── Program Files (x86)\ # 32-битные программы
├── Users\ # Профили пользователей
├── ProgramData\ # Данные программ (скрытая)
├── PerfLogs\ # Логи производительности
├── System Volume Information\ # Системная информация (скрытая)
└── pagefile.sys # Файл подкачки
Папка Windows
Системные файлы: Папка Windows содержит все системные файлы операционной системы. Изменение или удаление файлов в этой папке может привести к нестабильной работе системы.
Основные подпапки Windows:
- System32 — системные библиотеки и исполняемые файлы
- SysWOW64 — 32-битные системные файлы для совместимости
- System — дополнительные системные файлы
- Temp — временные файлы системы
- Logs — системные журналы
- Fonts — шрифты системы
- Help — файлы справки
Папка Users
# Просмотр структуры папки пользователя
Get-ChildItem $env:USERPROFILE | Select-Object Name, Attributes
Структура профиля пользователя:
- Desktop — рабочий стол
- Documents — документы пользователя
- Downloads — загруженные файлы
- Pictures — изображения
- Videos — видеофайлы
- Music — музыкальные файлы
- AppData — данные приложений (скрытая)
- Favorites — избранное браузера
Скрытые папки
Важно: Многие системные папки скрыты по умолчанию. Для их отображения в проводнике включите "Показать скрытые файлы, папки и диски" в настройках вида.
# Показать скрытые файлы и папки
Get-ChildItem -Force | Where-Object {$_.Attributes -match "Hidden"}
# Показать только скрытые папки
Get-ChildItem -Directory -Force | Where-Object {$_.Attributes -match "Hidden"}
Специальные папки
Переменные окружения для специальных папок:
- %USERPROFILE% — профиль текущего пользователя
- %APPDATA% — AppData\Roaming
- %LOCALAPPDATA% — AppData\Local
- %TEMP% — временная папка пользователя
- %PROGRAMDATA% — ProgramData
- %WINDIR% — папка Windows
Типы файловых систем
NTFS (New Technology File System): Основная файловая система Windows, поддерживающая сжатие, шифрование, квоты дисков, журналирование и другие продвинутые возможности.
Сравнение файловых систем:
- NTFS — современная, с поддержкой больших файлов и дисков
- FAT32 — совместимая, но с ограничениями по размеру файлов
- exFAT — для внешних накопителей, оптимизированная для флешек
- ReFS — новая файловая система для серверов
3.2 Пути и навигация в файловой системе
Понимание путей в Windows критически важно для эффективной работы с файловой системой и написания скриптов.
Типы путей
Абсолютные пути
- Полный путь: C:\Users\Иван\Documents\файл.txt
- UNC путь: \\server\share\файл.txt
- Путь к устройству: \\.\PhysicalDrive0
Относительные пути
- Текущая папка: .\файл.txt
- Родительская папка: ..\файл.txt
- Относительный путь: Documents\файл.txt
Навигация в PowerShell
# Текущее местоположение
Get-Location
# или
pwd
# Переход в папку
Set-Location "C:\Users"
# или
cd "C:\Users"
# Переход в домашнюю папку
Set-Location $env:USERPROFILE
# или
cd ~
# Переход на уровень выше
Set-Location ..
# или
cd ..
Работа с переменными путей
# Разделение пути на компоненты
Split-Path "C:\Users\Иван\Documents\файл.txt" -Parent
Split-Path "C:\Users\Иван\Documents\файл.txt" -Leaf
# Объединение путей
Join-Path "C:\Users" "Иван"
# Получение абсолютного пути
Resolve-Path ".\файл.txt"
# Проверка существования пути
Test-Path "C:\Users\Иван\Documents"
Специальные символы в путях
Экранирование символов: В PowerShell некоторые символы имеют специальное значение и должны быть экранированы или заключены в кавычки.
# Путь с пробелами (обязательно в кавычках)
Set-Location "C:\Program Files"
# Путь с квадратными скобками
Set-Location "C:\Users\[Иван]"
# Экранирование специальных символов
Set-Location "C:\Users\`$Иван"
# Использование одинарных кавычек (буквальная интерпретация)
Set-Location 'C:\Users\$Иван'
Переменные окружения в путях
# Использование переменных окружения
$env:USERPROFILE
$env:PROGRAMFILES
$env:WINDIR
$env:TEMP
# Переход в папку пользователя
Set-Location $env:USERPROFILE
# Создание пути с переменными
$documentsPath = Join-Path $env:USERPROFILE "Documents"
Set-Location $documentsPath
Поиск файлов по путям
# Поиск файлов по маске
Get-ChildItem "C:\Users\*\Documents\*.txt" -Recurse
# Поиск с использованием переменных
Get-ChildItem "$env:USERPROFILE\Documents\*.txt"
# Поиск в нескольких папках
$searchPaths = @("$env:USERPROFILE\Documents", "$env:USERPROFILE\Desktop")
foreach ($path in $searchPaths) {
Get-ChildItem $path -Filter "*.txt"
}
Работа с длинными путями
Ограничения длины путей: В Windows есть ограничение на длину пути (260 символов по умолчанию). Для работы с длинными путями используйте префикс \\?\ или включите поддержку длинных путей в Windows 10/11.
# Работа с длинными путями (префикс \\?\)
Get-ChildItem "\\?\C:\Very\Long\Path\To\Some\File.txt"
# Проверка поддержки длинных путей
Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled"
Создание и удаление папок
# Создание папки
New-Item -ItemType Directory -Path "C:\НоваяПапка"
# или
mkdir "C:\НоваяПапка"
# Создание вложенных папок
New-Item -ItemType Directory -Path "C:\Папка1\Папка2\Папка3" -Force
# Удаление папки
Remove-Item "C:\НоваяПапка" -Recurse -Force
# Удаление только пустых папок
Remove-Item "C:\ПустаяПапка" -Force
3.3 Права доступа в Windows
Система прав доступа Windows (NTFS permissions) обеспечивает безопасность файлов и папок, контролируя, кто может читать, изменять или выполнять файлы.
Основные типы разрешений
Стандартные разрешения NTFS:
- Полный доступ (Full Control) — все операции
- Изменение (Modify) — чтение, запись, выполнение, удаление
- Чтение и выполнение (Read & Execute) — чтение и выполнение файлов
- Чтение (Read) — только просмотр содержимого
- Запись (Write) — создание и изменение файлов
Просмотр прав доступа в PowerShell
# Просмотр прав доступа к файлу
Get-Acl "C:\Users\Иван\Documents\файл.txt" | Format-List
# Просмотр прав доступа к папке
Get-Acl "C:\Users\Иван\Documents" | Format-List
# Детальная информация о правах
(Get-Acl "C:\Users\Иван\Documents").Access | Format-Table IdentityReference, FileSystemRights, AccessControlType
Установка прав доступа
Внимание: Изменение прав доступа к системным файлам может привести к нестабильной работе системы. Всегда создавайте резервные копии перед изменением прав.
# Создание нового объекта прав доступа
$acl = Get-Acl "C:\Users\Иван\Documents"
# Создание правила доступа
$accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("Пользователи", "ReadAndExecute", "ContainerInherit,ObjectInherit", "None", "Allow")
# Добавление правила к ACL
$acl.SetAccessRule($accessRule)
# Применение изменений
Set-Acl "C:\Users\Иван\Documents" $acl
Наследование прав доступа
Наследование: По умолчанию файлы и папки наследуют права доступа от родительской папки. Это упрощает управление правами, но может создавать проблемы безопасности.
# Отключение наследования прав
$acl = Get-Acl "C:\Users\Иван\Documents"
$acl.SetAccessRuleProtection($true, $false)
Set-Acl "C:\Users\Иван\Documents" $acl
# Включение наследования прав
$acl = Get-Acl "C:\Users\Иван\Documents"
$acl.SetAccessRuleProtection($false, $true)
Set-Acl "C:\Users\Иван\Documents" $acl
Работа с группами пользователей
# Просмотр групп пользователей
Get-LocalGroup | Select-Object Name, Description
# Просмотр пользователей в группе
Get-LocalGroupMember "Пользователи"
# Добавление пользователя в группу
Add-LocalGroupMember -Group "Пользователи" -Member "НовыйПользователь"
# Удаление пользователя из группы
Remove-LocalGroupMember -Group "Пользователи" -Member "Пользователь"
Эффективные права доступа
Эффективные права: Эффективные права пользователя определяются комбинацией его личных прав и прав групп, к которым он принадлежит. PowerShell может помочь определить эффективные права.
# Проверка эффективных прав пользователя
$user = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$acl = Get-Acl "C:\Users\Иван\Documents"
# Проверка конкретного права
$accessRules = $acl.Access | Where-Object {$_.IdentityReference -eq $user.Name}
$accessRules | Format-Table IdentityReference, FileSystemRights, AccessControlType
Аудит доступа к файлам
# Включение аудита для файла
$acl = Get-Acl "C:\Users\Иван\Documents\важный_файл.txt"
$auditRule = New-Object System.Security.AccessControl.FileSystemAuditRule("Пользователи", "ReadAndExecute", "Success")
$acl.SetAuditRule($auditRule)
Set-Acl "C:\Users\Иван\Documents\важный_файл.txt" $acl
# Просмотр настроек аудита
$acl.Audit | Format-Table IdentityReference, FileSystemRights, AuditFlags
Сброс прав доступа
# Сброс прав доступа к папке (восстановление наследования)
$acl = Get-Acl "C:\Users\Иван\Documents"
$acl.SetAccessRuleProtection($false, $true)
Set-Acl "C:\Users\Иван\Documents" $acl
# Применение прав по умолчанию
icacls "C:\Users\Иван\Documents" /reset /T
Практические примеры
Создание папки с ограниченным доступом
# Создание папки
$folderPath = "C:\КонфиденциальныеДокументы"
New-Item -ItemType Directory -Path $folderPath
# Получение ACL
$acl = Get-Acl $folderPath
# Удаление наследования
$acl.SetAccessRuleProtection($true, $false)
# Добавление прав для администраторов
$adminRule = New-Object System.Security.AccessControl.FileSystemAccessRule("Администраторы", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow")
$acl.SetAccessRule($adminRule)
# Добавление прав для конкретного пользователя
$userRule = New-Object System.Security.AccessControl.FileSystemAccessRule("Иван", "ReadAndExecute", "ContainerInherit,ObjectInherit", "None", "Allow")
$acl.SetAccessRule($userRule)
# Применение прав
Set-Acl $folderPath $acl
3.4 Атрибуты файлов в Windows
Атрибуты файлов в Windows предоставляют дополнительную информацию о файлах и папках, а также влияют на их поведение в системе.
Основные атрибуты файлов
Стандартные атрибуты NTFS:
- Archive (A) — файл изменен с момента последнего резервного копирования
- Hidden (H) — скрытый файл
- ReadOnly (R) — файл только для чтения
- System (S) — системный файл
- Compressed (C) — сжатый файл
- Encrypted (E) — зашифрованный файл
Просмотр атрибутов в PowerShell
# Просмотр атрибутов файла
Get-ItemProperty "C:\Users\Иван\Documents\файл.txt" | Select-Object Attributes
# Детальная информация о файле
Get-Item "C:\Users\Иван\Documents\файл.txt" | Format-List *
# Просмотр атрибутов папки
Get-Item "C:\Users\Иван\Documents" | Select-Object Attributes
# Просмотр всех файлов с их атрибутами
Get-ChildItem "C:\Users\Иван\Documents" | Select-Object Name, Attributes
Установка атрибутов
# Установка атрибута "только для чтения"
Set-ItemProperty "C:\Users\Иван\Documents\файл.txt" -Name Attributes -Value ReadOnly
# Установка атрибута "скрытый"
Set-ItemProperty "C:\Users\Иван\Documents\файл.txt" -Name Attributes -Value Hidden
# Установка нескольких атрибутов
Set-ItemProperty "C:\Users\Иван\Documents\файл.txt" -Name Attributes -Value @("ReadOnly", "Hidden")
# Снятие атрибута "только для чтения"
$file = Get-Item "C:\Users\Иван\Documents\файл.txt"
$file.Attributes = $file.Attributes -band (-bnot [System.IO.FileAttributes]::ReadOnly)
Работа с атрибутами через .NET
# Установка атрибутов через .NET
[System.IO.File]::SetAttributes("C:\Users\Иван\Documents\файл.txt", [System.IO.FileAttributes]::ReadOnly)
# Установка нескольких атрибутов
[System.IO.File]::SetAttributes("C:\Users\Иван\Documents\файл.txt", [System.IO.FileAttributes]::ReadOnly -bor [System.IO.FileAttributes]::Hidden)
# Проверка наличия атрибута
$attributes = [System.IO.File]::GetAttributes("C:\Users\Иван\Documents\файл.txt")
if ($attributes -band [System.IO.FileAttributes]::ReadOnly) {
Write-Host "Файл имеет атрибут ReadOnly"
}
Поиск файлов по атрибутам
# Поиск скрытых файлов
Get-ChildItem "C:\Users\Иван" -Force | Where-Object {$_.Attributes -match "Hidden"}
# Поиск файлов только для чтения
Get-ChildItem "C:\Users\Иван" -Recurse | Where-Object {$_.Attributes -match "ReadOnly"}
# Поиск системных файлов
Get-ChildItem "C:\Users\Иван" -Force | Where-Object {$_.Attributes -match "System"}
# Поиск сжатых файлов
Get-ChildItem "C:\Users\Иван" -Recurse | Where-Object {$_.Attributes -match "Compressed"}
Альтернативные потоки данных (ADS)
ADS (Alternate Data Streams): NTFS поддерживает альтернативные потоки данных, которые позволяют хранить дополнительную информацию в файле без изменения его основного содержимого.
# Создание файла с альтернативным потоком
"Основное содержимое" | Out-File "C:\Users\Иван\Documents\файл.txt"
"Скрытые данные" | Out-File "C:\Users\Иван\Documents\файл.txt:скрытый_поток"
# Чтение альтернативного потока
Get-Content "C:\Users\Иван\Documents\файл.txt:скрытый_поток"
# Просмотр всех потоков файла
Get-Item "C:\Users\Иван\Documents\файл.txt" -Stream *
Расширенные атрибуты
# Просмотр расширенных атрибутов
Get-Item "C:\Users\Иван\Documents\файл.txt" | Get-Member -MemberType Property
# Информация о времени создания и изменения
$file = Get-Item "C:\Users\Иван\Documents\файл.txt"
$file | Select-Object Name, CreationTime, LastWriteTime, LastAccessTime
# Изменение времени последнего доступа
$file.LastAccessTime = Get-Date
Практические примеры
Скрипт для массового изменения атрибутов
# Функция для установки атрибутов файлам в папке
function Set-FileAttributes {
param(
[string]$Path,
[string[]]$Attributes,
[string]$Filter = "*"
)
$files = Get-ChildItem -Path $Path -Filter $Filter -File
foreach ($file in $files) {
try {
$currentAttributes = $file.Attributes
foreach ($attr in $Attributes) {
$currentAttributes = $currentAttributes -bor [System.IO.FileAttributes]::$attr
}
$file.Attributes = $currentAttributes
Write-Host "Атрибуты установлены для: $($file.Name)"
}
catch {
Write-Error "Ошибка при установке атрибутов для $($file.Name): $($_.Exception.Message)"
}
}
}
# Использование функции
Set-FileAttributes -Path "C:\Users\Иван\Documents" -Attributes @("ReadOnly", "Hidden") -Filter "*.txt"
Проверка целостности файлов
# Вычисление хеша файла (MD5)
Get-FileHash "C:\Users\Иван\Documents\файл.txt" -Algorithm MD5
# Вычисление хеша файла (SHA256)
Get-FileHash "C:\Users\Иван\Documents\файл.txt" -Algorithm SHA256
# Сравнение хешей двух файлов
$hash1 = Get-FileHash "C:\Users\Иван\Documents\файл1.txt" -Algorithm SHA256
$hash2 = Get-FileHash "C:\Users\Иван\Documents\файл2.txt" -Algorithm SHA256
if ($hash1.Hash -eq $hash2.Hash) {
Write-Host "Файлы идентичны"
} else {
Write-Host "Файлы различаются"
}
Совет: Регулярно проверяйте атрибуты важных файлов и используйте хеширование для проверки целостности критически важных данных. Это поможет обнаружить несанкционированные изменения.