Независимо от языка Windows, как я могу заставить команду ICACLS установить папку, чтобы иметь полный доступ ко всем?

3460
Geesh_SO

Фон

Скажи, что у меня есть эта команда

icacls C:\FullyAccessibleFolder /grant Users:(OI)(CI)F

Это отлично работает в английских версиях Windows, но, похоже, не работает во французских версиях, приводя к следующей ошибке, предположительно из-за Usersразличий во французском языке. Everyoneпереводится как Tout le mondeв Windows, так что это тоже не решение.

Users: Le mappage entre les noms de compte et les ID de sécurité n'a pas été effectué.

Какой Google переводит как

Users: The mapping between account names and security IDs was not performed.

Вопрос

Можно ли использовать команду, чтобы задать папку и рекурсивно все ее содержимое, чтобы иметь полные разрешения для всех пользователей таким образом, чтобы это работало в разных языковых версиях Windows?

Контент со всего Интернета

Эта страница с в значительной степени похожей проблемой рассказывает о том, как Everyoneделается Jederна немецком и Tout le mondeфранцузском языках.

8
Просто используйте SID: `icacls C: \ FullyAccessibleFolder / grant S-1-5-32-545: (OI) (CI) F` Работает везде. Ben 7 лет назад 2
@Ben, это должно быть `icacls C: \ folder / grant * S-1-5-32-545: (OI) (CI) F`, вы пропустили звездочку. Harry Johnston 7 лет назад 2

3 ответа на вопрос

10
DavidPostill

Не работает во французских версиях, предположительно из-за Usersразличий

У вас есть три варианта, подробно описано ниже:

  1. Используйте языковой портал, чтобы получить переведенное имя

  2. Получить локализованное имя из UsersSID

  3. Используйте UsersSID сicacls


Вариант 1. Использование языкового портала (канонический ресурс по терминологии Microsoft)

Поиск пользователей возвращает:

Переводы в локализованных продуктах Microsoft

 English Translation Product Users Utilisateurs Windows 7 Users des utilisateurs Windows 7 Users Utilisateurs Windows 8 Modern Voice Users Utilisateurs Windows 8 Users Utilisateurs Windows 8.1 USERS UTILISATEURS Windows 8.1 Users Utilisateurs Windows 10 Users des utilisateurs Windows 10 Users Utilisateurs Windows 10 Anniversary Update users utilisateurs Windows 10 Anniversary Update 

Это говорит о том, что может работать следующая команда:

icacls C:\FullyAccessibleFolder /grant Utilisateurs:(OI)(CI)F 

Вариант 2: получить локализованное имя из UsersSID ( S-1-5-32-545)

SID: S-1-5-32-545

Имя: Пользователи

Описание: встроенная группа. После первоначальной установки операционной системы единственным участником является группа «Прошедшие проверку». Когда компьютер присоединяется к домену, группа «Пользователи домена» добавляется в группу «Пользователи» на компьютере.

Источник Известные идентификаторы безопасности в операционных системах Windows

Чтобы получить локализованное Usersимя группы:

Этот простой скрипт даст вам фактическое имя группы «Пользователи» (S-1-5-32-545)на данном ПК:

 Set objWMIService = GetObject("winmgmts:\\.\root\cimv2") Set objAccount = objWMIService.Get ("Win32_SID.SID='S-1-5-32-545'") Wscript.Echo objAccount.AccountName 

Поместите его в файл с расширением vbs (предположим usersName.vbs).

Теперь запустите:

echo Y|for /f "delims=" %i in ('cscript -Nologo usersName.vbs') do cacls foldername /G "%i":F 

Исходные Cacls, Windows 7, полные права, локальные имена от wmz


Вариант 3: использовать UsersSID сicacls

Используйте следующую команду:

icacls C:\FullyAccessibleFolder /grant *S-1-5-32-545:(OI)(CI)F 

Комментарий источника от Гарри Джонстона

`xcacls` - это скрипт, который вы можете скачать. Не нужно; `icacls` встроен в Windows и может выполнять ту же работу. Harry Johnston 7 лет назад 0
@HarryJohnston Правильно, но мой ответ показывает, как получить локализованную версию `Users` ... Я уточнил ответ, поскольку нам не нужна часть` xacls` в цитируемом решении. DavidPostill 7 лет назад 0
@HarryJohnston Я также добавил использование icacls напрямую за кредит. DavidPostill 7 лет назад 0
Я принял ответ от DavidPostill, поскольку он делает это в режиме командной строки, что замечательно при использовании пакетных сценариев или сценариев PS. В конце я фактически создал небольшой исполняемый файл в C #, который просто берет путь и делает именно то, что мне нужно. Он не так настраиваем, как ответы здесь, и требует .NET Framework, но он очень хорошо подходит для моей конкретной цели. Если кому-то интересно, вот основа кода C #, с которым я в итоге поехал. http://stackoverflow.com/a/35461832/1639615 Geesh_SO 7 лет назад 0
6
Tonny

Группу AD нужно указывать не по ее имени, а по номеру SID.
Для стандартных групп, таких как «EveryOne», «Пользователи домена» и т. Д., Существуют стандартизированные номера SID, которые можно найти на странице MSDN. Известные идентификаторы безопасности (SID) .

Ниже приведены наиболее распространенные относительные идентификаторы.

enter image description here

Структура SID описывается следующим образом:

Компоненты SID легче визуализировать, когда SID конвертируются из двоичного в строковый формат с использованием стандартной записи:

SRX-Y1-Y2-Yn-1-Yn

 Component Definition  S Indicates that the string is a SID R Revision level X Identifier authority value Y A series of subauthority values, where n is the number of values 

Например, SID для встроенной группы «Администраторы» представлен в стандартной записи SID в виде следующей строки:

S-1-5-32-544

Этот SID состоит из четырех компонентов:

  • Уровень редакции (1)

  • Значение авторитетного идентификатора (5, полномочие NT)

  • Идентификатор домена (32, встроенный)

  • Относительный идентификатор (544, Администраторы)

Как работают идентификаторы безопасности

Стоит отметить, что все пользователи входят в группу пользователей по умолчанию. Поэтому, если вы хотите предоставить «полный доступ: всем учетным записям пользователей, просто используйте SID` S-1-5-32-544`, а затем измените ACL, чтобы дать все разрешения группе для рассматриваемого файла или папки. Ramhound 7 лет назад 0
@Ramhound `544` - Администраторы,` 545` - Пользователи. DavidPostill 7 лет назад 0
@DavidPostill - Да; Ошибка копирования и вставки. Ramhound 7 лет назад 0
@ Ramhound Намного лучше. Это было лучшее, что я мог сделать, находясь на телефоне. Спасибо за редактирование. Tonny 7 лет назад 0
3
Ben N

Если вам нравятся скрипты PowerShell, но у вас проблемы с запоминанием чисел для идентификаторов безопасности:

$acl = Get-Acl .\myfolder $sid = New-Object System.Security.Principal.SecurityIdentifier ([System.Security.Principal.WellKnownSidType]::BuiltinUsersSid, $null) $rule = New-Object System.Security.AccessControl.FileSystemAccessRule ($sid, 'FullControl', 'ObjectInherit,ContainerInherit', 'None', 'Allow') $acl.AddAccessRule($rule) Set-Acl .\myfolder $acl 

Я знаю, что это похоже на тонну набора текста, но эти длинные идентификаторы завершены:

  • System.Security.Principal.SecurityIdentifier от securityi
  • System.Security.Principal.WellKnownSidType от wellknownsi
  • System.Security.AccessControl.FileSystemAccessRule от filesystem

Все эти строки являются идентификаторами .NET, поэтому они не локализуются.

Если вы хотите Everyoneвместо этого SID, используйте WorldSidвместо BuiltinUsersSid. Чтобы получить список всех WellKnownSidTypeопций, посмотрите MSDN или выполните эту команду:

[System.Security.Principal.WellKnownSidType].DeclaredFields | select Name 
_FileSystemAccessRule_ без *** Sid *** и используя `имена групп`? Kiquenet 6 лет назад 0
@Kiquenet Я не совсем уверен, что вы спрашиваете, но если вы предпочитаете указывать удобочитаемое имя группы, это больше не будет зависеть от языка. Если вы согласны с этим, вы можете удалить строку `$ sid =` и заменить `$ sid` в строке` $ rule = `строкой, идентифицирующей группу. Ben N 6 лет назад 0