0

在 Windows Server 2012 上从我的 Java 程序读取文件时,我收到“拒绝访问”。多年来我一直在做这种事情,所以我不是新手。我只是无法弄清楚我错过了什么!

这是堆栈(已编辑):

Caused by: java.io.FileNotFoundException: C:/ProgramData/MyProgram/resource/file.license (Access is denied)
#0: java.io.FileInputStream.open0(Native Method)
#1: java.io.FileInputStream.open(Unknown Source)
#2: java.io.FileInputStream.<init>(Unknown Source)
#3: java.io.FileInputStream.<init>(Unknown Source)
#4: com...util.FileUtil.readFileAsString(FileUtil.java:269)

Java 程序使用 NSSM 作为 Windows 服务运行。该服务配置为作为用户“cmb@contoso.com”运行。“file.license”文件的用户 cmb@contoso.com 具有“完全”访问权限。域“用户”组具有读取、读取和执行权限。

“C:/ProgramData/MyProgram”上的权限授予 cmb@contoso.com 完全访问权限。

如果我运行 Process Explorer 并查看“java.exe”属性 > 安全性,我看到它显示“CONTOSO\cmb”作为进程运行的用户。

我尝试在 C:\ProgramData\MyProgram 和 file.license 上授予“所有人”读取、读取和执行权限,但这没有任何效果。

如果我直接运行相同的代码,比如从 Eclipse 运行,它可以正常工作。

readFileAsString 方法:

public static String readFileAsString(String filePath) {
    if (filePath == null)
        throw new IllegalArgumentException("No file argument given");

    try {
        byte[] buffer = new byte[(int) new File(filePath).length()];
        FileInputStream f = new FileInputStream(filePath);
        f.read(buffer);
        f.close();

        return new String(buffer);
    } catch (IOException e) {
        throw new OperationFailedException(e);
    }
}

Java 是来自 Oracle 的 1.8_111

进程监视器跟踪显示在屏幕截图中: https ://drive.google.com/file/d/0B8BMXJDodRtpY19VekRaTkR5bTA/view

“java.exe”屏幕截图的进程监视器安全属性: https ://drive.google.com/file/d/0B8BMXJDodRtpQko0YlVRNkZBQ1k/view

4

0 回答 0