2016-10-27 1 views
2

私には問題があり、誰かがそこに助言を与えることができると願っています!基本的に私のプログラムでは、私が使用して、このそのかなりバニラJava用などのアクセス制御ルールを設定し、所有権を変更、windowsフォルダを服用されます。JNAを使用してJava経由でWindowsディレクトリへの継承を復元する

私はディレクトリを忘れたいときに問題が発生し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);

しかし、私は本当にここに少し低迷していますが、正しい軌道に乗ってI AMまたは私は馬鹿であることですか?それは私には不慣れな土地です、助けてください!

[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()); 
+1

注:Windows上のファイルパス区切り文字としてスラッシュを使用することは完全に有効であり、文字列を少し読みやすくしています。 – technomage

+0

実際にこれを試しましたか?結果は何でしたか? – technomage

+0

はい私はこれを試してみましたが、ppsidOwnerなどでポインタを更新しましたが、WinNT.dllに属するセキュリティオブジェクトにこれらを変換しようとして迷ってしまいました。 WinNT.dllインターフェイスをインスタンス化しようとすると、実際のdllが見つからないため失敗しますが、WinNT.dllからメソッドをコピーするとインスタンス化されない例外が発生します。基本的に私はこのビットを間違ってやっていると思うし、JNAの経験を持つ誰かが私に正しい方向を向けることを望んでいたのですか? – GavinF

答えて

0

は、私はC#のコードを実装し、Javaへの単純なDLLをインポートし、一例として、それを呼び出すようにし、これを行うための最も簡単な方法を決定しました

しかし、それは私にとっては問題ではありません。

関連する問題