Powershell изменить атрибуты файла

Обновлено: 17.07.2024

К каждому файлу, который вы создаете или изменяете в Windows 10, прикреплены атрибуты файла, которые сообщают вам (или кому-то еще), когда файл был создан, изменен, открыт и, возможно, многое другое. Неважно, опаздываете ли вы с отправкой задания или просто пытаетесь замести следы - информация всегда будет там, если вы ее не измените.

Если вы хотите изменить такие атрибуты файла, у вас есть несколько вариантов. Вы можете использовать новую оболочку Windows PowerShell, чтобы изменить или удалить эти данные, или вы можете сделать это с помощью проводника Windows или другого стороннего приложения, такого как Attribute Changer. Вот как изменить атрибуты файла в Windows 10 с помощью этих методов.

Удаление атрибутов файла с помощью проводника Windows

Если вы хотите изменить дату последнего изменения или другие атрибуты файла в Windows 10, возможно, вы в первую очередь захотите сделать это с помощью меню « Свойства» для файла в проводнике Windows.

К сожалению, это невозможно. Вы можете просматривать и изменять определенные атрибуты файлов в проводнике, но вы не можете изменить даты последнего просмотра, редактирования или изменения. Однако он удалит другие личные данные, такие как имя автора для документов, рейтинги для файлов мультимедиа, а также установит для файла режим только для чтения или скрытие.

Чтобы изменить другие атрибуты файла, такие как дата последнего изменения, дата создания и другая важная информация о файле, вам необходимо использовать один из методов, перечисленных далее в этой статье, в частности, с помощью приложения Attribute Changer.

  • Чтобы удалить определенные личные атрибуты файла, откройте проводник Windows и найдите файл. Щелкните файл правой кнопкой мыши и нажмите " Свойства" .
  • В поле « Свойства» перейдите на вкладку « Сведения », затем щелкните ссылку « Удалить свойства и личную информацию» .
  • Как мы уже упоминали, вы не можете удалить или изменить дату создания файла или другие важные атрибуты файла здесь. Если к вашему файлу прикреплена другая личная информация, вы можете создать копию файла с удаленной информацией, нажав кнопку « Создать копию со всеми возможными удаленными свойствами» , а затем нажмите « ОК», чтобы сохранить и выполнить действие. Копия вашего файла появится в той же папке, что и исходный файл, с удаленными выбранными вами атрибутами.
  • Чтобы удалить эту информацию из существующего файла, выберите вместо этого параметр Удалить следующие свойства из этого файла, а затем выберите свойства, которые вы хотите удалить. Нажмите ОК, чтобы сохранить и удалить эту информацию из файла.
  • Вы также можете использовать проводник, чтобы изменить или установить другие атрибуты файла, например, являются ли ваши файлы скрытыми или доступными только для чтения. В поле « Свойства» перейдите на вкладку « Общие », затем установите флажки « Скрытый» или « Только для чтения», чтобы включить или отключить эти параметры, затем нажмите « ОК» для сохранения.

Чтобы изменить дату последнего изменения и другие атрибуты, вам необходимо использовать другой метод, указанный ниже.

Изменение атрибутов файла с помощью PowerShell

Команда attrib из Windows PowerShell позволяет просматривать и изменять атрибуты файлов для файлов Windows 10. Он входит в стандартную комплектацию, поэтому для его использования не требуется никакого дополнительного программного обеспечения.

Это довольно сложный метод, но также весьма ограниченный. Если вам нужен более простой способ изменения атрибутов файла, используйте приложение Attribute Changer, указанное ниже.

  • Для начала откройте окно PowerShell - желательно с правами администратора. Для этого щелкните правой кнопкой мыши меню «Пуск» Windows и нажмите PowerShell (Admin), чтобы запустить новое окно PowerShell с включенными правами администратора.
  • Используйте команды cd и ls для перемещения папок и просмотра содержимого файлов. Оказавшись в нужной папке, вы можете перечислить все соответствующие атрибуты для вашего файла, набрав Get-ItemProperty -Path file | Format-list -Property * -Force , заменяя файл на путь к файлу.
  • Вы можете использовать команду Set-ItemProperty для изменения атрибутов файла, таких как доступ только для чтения. Для этого введите Set-ItemProperty -Path file -Name IsReadOnly -Value True , заменив файл своим именем файла. Полный список возможных переменных для этой команды см. В полной документации Microsoft PowerShell .

Успешное изменение приведет к тому, что PowerShell не вернет ответа, но вы можете проверить, было ли оно успешным, набрав Get-ItemProperty -Path file | Format-list -Property * -Force еще раз или просмотрев свойства файла с помощью проводника.

Как мы уже упоминали, это не самый простой способ изменить атрибуты файла. Существуют сторонние приложения, такие как Attribute Changer, чтобы сделать это намного проще, а также позволяют вам изменить дату последнего изменения и многое другое.

Использование Attribute Changer для изменения атрибутов файлов Windows 10

Attribute Changer предлагает лучший способ изменить атрибуты файла в Windows. Наряду с типичными скрытыми атрибутами и атрибутами, доступными только для чтения, Attribute Changer позволяет изменять даты доступа и создания файлов, а также другие параметры.

Получаем и изменяем в Powershell атрибуты файла

Атрибуты файла Powershell можно получить несколькими способами, все зависит от ситуации. В powershell все что мы получаем является объектами, а у объектов есть "участники"(member), которые делятся на свойства и методы. Под атрибутами обычно и подразумевают свойства, а под методами действия типа запись или удаление.

Для получения свойств файла powershell мы можем выполнить следующую команду:

Таким образом у нас выводятся все свойства:

Получение свойств powershell SELECT

Навигация по посту

Мы можем и методы и свойства в powershell использую другой командлет:

Powershell атрибуты файла

Для получение свойства объекта мне легче всего объявить переменную и вызвать так:

Свойства файла Powershell

Изменение атрибутов файла Powershell

Например я хочу изменить свойство файла в powershell и поставить "только чтение". Для этого мне нужно получить всех участников объекта и присвоить значение:

Read only powershell

Для изменения я должен вызвать свойство и присвоить $true или $false т.к. значения принимаются только типа bool:

Мы можем изменить так же время создания файла в powershell:

Если мы хотим изменить атрибуты объекта, которые не видны в Property, то мы можем сделать так:

Если мы захотим добавить какое-то атрибут, то мы должны будем перечислить их все. Иначе они уберутся:

Можно сделать так:

Таким образом мы сложим существующие атрибуты с новым.

Что бы увидеть все значения, которые мы можем записать в атрибут можно выполнить:

  • ReadOnly
  • Hidden
  • System
  • Directory
  • Archive
  • Device
  • Normal
  • Temporary
  • SparseFile
  • ReparsePoint
  • Compressed
  • Offline
  • NotContentIndexed
  • Encrypted
  • IntegrityStream
  • NoScrubData

Часть атрибутов мы можем изменять так:

Если нам нужно изменить атрибуты множества объектов, то можно сделать так:

Создание файлов и папок с Powershell New-Item с копированием и переименованием

Для работы с файлами в Powershell есть около 10 команд. С помощью команды New-Item можно создать файл или папку в Powershell, жесткую и мягкую ссылку. Copy-Item и Move-Item выполняют копирование и перемещение объектов. В этой стать мы рассмотрим все эти операции, а так же удаление директорий и файлов включая сетевые пути, на примерах.

Навигация по посту

Создание файлов

Создание файлов в Powershell New-Item

По умолчанию файл создается в той директории откуда был запущен сам Powershell. Изменить путь создания файла можно указав путь в Path:

Создание файлов по пути с Powershell New-Item

Создание каталогов с Powershell New-Item

Создание со вложенными директориями

Мы можем создать множество папок не указывая дополнительных параметров:

Если мы захотим создать директорию и файл, то получим ошибку:

Создание вложенных папок с Powershell New-Item

Перезапись

Ключ Force не только создает родительские объекты в виде папок, но и перезаписывает файлы. Если не указан параметр Force, а файл или папка уже существует - вы получите ошибки:

Указывая Force - файлы перезаписываются удаляя все содержимое. В случае с папками ничего удалено не будет.

Перезапись файлов с Powershell New-Item

Запись данных

Запись в файл с Powershell New-Item

Почти такой же результат будет если добавить в команду параметр Value. Результат следующего примера будет аналогичен предыдущему:

Запись в файл с Powershell New-Item

Мягкие и жесткие ссылки

Кроме файлов и директорий в ItemType можно указать следующие типы ссылок:

  • SymbolicLink (мягкая ссылка) - обычный ярлык на папку или директорию;
  • Junction - старый тип ссылок (до Windows Vista);
  • HardLink (жесткая ссылка) - ссылка на объект в файловой системе. Не работает с директориями.

Каждый файл можно представить как ссылку на объект файловой системы. Ярлык устанавливает связь с именем файла (ссылка на ссылку). При переименовании оригинального файла или его удалении ярлык перестает работать.

Жесткая ссылка работает иначе. Она ссылается на объект файловой системы, а не на имя. Поэтому при удалении или переименовании оригинального файла эта связь не потеряется. Такие ссылки можно представить как копии оригинальных фалов, но которые не занимают дополнительное место на диске. Жесткие ссылки работают в рамках одного раздела и их нельзя использовать на каталогах. Сам объект файловой системы (файл) будет существовать до последней такой ссылки.

Создание жестких ссылок с Powershell New-Item

Создание множества файлов и директорий

Параметр Path может принимать несколько значений. Это значит, что одной командой мы можем создать несколько объектов:

Создание нескольких файлов с Powershell New-Item

Можно использовать сочетания директорий и файлов, добавляя ключ Force тем самым избегая ошибок.

Открываем файл и читаем его содержимое с Get-Content в Powershell

Копирование и перемещение папок и файлов

Перемещение объектов выполняется так же, но с использованием Move-Item:

Если в перемещаемой папке уже существует файл с этим именем, то мы получим ошибку:

  • Move-Item : Cannot create a file when that file already exists

Для исправления этой ситуации можно использовать параметр Force или перемещать файл под другим именем. Новое имя можно указать в Destination:

Path - принимает список, а это значит, что мы можем указывать несколько значений через запятую.

Использование масок для копирования и перемещения

Во многих командах Powershell доступны следующие специальные символы:

  • * - говорит, что в этом месте есть неизвестное количество неизвестных символов;
  • ? - в этом месте есть один неизвестный символ;
  • [A,B,C] - в этом месте есть одна из следующих букв A,B,C.

Перемещение сработает так же.

Предыдущий вариант сработает, если мы ищем файлы в текущей директории. Для копирования в Powershell внутри всех вложенных каталогов нужно использовать рекурсивный поиск, который доступен только в Copy-Item. Рекурсивный поиск устанавливается ключом Recurse. В следующем примере будет найден и скопирован файл hosts. В качестве * я указал один из элементов неизвестного пути:

Копирование файлов с Powershell Copy-Item

Дополнительные параметры фильтрации

Если предыдущих примеров, где мы находили файлы с неизвестным название, не достаточно, то можно использовать дополнительные параметры. Они доступны в обеих командах Copy-Item и Move-Item:

  • Include - включает объекты с этим упоминанием;
  • Exclude - работает аналогично предыдущему, но исключает объекты;
  • Filter - включает объекты указанные в этом параметре.

Копирование множества файлов с Powershell Copy-Item

Создание и изменение в Powershell NTFS разрешений ACL

Переименование файлов и директорий

Для переименовывания в Powershell используется Rename-Item. В следующем примере мы укажем новое имя в параметре NewName:

В NewName можно указать путь, но он должен соответствовать источнику. При следующем написании будет ошибка:

  • Rename-Item : Cannot rename the specified target, because it represents a path or device name.

Переименовывание файлов с Powershell Rename-Item

Удаление

В следующем примере мы удалим файл:

Пустые каталоги в Powershell удаляются так же. Если в папке находятся другие файлы будет запрошено разрешение на удаление.

Удаление файлов с Powershell Remove-Item

Избежать таких вопросов можно использовав рекурсию в виде параметра Recurse:

У команды есть параметры, описанные ранее, в виде:

Работа с сетевыми папками и SMB

Для копирования и переноса данных по сети нужно использовать следующий формат:

Он сработает со всеми командами, как для источника так и для назначения:

Выполнение команд под другим пользователем

  • The FileSystem provider supports credentials only on the New-PSDrive cmdlet. Perform the operation again without specifying credentials.

Есть несколько способов обойти эти ограничения использовав методы WMI и CIM. В Powershell так же доступен сервис PSRemoting, который создан для выполнения задач удаленно. Мы можем использовать две команды:

  • New-PSItem - подключение к компьютеру и дальнейшая работы с ним;
  • Invoke-Command - одноразовое выполнение команды.

Этот сервис может не работать по умолчанию и нуждаться в дополнительных настройках. Этот процесс был описан в другой статье.

В следующем примере будет объявлена переменная в которой будет храниться логин и пароль нужной учетной записи:

Запрос учетных данных пользователя Powershell Get-Credential

После заполнения этой переменной нужно будет передать ее в параметр Credential. Примеры по работе с файлами удаленно от другого пользователя:

Как работать с разрешениями NTFS ACL в Powershell

Основной способ ограничения доступа к файлам и папкам дает файловая система NTFS с ее таблицами ACL. Это может быть право только на чтение файла (открытие и просмотр), на чтение и запись (открытие, просмотр, изменение и сохранение) и многие другие. Такие права мы чаще устанавливаем через GUI назначая права не конечному пользователю, а группе в которой он состоит. Все действия по созданию и изменению мы так же можем сделать через Powershell.

Навигация по посту

На мой взгляд использование консоли Powershell лишнее при выдаче таких прав. Риск совершить ошибку в консоли намного выше, чем при работе в GUI, да и время для написания команды уйдет больше. Есть специфичные задачи, например в виде аудита или перенос прав где Powershell очень поможет.


Основы разрешений

ACL (access controll list) - делится на два вида:

  1. SACL (System Access Control List) - используется для аудита;
  2. DACL (Discretionary Access Control List) - используется для выдачи и проверки разрешений пользователям и группам.

Оба этих типа разрешений хранятся в специальной таблице MFT (Master File Table).

Основное средство для редактирования этих разрешений в GUI можно увидеть зайдя в свойства файла или папки:


В области 4 выделены следующие разрешения:

  • Read - открытие файла и папки;
  • List folder contents - открытие папки;
  • Write - создание файлов и папок и их изменение;
  • Read & Execute - открытие и запуск исполняемых файлов;
  • Modify - открытие, создание, изменение и удаление файлов и папок;
  • Full Control - включает разрешения modify, а так же управление разрешениями файла или папки.

Чаще всего мы работаем с разрешениями выше, но есть еще один список с возможностью настройки прав более тонко:


Как можно догадаться - разрешения указанные в области 1 это просто набор нескольких правил из области 3. Их так же еще называют "Premission Sets" и "Special Premissions".

Групповые разрешения могут принимать флаги Allow и Deny, которые разрешат или запретят указанные действия. Указывать разрешения для пользователей через Deny считается плохой практикой и практически не используется.

Кроме этого существует наследование:


Наследование помогает установить разрешения для одной папки так, что оно будет применяться ко вложенным файлам и папкам. Если наследование отключить (2), то у нас будет возможность убрать все наследуемые разрешения или оставить их.

Функции по работе со строками в Powershell

Получение текущих разрешений в Powershell

На примере ниже я верну разрешения для папки "C:\TestFolder\"


В области 1 выделен владелец папки, а под областью 2 отображаются все группы и пользователи с правами.

Мы можем проверять права не только локальной, но и сетевой папки. На примере ниже возвращена та же папка:


Поиск всех папок с правами у определенной группы

Представим, что мы хотим проверить права данные определенной группе. Мы можем заходить в свойства каждой папки и смотреть вкладку "Безопасности", а можем сделать это через Powershell.

Обычно у нас есть какой-то каталог с общим доступом с папками внутри, на которые мы выдаем разрешения. В моем случае такой каталог "Moscow", а на папки внутри я уже даю права:


В следующем примере я узнаю на какие папки установлены разрешения для TestGroup:


Изменение, копирование и добавление разрешений

Еще одна причина использовать Powershell - это возможность копирования разрешений. Например так я поставлю разрешения для папки Folder2 такие же, как и Folder2:


Возможности добавить нового пользователя в список ACL или изменить его права одним командлетом у нас нет. В обоих случаях мы должны будет создавать копию объекта ACL, изменять ее отдельным классом, а затем применять используя метод. Сам объект, который мы получаем через Get-ACL, имеет множество методов:


Для создания нового объекта с правами используется класс "FileSystemAccessRule", который в команде будет выглядеть так:

Расшифровать значения можно следующим образом:

  • IdentityReference\String - пользователь или группа формата "DOMAIN\Administrator";
  • FileSystemRights - сами разрешения, например "Read";
  • InheritanceFlags и PropagationFlags - определяют наследование. Например вы можете сделать так, что папки внутри указанной будут наследовать разрешения, а файлы нет. Ниже будут приведены несколько примеров. Более подробно об этом можно почитать на сайте Microsoft;
  • AccessCpmtrolType - разрешить или запретить (Allow/Deny).

Изменение и добавление прав у пользователя и групп

Допустим у нас есть пользователь "Test User (001)" с возможностью чтения папки "Folder1" и мы хотим добавить еще права на запись. Это будет выглядеть так:


Таким же образом работает добавление новой группы или пользователя в список ACL:


Права, которые мы можем дать имеют сокращенное название и они отображены далее:


У вас может быть много ошибок связанных с созданием класса с новыми разрешениями. Я бы советовал выводить существующие права и сравнивал бы их с новыми - это позволит снизить вероятность ошибок.


При этом вы можете применить набор разрешений, например в виде Write, но результат будет отображаться в виде "Special Premission":



Поэтому я рекомендую смотреть существующие разрешения на примере того, как я сделал это выше.

Удаление прав у пользователя или группы

Для удаления всех разрешений есть метод "RemoveAccessRuleAll". Работает он так же:


Для удаления конкретного права, например только возможность чтения, есть метод "RemoveAccessRule". С этим методом у меня были проблемы после которых действующие разрешения менялись на Special и изменить эту ситуацию у меня не получилось. Если вам нужно все же убрать одно разрешение - я бы советовал удалять все разрешения у пользователя, а затем добавлять их заново. У пользователя было право на Чтение и Запись, но мне нужно было оставить только чтение:


Смена владельца

Смена владельца файла или папки делается через метод SetOwner. Этот метод, в качестве идентификатора, принимает SID пользователя и что бы его узнать нужно использовать класс "System.Security.Principal.Ntaccount". На практике это выглядит так:


Как отсортировать в Powershell объекты через Sort-Object

Включение или отключение наследования папок и файлов

Для управления наследованием используется метод "SetAccessRuleProtection", который устанавливает следующее:

  1. Нужно ли блокирование от родительской папки.
  2. Нужна ли перезапись прав.

Значения указываются в $True или $False. Например так я включу наследование и заменю существующие разрешения родительскими:


Сбор всех прав и их экспорт в CSV

Учитывая примеры выше мы можем временно собирать отчеты по выданным правам. Пример того, как может выглядеть отчет:

Если PowerShell кажется вам сложным для использования его для повседневных задач, "круто" может быть не тем словом, которое у вас ассоциируете с ним. Но PowerShell является основной частью Exchange , Windows Server и SQL Server , и он обладает огромными возможностями, которые мы все должны понять, принять и использовать, чтобы облегчить и автоматизировать наши текущие дела.

Я собираюсь немного поразвлечься и показать вам несколько хитростей, которые определенно пригодятся вам в решении нудных задач на работе. Кроме того, вы будете выглядеть намного круче в глазах ваших коллег, когда сможете решить проблему из командной строки. Согласитесь, это выглядит привлекательно, чем щелкать правой кнопкой мыши и что-то исправлять.

Будьте очень осторожны так как это инструмент достойный своего названия (Power – Сила, Shell – Оболочка). PowerShell может легко вызвать массовые изменения конфигурации, как положительные, так и отрицательные, поэтому для безопасности создайте тестовую или лучше всего виртуальную среду для вашего обучения и тестирования. Если вы будете тестировать у себя на компьютере, то создайте точку восстановления системы. Чтобы во время выполнения одной из следующих команд что-то пойдет не так, вы всегда могли восстановить свой компьютер.

10 крутых вещей, которые можно сделать с помощью Windows PowerShell

1: Отчёты о подключённых USB оборудованиях

PowerShell даёт возможность работать с Windows Management Instrumentation (WMI) . С помощью PowerShell, вы можете сделать WMI - запрос для получения информации о USB - устройствах, которые установлены как на локальной, так и на удаленных системах.

gwmi Win32_USBControllerDevice -computername DBSERVER1 |fl Antecedent,Dependent

В данной команде будет применен фильтр возврата предшествующих и зависимых полей с компьютера DBSERVER1. Если вы хотите получить полную информацию о USB-устройствах в системе, вы можете убрать оператор | и fl. Это весьма удобный способ для ведения отчётов по серверам, к которым подключены USB - устройства с лицензией.

2: Выполнение ваших любимых задач CMD в PowerShell

Да, вы можете перестать использовать командную строку ( CMD ) и начать выполнять все те же задачи в PowerShell. Это поможет сделать процесс обучение немного проще и помочь вам лучше ознакомиться с интерфейсом. К сожалению, PowerShell невозможно вызвать через окно «выполнить» с помощью трёх букв, подобно CMD. Но вы можете назначить сочетание клавиш для быстрого запуска PowerShell, например, Ctrl + Shift + P.

3: Принудительное завершение процесса в PowerShell

Если зависла какая-то служба Windows, вы можете использовать PowerShell для завершения процесса так же, как и через Диспетчер Задач. Например, для закрытия BadThread.exe, вы делаете следующее:

get-process BadTh*
Результаты выведут нам нужные данные в таком формате:
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
19 5 -321955 -312219 -154 32.76 7583 BadThread

После того, как мы идентифицируем Process ID, вы можете принудительно закрыть зависший процесс введя команду:

stop-process -id 7583

В тот же момент процесс BadThread будет принудительно остановлен, и вы сможете возобновить попытку запуска службы. Которую можете сделать прямо здесь, в PowerShell.

4: Используйте PSDrive для большего, чем просто просмотр дисков

Команда PSDrive позволяет просматривать объекты Windows за пределами традиционных сетей, а также локальных или съемных дисков. Например, чтобы посмотреть диски в разделе верхнего уровня реестра HKEY_LOCAL_MACHINE, вы можете использовать HKLM PSDrive. Чтобы войти в реестр, введите следующую команду:

Затем вы переключаетесь в раздел регистра где сможете просмотреть список всех объектов и удалять их, если вам это нужно.

5: Экспорт NTFS разрешений папки – как обычно, так и рекурсивно

Управление разрешениями NTFS - это отдельный вопрос, но с помощью PowerShell можно экспортировать список разрешений для аудита доступов или для быстрого анализа списка ACLs для настройки политик безопасности. Это лучший вариант для создания отчётности в формате периодически запускаемого скрипта, или вы можете запускать его по требованию, например, для диагностики конкретной проблемы, связанной с доступами. Например, используя следующую команду:

PS E:>Get-Acl N:Data

Это даст вам быстрый ответ с результатами ваших прав безопасности по указанному пути N:Data (обратите внимание, что команда не даёт доступ к ресурсу). Данная команда не даст нам общую картину всех доступов всего пути, а только отчёт только об указанном пути. Но если вы хотите включить рекурсию для всего пути, вы можете использовать другую команду. Для того же пути N:Data вы должны использовать командлет Get-ChildItem (cmdlet) в PowerShell в сочетании с командлетом Get-Acl. Рассмотрим следующий пример:

PS E:>Get-ChildItem N:Data -recurse | Get-Acl

Данная команда будет отображать списки ACL для содержимого всего пути N:Data. Разберём как это работает: командлет Get-ChildItem показывает нам все объекты файловой системы по указанному пути N:Data, а дальше весь список объектов передаётся командлету Get-Acl который предоставляет результаты (списки ACL) для каждого объекта.

Если вы хотите заархивировать данные в документ (CSV), вам нужно добавить | export-csv c:\filename.csv в конце команды. Кроме этого вы можете извлечь в обычный текстовый файл с помощью добавления командлета > C:\filename.txt. Обратите внимание что, когда вы используете параметр -recurse, он будет применяться во всех вложенных файлах и папках. Поэтому будьте внимательны, когда используете его для инвентаризации объёмных томов или же по сети.

6: Отличия PowerShell 2.0

PowerShell 2.0 включает в себя графический интерфейс что является удобной особенностью данной системы. Скрипты PowerShell сохраняются как файлы .ps1, что позволяет нам легко изменять, импортировать и мигрировать сценарии в различные системы. На скриншоте ниже показан пример списка разрешений NTFS в графическом режиме.

Читайте также: