如何设置“修改"?使用Java在Windows文件上的ACL [英] How to set "modify" ACL on a Windows file using Java

查看:54
本文介绍了如何设置“修改"?使用Java在Windows文件上的ACL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何使用Java 7的File API设置Windows ACL,使其模仿添加用户/组和以下选项:

How do you set the Windows ACL using Java 7's File API so that it mimics adding the user/group and the following options:

例如,在操作系统属性"对话框中,您可以选择以下基本写访问权限:

For example, in the OS Properties dialog, you can select the following for basic write access:

  • 修改
  • ☑读取并执行(自动选择)
  • ☑列出文件夹内容(自动选择)
  • ☑读取(自动选择)
  • ☑写入(自动选择)

但是,当我通过Java 7的File API使用类似的选项时,它会选择:

However, when I use similar options using Java 7's File API, it instead selects:

  • ☑特别
    • ☑高级(不要编辑,单击用户或组,查看)
      • 显示高级权限
      • 高级权限
        • ☑(多行复选框)

        这不仅难以管理(遍历对话框更容易错过某些内容),而且其行为与单击这些框不同.一些UAC提示的行为有所不同.更糟糕的是,由于遍历对话框,很难切换权限(例如,从Windows桌面),从而留出更多出错的机会.

        Not only is this harder to administer (traversing dialogs is easier to miss something), it doesn't behave the same was as simply clicking those boxes. Some of the UAC prompts behave differently. Worse, it's harder to toggle the permissions (e.g. from the Windows desktop) due to the dialog traversing, leaving more chance of making a mistake.

        如何使用Java设置这些复选框?

        How do I use Java to set these checkboxes?

        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);
        

        推荐答案

        我能够模仿Windows属性文件的权限,方法是创建一个我想模仿的文件夹,通过属性"对话框设置值,然后将其回显...

        I was able to mimic the Windows Properties file permissions by making a folder that I wanted to mimic, setting the values through the Properties dialog, then echoing them back out...

        // 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
        

        然后,我能够将这些值重新插入到我的原始示例中:

        Then, I was able to plug these values back into my original example:

        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();
        

        ...,现在已完全根据需要检查修改".

        ... and now "Modify" is checked exactly as desired.

        这篇关于如何设置“修改"?使用Java在Windows文件上的ACL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆