Как установить «изменить» ACL на файл Windows, используя Java - PullRequest
2 голосов
/ 04 ноября 2019

Как настроить Windows ACL с помощью файлового API Java 7, чтобы он имитировал добавление пользователя / группы и следующие параметры:

Например, в диалоговом окне «Свойства ОС» можно выбрать следующее длябазовый доступ для записи:

  • Изменить
  • ☑ Чтение и выполнение (автоматический выбор)
  • ☑ Список папок Содержание (автоматический выбор)
  • ☑ Чтение (с автоматическим выбором)
  • ☑ Запись (с автоматическим выбором)

Однако, когда я использую аналогичные параметры, используя File API Java 7, онвместо этого выбирает:

  • ☑ Специальный
    • ☑ Дополнительно (НЕ редактировать, нажмите «Пользователь» или «Группа», «Просмотр»)
      • Показать расширенные разрешения
      • Дополнительные разрешения
        • ☑ (группа флажков)

Не только это сложнее в администрировании (диалоговые окна обходалегче что-то пропустить), это не ведет себя так же, как просто щелкая эти поля. Некоторые подсказки UAC ведут себя по-разному. Хуже того, сложнее переключать разрешения (например, с рабочего стола Windows) из-за обхода диалогов, оставляя больше шансов на ошибку.

Как использовать Java для установки этих флажков?

UserPrincipal authenticatedUsers = path.getFileSystem().getUserPrincipalLookupService()
        .lookupPrincipalByName("Authenticated Users");
AclFileAttributeView view = Files.getFileAttributeView(path, AclFileAttributeView.class);

// Create ACL to give "Authenticated Users" "modify" access
AclEntry entry = AclEntry.newBuilder()
        .setType(AclEntryType.ALLOW)
        .setPrincipal(authenticatedUsers)
        .setPermissions(DELETE, DELETE_CHILD, LIST_DIRECTORY, READ_DATA, READ_ATTRIBUTES, ADD_FILE, WRITE_DATA, WRITE_ATTRIBUTES)
        .build();

List<AclEntry> acl = view.getAcl();
acl.add(0, entry); // insert before any DENY entries
view.setAcl(acl);

1 Ответ

1 голос
/ 04 ноября 2019

Мне удалось имитировать разрешения для файла свойств Windows, создав папку, которую я хотел имитировать, задав значения в диалоговом окне «Свойства», а затем вернув их обратно ...

// Echo ACL
Path path = Paths.get("C:\\myfolder");

UserPrincipal authenticatedUsers = path.getFileSystem().getUserPrincipalLookupService()
        .lookupPrincipalByName("Authenticated Users");

AclFileAttributeView view = Files.getFileAttributeView(path, AclFileAttributeView.class);
for(AclEntry entry : view.getAcl()) {
    if(entry.principal().equals(authenticatedUsers)) {
        System.out.println("=== flags ===");
        for (AclEntryFlag flags : entry.flags()) {
            System.out.println(flags.name());
        }

        System.out.println("=== permissions ===");
        for (AclEntryPermission permission : entry.permissions()) {
            System.out.println(permission.name());
        }
    }
}

Вывод:

=== flags ===
DIRECTORY_INHERIT
FILE_INHERIT

=== permissions ===
WRITE_NAMED_ATTRS
WRITE_ATTRIBUTES
DELETE
WRITE_DATA
READ_ACL
APPEND_DATA
READ_ATTRIBUTES
READ_DATA
EXECUTE
SYNCHRONIZE
READ_NAMED_ATTRS

Затем я смог вставить эти значения обратно в свой исходный пример:

UserPrincipal authenticatedUsers = path.getFileSystem().getUserPrincipalLookupService()
        .lookupPrincipalByName("Authenticated Users");
AclFileAttributeView view = Files.getFileAttributeView(path, AclFileAttributeView.class);

// Create ACL to give "Authenticated Users" "modify" access
AclEntry entry = AclEntry.newBuilder()
        .setType(AclEntryType.ALLOW)
        .setPrincipal(authenticatedUsers)
        .setFlags(DIRECTORY_INHERIT,
                  FILE_INHERIT)
        .setPermissions(WRITE_NAMED_ATTRS,
                        WRITE_ATTRIBUTES,
                        DELETE,
                        WRITE_DATA,
                        READ_ACL,
                        APPEND_DATA,
                        READ_ATTRIBUTES,
                        READ_DATA,
                        EXECUTE,
                        SYNCHRONIZE,
                        READ_NAMED_ATTRS)
        .build();

... и теперь «Изменить» проверяется точно так, как нужно.

...