在 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