2013-08-22 56 views
0

我已经写了一个程序在C#中更改文件和文件夹属性在Windows中。 我从Java运行这个程序,开始从窗户全部 的伟大工程的程序,在java中只是文件是可以改变的,当我尝试更改文件夹 它抛出:Java与用户特权执行.exe

 
Problem signature: 
    Problem Event Name: CLR20r3 
    Problem Signature 01: fileattr.exe 
    Problem Signature 02: 1.0.0.0 
    Problem Signature 03: 5203a06f 
    Problem Signature 04: mscorlib 
    Problem Signature 05: 4.0.30319.18052 
    Problem Signature 06: 5173c144 
    Problem Signature 07: 43cf 
    Problem Signature 08: 13c 
    Problem Signature 09: System.UnauthorizedAccess 
    OS Version: 6.1.7601.2.1.0.256.48 

我设置的ProcessBuilder目录到user.home认为这个问题可能会因为这个问题而变成 ,但不起作用。 我的代码:

 
try { 

       ProcessBuilder pb = new ProcessBuilder("fileattr", "+t",     "\"".concat(path).concat("\"")); 
       pb.environment().put("fileattr", pathToApp); 
       pb.directory(new File(System.getenv("WINDIR") + "\\system32")); 
       Process p = pb.start(); 
       p.waitFor(); 
       p.destroy(); 
      } catch (Throwable t) { 
       t.printStackTrace(); 
      } 
+0

您是否尝试过以管理员身份启动JVM? –

+0

对不起我的无知,但我该怎么做?添加清单应该工作? 进程是在用户上下文中还是在jvm上下文中启动的? –

回答

0

我根据this线程想,你有两种可能性:

  • 您可以add a manifest您fileattr.exe
  • 您可以使用elevate.exe,使用运行二进制文件: ProcessBuilder pb = new ProcessBuilder("elevate", "fileattr");

我希望我回答你的问题。

0

第一种可能性都没有解决,我已经建立与UAC级别的两个选项清单文件中的filleattr:

highestAvailable|requireAdministrator 

这里的清单:

<security> 
    <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <requestedExecutionLevel level="highestAvailable" uiAccess="false" /> 
    </requestedPrivileges> 
</security> 

二有一个问题,我包括两个.exe文件在Java jar中,当程序启动时提取 .exe文件并尝试执行它们,问题,提取过程正在修改可执行文件中的某些东西,当我尝试运行o riginal文件都可以完美运行,否则它抛出的:

This version of C:\Users\Luis\SyncData\Elevate.exe is not compatible with th e version of Windows you're running. Check your computer's system information to see whether you need a x86 (32-bit) or x64 (64-bit) version of the program, and then contact the software publisher.

也许@Templar sugestion应该工作,我只需要JVM授予用户权限的那是足以改变文件夹atributtes,我想试试。

重要的是,从30秒到30秒,一个线程调用这个方法很多次,所以权限需要是永久的,否则它将无法正常工作。