Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java程序调用C#程序写入%ProgramData%时失去管理员权限_C#_Java_Windows 7_Admin_Shortcut - Fatal编程技术网

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

Java程序调用C#程序写入%ProgramData%时失去管理员权限,c#,java,windows-7,admin,shortcut,C#,Java,Windows 7,Admin,Shortcut,场景: 我有一个基于Java的安装程序 基于Java的安装程序调用C#程序,其任务是创建快捷方式 快捷方式位置取决于安装程序是以管理员身份运行还是以普通用户身份运行。当以管理员身份运行时,我试图创建到“%ALLUSERSPROFILE%\Desktop”的快捷方式,否则我将写入“%USERPROFILE%\Desktop” 我的印象是,当我的Java程序调用我的C#shortcut maker程序时,问题似乎是失去了管理权限 注意事项: 我以管理员身份运行基于Java的安装程序(右键单击,以管理

场景:

  • 我有一个基于Java的安装程序
  • 基于Java的安装程序调用C#程序,其任务是创建快捷方式
  • 快捷方式位置取决于安装程序是以管理员身份运行还是以普通用户身份运行。当以管理员身份运行时,我试图创建到“%ALLUSERSPROFILE%\Desktop”的快捷方式,否则我将写入“%USERPROFILE%\Desktop”
  • 我的印象是,当我的Java程序调用我的C#shortcut maker程序时,问题似乎是失去了管理权限

    注意事项:

  • 我以管理员身份运行基于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)
    
    我在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 以下是我尝试过的一些信息:

    这表明%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提升为“system”访问权限,但仍然无法进入该文件夹(系统内部提升参考:)


    我右键单击文件夹并签出安全选项卡。看起来就连我的“系统”用户也有有限的访问权限。我觉得这有点令人困惑,我可以从管理命令提示符运行命令,将快捷方式写入桌面,但通过其他过程,我无法。。。我还发现访问有点不一致。

    我现在已经把它放在了次要位置。在我的截止日期前有太多事情要做。如果时间允许的话,我以后再谈这个问题。我会密切注意,以防有人知道有用的知识。