Windows и PowerShell

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 "Файлы различаются"
                        }
                    
Совет: Регулярно проверяйте атрибуты важных файлов и используйте хеширование для проверки целостности критически важных данных. Это поможет обнаружить несанкционированные изменения.