使用JNA通过Java将继承恢复到Windows目录

使用JNA通过Java将继承恢复到Windows目录,java,c++,windows,security,jna,Java,C++,Windows,Security,Jna,我有个问题,我希望有人能给我建议!基本上,在我的程序中,我将使用windows文件夹、更改所有权、设置访问控制规则等,为此,我将使用非常普通的Java: Files.getFileAttributeView(目标,AclFileAttributeView.class) 当我想忘记一个目录时,问题就出现了,为此,我想重新启用对父目录的继承并删除所有ACL规则。我可以删除规则并使用Java重新设置所有者,但是看起来我必须使用本机设置继承标志 我想我可以得到一个指向安全描述符的指针,如下所示:

我有个问题,我希望有人能给我建议!基本上,在我的程序中,我将使用windows文件夹、更改所有权、设置访问控制规则等,为此,我将使用非常普通的Java:

Files.getFileAttributeView(目标,AclFileAttributeView.class)

当我想忘记一个目录时,问题就出现了,为此,我想重新启用对父目录的继承并删除所有ACL规则。我可以删除规则并使用Java重新设置所有者,但是看起来我必须使用本机设置继承标志

我想我可以得到一个指向安全描述符的指针,如下所示:

    Advapi32 advapi32 = Advapi32.INSTANCE;
    PointerByReference ppsidOwner = new PointerByReference();
    PointerByReference ppsidGroup = new PointerByReference();
    PointerByReference ppDacl = new PointerByReference();
    PointerByReference ppSacl = new PointerByReference();
    PointerByReference ppSecurityDescriptor = new PointerByReference();
    int reqSecurityInfo = Advapi32.OWNER_SECURITY_INFORMATION |
            Advapi32.DACL_SECURITY_INFORMATION |
            Advapi32.SACL_SECURITY_INFORMATION |
            Advapi32.GROUP_SECURITY_INFORMATION;
    int ret = advapi32.GetNamedSecurityInfo("c:\\\\testpaths", Advapi32.SE_FILE_OBJECT, 
            reqSecurityInfo, ppsidOwner, ppsidGroup, ppDacl, ppSacl, ppSecurityDescriptor);
    if(ret != 0){
        throw new Win32Exception(ret);
    }
其中Advapi32.java包含:
Advapi32 INSTANCE=(Advapi32)Native.loadLibrary(“Advapi32”,Advapi32.class,w32apipoptions.UNICODE_选项)


但我真的有点挣扎,我是在正确的轨道上还是我是个白痴?这是我不熟悉的地方,请帮忙

我认为最简单的方法是用C#实现代码,然后将简单的DLL导入java,并调用它,例如:

    [RGiesecke.DllExport.DllExport]
    static void ReEnableInheretance(String dirPath)
    {
        DirectorySecurity dirSecurity = new DirectorySecurity();
        dirSecurity.SetAccessRuleProtection(false, false);
        Directory.SetAccessControl(dirPath, dirSecurity); 
    }
在Java中:

public interface MyNewLib extends Library {
    public void ReEnableInheretance(String dirPath);
}

MyNewLib myNewLib = (MyNewLib )Native.loadLibrary("MyNewLib ",MyNewLib.class);
myNewLib .ReEnableInheretance(path.toString());

将依赖关系放在.net上,但这对我来说不是问题。

注意:在windows上使用前向斜杠作为文件路径分隔符是完全有效的,而且它使字符串更易于阅读。您确实尝试过这种方法吗?结果是什么?是的,我尝试过这个,我在ppsidOwner中更新了指针等,但是我在尝试将这些指针转换为属于WinNT.dll的安全对象时迷失了方向。我尝试实例化WinNT.dll接口,但它失败了,因为它找不到实际的dll,但是如果我从WinNT.dll复制该方法,我会得到一个数组未实例化异常。基本上,我认为我做得有点错误,希望有JNA经验的人能给我指出正确的方向?通常,你可以使用现有指针创建任何结构的新实例。不过,您需要发布一些实际的代码,以便任何人都能够提供建议。