场景:
- 我有一个基于 Java 的安装程序。
- 基于 Java 的安装程序调用 C# 程序,其工作是创建快捷方式。
- 快捷方式的位置取决于安装程序是以管理员身份运行还是以普通用户身份运行。以管理员身份运行时,我正在尝试创建“%ALLUSERSPROFILE%\Desktop”的快捷方式,否则我将写入“%USERPROFILE%\Desktop”。
我的印象是,当我的 Java 程序调用我的 C# 快捷方式制作程序时,问题似乎是失去了管理权限。
笔记:
- 我以管理员身份运行基于 Java 的安装程序(右键单击,以管理员身份运行)。
- 我能够验证安装程序是否以管理员权限运行,因为我可以读取需要管理权限的注册表项。
- 我正在通过“Process process = Runtime.getRuntime().exec(command);”调用我的 C# 程序
- 通过管理命令提示符手动运行命令时,该命令可以正常工作。(输出到“%ALLUSERSPROFILE%\Desktop”时)
- 从正常的命令提示符手动运行相同的命令时,我得到 System.UnauthorizedAccessException。(这是意料之中的)。程序崩溃的方式与从安装程序运行时类似。
例外:
未处理的异常:System.UnauthorizedAccessException:访问被拒绝。(来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))在 IWshRuntimeLibrary.IWshShortcut.Save()
对我所缺少的有什么想法吗?安装程序需要灵活地以普通用户和管理员身份运行。我怎样才能确保这种行为?
更新 1
我在运行时将调试器附加到 C# 程序。它正在抛出:
DirectoryNoFoundException was unhandled
The system cannot find the path specified. (Exception from HRESULT: 0x80070003)
我在快捷方式制作命令之前添加了“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 translate 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-提示为本地系统/)
我右键单击该文件夹并检查了安全选项卡。看起来即使是我的“系统”用户的访问权限也是有限的。我觉得这有点莫名其妙,我可以从管理命令提示符运行该命令,该命令会将快捷方式写入桌面,但是通过这个其他过程我不能......我也发现访问有点不一致。