无法读取文件FileNotFoundException - 拒绝访问

时间:2017-02-01 03:10:42

标签: java windows nssm

在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具有“完全”访问权限。域“用户”组具有Read,Read&amp;执行烫发。

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

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

我尝试授予“Everyone”Read,Read&amp;在C:\ ProgramData \ MyProgram和file.license上执行perms,但这没有效果。

如果我直接运行相同的代码,比如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

进程监视器跟踪显示在屏幕截图中: CloudMonix

“java.exe”截图的Process Monitor安全属性: https://drive.google.com/file/d/0B8BMXJDodRtpY19VekRaTkR5bTA/view

0 个答案:

没有答案