Java程序调用C#程序写入%ProgramData%时丢失管理员权限

时间:2012-05-28 17:25:55

标签: c# java windows-7 admin shortcut

情景:

  1. 我有一个基于java的安装程序。
  2. 基于java的安装程序调用C#程序,其作用是创建快捷方式。
  3. 快捷方式位置取决于安装程序是以管理员身份还是以普通用户身份运行。当以管理员身份运行时,我正在尝试创建“%ALLUSERSPROFILE%\ Desktop”的快捷方式,否则我会写入“%USERPROFILE%\ Desktop”。
  4. 我的印象是,当我的java程序调用我的C#快捷方式程序时,问题似乎是丢失了管理权限。

    备注:

    1. 我以管理员身份运行基于java的安装程序(右键单击,以管理员身份运行)。
    2. 我能够验证安装程序是否以管理员权限运行,因为我可以读取需要管理权限的注册表项。
    3. 我通过'Process process = Runtime.getRuntime()。exec(command);'
    4. 调用我的C#程序
    5. 通过管理命令提示符手动运行命令时,该命令正常工作。 (当输出到“%ALLUSERSPROFILE%\ Desktop”时)
    6. 当手动运行相同的命令时,从正常的命令提示符,我得到System.UnauthorizedAccessException。 (这是预期的)。程序崩溃的情况类似于从安装程序运行时崩溃。
    7. 例外:

        

      未处理的异常:System.UnauthorizedAccessException:Access是   否认。 (来自HRESULT的异常:0x80070005(E_ACCESSDENIED))at   IWshRuntimeLibrary.IWshShortcut.Save()

      对我缺少什么的想法?安装程序需要灵活地以普通用户和管理员身份运行...因此,我们可以理解我可以采取哪些措施来确保这种行为。


      更新1:

      我在运行时将调试器附加到C#程序。它扔了一个:

      DirectoryNoFoundException was unhandled 
      The system cannot find the path specified. (Exception from HRESULT: 0x80070003)
      

      我在我的shortcutmaker命令之前添加了“mkdir”命令。 mkdir命令只是在尝试写入目录之前确保目录存在。

      重建安装程序,运行它并在尝试 mkdir“%ALLUSERSPROFILE%\ Desktop”时,java抛出异常

      java.io.IOException: Cannot run program "mkdir": CreateProcess error=2, The system cannot find the file specified
      java.io.IOException: Cannot run program "mkdir": CreateProcess error=2, The system cannot find the file specified
              at java.lang.ProcessBuilder.start(Unknown Source)
              at java.lang.Runtime.exec(Unknown Source)
              at java.lang.Runtime.exec(Unknown Source)
              at java.lang.Runtime.exec(Unknown Source)
      

      此时,看起来我的进程没有获得管理员访问

              Process process = Runtime.getRuntime().exec(command);
      

      我要看看能不能找到别的东西。如果我搞清楚的话会发另一篇文章。


      更新2:

      下面给了我一些尝试的信息:Enterprise Logging not translating environment variables in XML Trace Listener fileName specification

      它表明%ALLUSERSPROFILE%未被翻译。

      而不是%ALLUSERSPROFILE%,我通过以下方式获得了环境变量值:

          String allUsersProfile = System.getenv("ALLUSERSPROFILE");
          String userProfile = System.getenv("USERPROFILE");
      

      然后我能够将实际值提供给C#程序。但是我还有问题。

      从管理控制台我可以导航到“c:\ ProgramData \ Start Menu”,但是如果我使用管理权限运行“explorer”,我可以导航到“c:\ ProgramData”但是看不到任何过去的内容。通过一些看,我发现“c:\ ProgramData \ Start Menu”是受保护的操作系统文件。所以我打开设置来看它。所以现在我可以看到它,但不能进入它。

      使用系统内部,我将explorer.exe提升为“系统”访问权限但仍然无法进入该文件夹(系统内部提升参考:http://verbalprocessor.com/2007/12/05/running-a-cmd-prompt-as-local-system/

      我右键单击该文件夹并检出安全选项卡。看起来甚至我的“系统”用户访问受限。我发现这有点莫名其妙,我可以从一个管理命令提示符运行命令,将快捷方式写入桌面,但是通过这个其他进程我不能...我也发现访问有点不一致。 / p>

      我会继续玩这个,如果我想出来的话,还会做另一个帖子。或者

0 个答案:

没有答案