2016-10-27 1 views
2

J'ai un problème et j'espère que quelqu'un là-bas peut me donner des conseils! En gros, dans mon programme, je vais prendre un dossier de fenêtres, changer la propriété, configuration de l'accès des règles de contrôle etc, pour ce son joli Java de vanille en utilisant:Restaurer l'héritage d'un répertoire Windows via Java en utilisant JNA

Files.getFileAttributeView(target, AclFileAttributeView.class);

Le problème se pose quand je veux oublier un répertoire, et pour ce faire, je veux réactiver l'héritage du répertoire parent et supprimer toutes mes règles ACL. Je peux supprimer les règles et définir le propriétaire à nouveau en Java mais il semble que je dois aller natif de mettre le drapeau de l'héritage ...

Je pense que je peux obtenir un pointeur vers le descripteur de sécurité comme celui-ci:

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

Où Advapi32.java contient: Advapi32 INSTANCE = (Advapi32) Native.loadLibrary("Advapi32", Advapi32.class, W32APIOptions.UNICODE_OPTIONS);

Mais je suis vraiment patauge un peu ici, je suis sur la bonne voie ou suis-je un idiot? C'est un terrain inconnu pour moi, s'il vous plaît aidez-moi!

+1

Remarque: il est parfaitement possible d'utiliser des barres obliques en tant que séparateurs de chemin de fichier sur les fenêtres, ce qui facilite la lecture des chaînes. – technomage

+0

Avez-vous réellement essayé cela? Quels ont été les résultats? – technomage

+0

Oui, j'ai essayé cela, je reçois des pointeurs mis à jour dans le ppsidOwner etc mais je me suis perdu alors en essayant de les convertir en l'objet de sécurité qui appartient à WinNT.dll. J'essaye d'exemple l'interface de WinNT.dll et échoue parce qu'il ne peut pas trouver la DLL réelle, cependant si je copie la méthode du WinNT.dll j'obtiens une exception de tableau non instanciée. Fondamentalement, je pense que je me trompe et j'espérais que quelqu'un avec l'expérience de la JNA pourrait me diriger dans la bonne direction? – GavinF

Répondre

0

j'ai décidé la meilleure façon de le faire était de mettre en œuvre le code en C# et importer la DLL simple à Java et appeler, comme par exemple:

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

Et en Java:

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

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

Met une dépendance sur .net mais ce n'est pas un problème pour moi.