Как дать разрешение пользователям на каталог с помощью командной строки в Windows?

277

Как я могу предоставить разрешения пользователю для каталога (чтение, запись, изменение) с помощью командной строки Windows?

Амитабх
источник

Ответы:

420

По состоянию на Vista, caclsустарела. Вот первые несколько строк помощи:

C:\>cacls
NOTE: Cacls is now deprecated, please use Icacls.

Displays or modifies access control lists (ACLs) of files

Вы должны использовать icaclsвместо этого. Вот как вы предоставляете Джону полный контроль над D:\testпапкой и всеми ее подпапками:

C:\>icacls "D:\test" /grant John:(OI)(CI)F /T

Согласно документации MS:

  • F = Полный контроль
  • CI = Container Inherit - этот флаг указывает, что подчиненные контейнеры будут наследовать этот ACE.
  • OI = Object Inherit - этот флаг указывает, что подчиненные файлы будут наследовать ACE.
  • /T= Применять рекурсивно к существующим файлам и подпапкам. ( OIи CIприменяется только к новым файлам и подпапкам). Кредит: комментарий @AlexSpence.

Для полной документации вы можете запустить " icacls" без аргументов или посмотреть документацию Microsoft здесь и здесь

Кэлин Дари
источник
4
Фелипе: Параметры (OI) и (CI) делают это рекурсивным
Крис Миллер
22
У меня были проблемы с отказом в доступе при попытке изменить разрешения в интерфейсе Windows Explorer. Добавление флага / T в конец заменило существующие объекты и смогло решить проблему за меня. C:> icacls "D: \ test" / Грант Джон: (OI) (CI) F / T
Алекс Спенс
9
@AlexSpence Отличный момент! Параметр / T необходим для обновления разрешений существующих файлов и папок . (OI) и (CI) применяются только к файлам и папкам, созданным в будущем.
Джесси
5
Исходя из мира * nix и использовавшийся в 'chown / chmod' для предоставления доступа и установки разрешений через CLI, этот поток очень помог.
bgarlock
5
Если вы запустите это в Powershell в Windows 10, вы получите сообщение об ошибке «OI not распознан». Решение: поместите аргумент user + perms в кавычки. Например:C:\>icacls "D:\test" /grant "John:(OI)(CI)F" /T
JDS
78

Вы также можете использовать ICACLS.

Предоставить Пользователи группы Полный доступ к папке:

>icacls "C:\MyFolder" /grant Users:F

Чтобы предоставить ИЗМЕНЯЮТ разрешения для пользователей IIS для C:\MyFolder(если вам нужен ваш IIS имеет способность R / W файлы в определенную папку):

>icacls "C:\MyFolder" /grant IIS_IUSRS:M

Если вы делаете ICACLS /? Вы сможете увидеть все доступные варианты.

Vin.X
источник
И учитывая, что caclsэто прошло, это еще больше оснований для использования icacls .
Ян Бойд
2
Добавление полного контроля не работало для меня, пока не /grant Users:(OI)(CI)Fиспользовалось
Ян Захрадник,
Нужно ли заменить Usersна что-то еще или НЕТ? По словамicacls "C:\MyFolder" /grant Users:F
йори
Если текущий пользователь является членом группы пользователей с именем «Пользователи» (что обычно происходит в Windows 7), то предоставление разрешения этой группе повлияет на права доступа текущего пользователя. В любом другом случае замените имя Users фактическим именем текущего пользователя (например, John), таким образом: / grant John: (OI) (CI) F
Ed999
24

Откройте командную строку, затем выполните эту команду:

icacls "c:\somelocation\of\path" /q /c /t /grant Users:F

F дает полный доступ.

/q /c /t применяет разрешения к подпапкам.

Примечание: иногда «Запуск от имени администратора» поможет.

Сириш Ярлагадда
источник
«Запуск от имени администратора», просто лучший ответ!
Jeb50
20

Используйте caclsкоманду. Смотрите информацию здесь .

Файлы CACLS / e / p {ИМЯ ПОЛЬЗОВАТЕЛЯ}: {РАЗРЕШЕНИЕ}

Куда,

/ p: установить новое разрешение

/ e: Изменить разрешение и сохранить старое разрешение как есть, т.е. редактировать ACL вместо его замены.

{USERNAME}: имя пользователя

{РАЗРЕШЕНИЕ}: Разрешение может быть:

R - Читать

W - Написать

C - Изменить (написать)

F - Полный контроль

Например, предоставьте элементу управления Rocky Full (F) следующую команду (введите в командной строке Windows):

C:> CACLS файлы / E / P Rocky: F

Прочитайте полную справку, введя следующую команду:

C:> cacls /?

Хорхе Феррейра
источник
Отличный ответ! Единственное, на что следует обратить внимание, это то, что файлы - это файлы, для которых вы хотите изменить права доступа. Может быть, [файлы] или {файлы} будет лучшим объяснением.
Коннор Росс
14
Cacls устарела!
Хардик Такер
caclsактуально; это все еще доступно в Windows 10; Microsoft также отказалась бы cmd.exeот поддержки Powershell.
1
@ Chinggis6 Быть «все еще доступным» не означает, что что-то является хорошей идеей или рекомендовать другим. Кроме того, cmd.exeэто не считается устаревшим и вряд ли таковым, так что это вовсе не точка зрения в пользу icacls, а совсем наоборот.
underscore_d
1
Я знаю. Я не утверждал, что это хорошая идея - использовать или рекомендовать cacls.exe. Я также не упомянул, что cmd.exeэто уже устарело. Я думаю, что люди должны по крайней мере знать о его доступности в более высоких версиях даже для обратной совместимости или по любой другой причине.
12

Я пробую следующий способ, и он работает для меня:
1. открыть cmd.exe
2. takeown /R /F *.*
3. icacls * /T /grant [username]:(D)
4.del *.* /S /Q

Так что файлы могут стать моими собственными правами доступа и назначить «Удалить», а затем я могу удалить файлы и папки.

Рэй Хуан
источник
7

Поврежденные разрешения: восстановление доступа к папке и ее подобъектам

Хотя большинство ответов, опубликованных в ответ на вопрос, имеют определенную ценность, ИМХО ни один из них не дает полного решения. Следующее (может быть) идеальное решение для Windows 7, если вы заблокированы в папке из-за поврежденных настроек разрешений:

icacls "c:\folder" /remove:d /grant:r Everyone:(OI)(CI)F /T  

Для Windows 10 пользователь / SID должен быть указан после /remove:dопции:

icacls "c:\folder" /remove:d Everyone /grant:r Everyone:(OI)(CI)F /T  

,
Примечания :

  1. Команда применяется к указанному каталогу.

  2. Указание пользователя «Все» устанавливает максимально широкое разрешение, поскольку оно включает каждого возможного пользователя.

  3. Параметр "/ remove: d" удаляет любые явные настройки DENY, которые могут существовать, поскольку они переопределяют явные настройки ALLOW: необходимые предварительные условия для создания новой настройки ALLOW. Это всего лишь мера предосторожности, так как часто нет настройки DENY, но лучше, чем потом сожалеть.

  4. Параметр "/ grant" создает новый параметр ALLOW, явное разрешение, которое заменяет (": r") любые и все явные параметры ALLOW, которые могут существовать.

  5. Параметр «F» (т. Е. Созданное разрешение) делает это предоставлением полного контроля.

  6. Параметр "/ T" добавляет рекурсию, применяя эти изменения ко всем текущим подобъектам в указанном каталоге (то есть файлам и подпапкам), а также к самой папке.

  7. Параметры «(OI)» и «(CI)» также добавляют рекурсию, применяя эти изменения к подобъектам, созданным впоследствии.
    ,

ДОБАВЛЕНИЕ (2019/02/10) -

Командная строка Windows 10 выше была любезно предложена мне сегодня, так что вот она. У меня нет Windows 10, чтобы проверить это, но, пожалуйста, попробуйте, если у вас есть (и тогда вы, пожалуйста, оставьте комментарий ниже).

Изменение касается только удаления настройки DENY в качестве первого шага. Вполне может быть, что нет ни одной настройки DENY, так что эта опция может не иметь значения. Насколько я понимаю, в Windows 7 вам не нужно указывать пользователя после / удалить: d, но я могу ошибаться!

,

ДОБАВЛЕНИЕ (2019/11/21) -

Пользователь astark рекомендует заменить « Все» термином * S-1-1-0, чтобы команда не зависела от языка. У меня установлена ​​английская версия Windows, поэтому я не могу протестировать это предложение, но оно кажется разумным.

Ed999
источник
Для унаследованных разрешений никаких условий не требуется, потому что разрешения EXPLICIT их переопределяют. Таким образом, создание нового явного параметра аннулирует любые унаследованные параметры, которые могут существовать (поскольку новый явный параметр включает в себя рекурсию).
Ed999
Invalid parameter "/remove:d"
DFSFOT
Я запускаю (могу только запустить) icacls.exe в Windows 7. Я не могу комментировать или проверять любые изменения в нем, которые могут существовать в Windows 8 или 10. Как я проверял в Windows 7 64-bit, удаление опция эффективна для удаления настроек DENY. Его использование может привести к появлению сообщения об ошибке, если нет НИКАКИХ запрещенных настроек, но если их нет, он все равно не сможет их удалить.
Ed999
Невозможность точно воспроизвести командную строку в моем исходном ответе (за исключением пути к каталогу) приведет к сбою команды. В частности, НЕ добавляйте кавычки, которые не указаны в моем ответе. Если вы заключите (например) параметр / remove: d в кавычки, команда, конечно, завершится неудачно.
Ed999
1
@DFSFOT Хорошо, я сочувствую. Но я использую Windows 7. С Божьей милостью я никогда не буду использовать Windows 10. Я бы лучше перешел на Ubuntu! Я подозреваю, что / remove: g, вероятно, удалит все права, как записи ALLOW, так и записи DENY (хотя с возможностью, что «предоставлено» в этом контексте означает только ALLOW, и поэтому оно не будет обрабатывать любые записи DENY); в то время как / remove: d предположительно удалит только записи DENY, оставляя все записи ALLOW без изменений. Но, конечно, я не могу быть уверен.
Ed999
5

Я боролся с этим на некоторое время и только комбинируя ответы в этой теме работал для меня (на Windows 10):
1. Откройте CMD или PowerShell и перейдите в папку с файлами
2. takeown / R / F .
3. icacls * / T / Грант Дан: F

Удачи!

Даниил Шевелев
источник
3

На тот случай, если на этой странице есть кто-то еще, если вы хотите объединить различные разрешения в одной команде, я использовал это:

icacls "c:\TestFolder" /grant:r Test_User:(OI)(CI)(RC,RD,RX)

Обратите внимание на строку csv для различных разрешений.

Объявления
источник
Спасибо много. Это помогло мне установить разрешение для RX & RD. В большинстве примеров, приведенных в Интернете, объяснение было дано с полным разрешением / F, чего не должно быть.
Мани
2

С помощью сценария Excel VBA для обеспечения и создания учетных записей. Мне нужно было предоставить полные права доступа к папке и подпапкам, которые были созданы инструментом с помощью учетной записи «x» наших администраторов для нашего нового пользователя.

cacls выглядел примерно так: cacls \ FileServer \ Users \ Имя пользователя / e / g Домен \ Имя пользователя: C

Мне нужно было перенести этот код на Windows 7 и выше. Мое решение оказалось:

icacls \ FileServer \ Users \ Имя пользователя / грант: r Домен \ Имя пользователя: (OI) (CI) F / t

/ grant: r - Предоставляет указанные права доступа пользователя. Разрешения заменяют ранее предоставленные явные разрешения. Без: r разрешения добавляются к любым ранее предоставленным явным разрешениям.

(OI) (CI) - это папка, подпапки и файлы.

F - Полный доступ

/ t - пройти через все подпапки, чтобы найти файлы / каталоги.

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

Гас
источник
1

XCACLS.VBS - очень мощный скрипт, который будет изменять / редактировать информацию ACL. Справка c: \ windows \ system32 \ cscript.exe xcacls.vbs возвращает все параметры и параметры.

Вы можете получить официальный дистрибутив на странице поддержки Microsoft.

G222
источник
3
Можете ли вы предоставить ссылку, где XCACLS.VBSможно найти?
Джереми Дж. Старчер
1

Массовое создание папок и предоставление разрешений работает с помощью приведенного ниже сценария powershell.

Import-Csv "D:\Scripts\foldernames.csv" | foreach-object {
    $username = $_.foldername 

    # foldername is the header of csv file

    $domain = “example.com”

    $folder= "D:\Users"

    $domainusername = $domain+“\”+$username

    New-Item $folder\$username –Type Directory

    Get-Acl $folder\$username  

    $acl = Get-Acl $folder\$username

    $acl.SetAccessRuleProtection($True, $False)

    $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("Administrators","FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")
    $acl.AddAccessRule($rule)

    $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("SYSTEM","FullControl", "ContainerInherit, ObjectInherit", "None", "Allow")
    $acl.AddAccessRule($rule)

    $rule = New-Object System.Security.AccessControl.FileSystemAccessRule("$domain\Domain Admins","Read", "ContainerInherit, ObjectInherit", "None", "Allow")
    $acl.AddAccessRule($rule)

    $rule = New-Object System.Security.AccessControl.FileSystemAccessRule($domainusername,"Modify", "ContainerInherit, ObjectInherit", "None", "Allow")
    $acl.AddAccessRule($rule)

    Set-Acl $folder\$username $acl
}

Примечание: вы должны создать такое же имя пользователя домена в CSV-файле, в противном случае вы получите проблемы с разрешениями

user2934980
источник
0
attrib +r +a +s +h <folder name> <file name> to hide
attrib -r -a -s -h <folder name> <file name> to unhide
Yashwanth
источник
2
Это атрибуты файла (только для чтения, архив, системный, скрытый), а не разрешения, которые связаны с учетными записями пользователей.
Робин Беннетт
0

отличная точка Кэлин Дари

У меня было много скриптов для использования cacls. Я перемещаю их в icacls, но когда я не могу найти скрипт для изменения томов корневого монтирования, пример: d: \ datafolder. Я наконец написал сценарий ниже, который монтирует том как временный диск, затем применяет сек. затем размонтирует его. Это единственный способ, которым я обнаружил, что вы можете обновить безопасность root-монтирования.

1 получает GUID для монтирования папки во временный файл, затем считывает GUID для монтирования тома в качестве временного диска X: применяет сек и регистрирует изменения, затем отключает том только с диска X:, чтобы смонтированная папка не изменялась и не прерывалась. затем применяется сек.

Вот пример моего сценария:

**mountvol "d:\%1" /L >tempDrive.temp && FOR /f "tokens=*" %%I IN (tempDrive.temp) DO mountvol X: %%I 
D:\tools\security\icacls.exe  %~2 /grant domain\group:(OI)(CI)F /T /C >>%~1LUNsec-%TDWEEK%-%TMONTH%-%TDAY%-%TYEAR%-%THOUR%-%TMINUTE%-%TAM%.txt
if exist x:\*.* mountvol X: /d**
HandyMannyHE
источник
0

Я являюсь администратором, и какой-то сценарий установил разрешение «Запретить» на мое имя для всех файлов и подпапок в каталоге. Выполнение icacls "D:\test" /grant John:(OI)(CI)F /Tкоманды не сработало, потому что казалось, что оно не удаляло право «Запретить» из моего имени из этого списка.

Единственное, что сработало для меня, это сброс всех разрешений с помощью icacls "D:\test" /reset /Tкоманды.

Б. Золи
источник
Эту проблему можно решить без использования команды сброса, указав '' / remove: d '', чтобы удалить любые явные настройки DENY, которые могут существовать - см. Мое идеальное решение (выше).
Ed999
-1

в windows 10 работает без "c:>" и ">"

Например:

F = Full Control
/e : Edit permission and kept old permission
/p : Set new permission

cacls "путь к файлу или папке" / e / p имя пользователя: F

(также это исправляет ошибки 2502 и 2503)

cacls "C: \ Windows \ Temp" / e / p Имя пользователя: F

Dao1988
источник
-5

Вот что сработало для меня:

  1. Вручную откройте папку, доступ к которой запрещен.

  2. Выберите исполняемый файл / файл приложения в этой папке.

  3. Щелкните правой кнопкой мыши на нем и перейдите к Properties->Compatibility

  4. Теперь посмотрите Privilege Levelи проверьте это наRun As Administrator

  5. Нажмите на Change Settings for all users.

Проблема решена сейчас.

Маюр
источник
Вопрос заключается в том, чтобы сделать это через командную строку. Хотя ваше предложение может работать хорошо, оно не применимо, если у вас есть только терминальный доступ (ssh) к серверу, который необходимо настроить, поэтому вам нужно будет использовать сценарий cmd
Ивайло Славов