2016-10-27 4 views
2

У меня проблема, и я НАДЕЕТСЯ, что кто-то там может дать мне совет! В основном в моей программе я буду брать папку окна, изменения формы собственности, устанавливая правила контроля доступа и т.д., для этого его довольно ванильного Java с помощью:Восстановление наследования каталога Windows с помощью Java с помощью JNA

Files.getFileAttributeView(target, 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, W32APIOptions.UNICODE_OPTIONS);

Но я действительно барахтается немного здесь, я на правильном пути, или я идиот? Для меня это незнакомо, пожалуйста, помогите!

+1

Примечание: совершенно верно использовать косые черты в качестве разделителей пути к файлам в окнах, и это упрощает чтение строк. – technomage

+0

Вы на самом деле пробовали это? каковы были результаты? – technomage

+0

Да, я пробовал это, я получаю указатели, обновленные в ppsidOwner и т. Д., Но потом я потерялся, пытаясь преобразовать их в объект безопасности, который принадлежит WinNT.dll. Я пытаюсь экземпляр интерфейса WinNT.dll, и он терпит неудачу, потому что он не может найти фактическую DLL, однако, если я скопирую метод из WinNT.dll, я получаю массив, не созданный исключение. В принципе, я думаю, что я делаю это немного неправильно и надеялся, что кто-то с опытом JNA может указать мне в правильном направлении? – GavinF

ответ

0

я решил самый простой способ сделать это было реализовать код в 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, однако это не проблема для меня.

 Смежные вопросы

  • Нет связанных вопросов^_^