某些用户的 OpenProcess() 失败,访问被拒绝
OpenProcess() fails for some users with access denied
我正在使用 Java
JNA
来访问 Windows
上的进程内存。我的代码如下所示:
static WinNT.HANDLE openProcessHandle(int processId)
{
val processAccessRights = PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_TERMINATE
| PROCESS_NAME_NATIVE | PROCESS_SUSPEND_RESUME | PROCESS_QUERY_INFORMATION | PROCESS_QUERY_LIMITED_INFORMATION;
val processHandle = Kernel32.INSTANCE.OpenProcess(processAccessRights, false, processId);
if (processHandle == null)
{
val lastError = Native.getLastError();
val formatMessageFromLastErrorCode = Kernel32Util.formatMessageFromLastErrorCode(lastError);
val message = "OpenProcess() failed to open process id "
+ processId + ": " + formatMessageFromLastErrorCode;
throw new IllegalStateException(message);
}
return processHandle;
}
我已经没有使用 PROCESS_ALL_ACCESS
due to the problems it causes.
根据this的回答,我还需要为我的进程启用调试权限。然而,尽管在 OpenProcess()
之前成功调用此代码(例如,所有 return 值都表示成功),但一些用户仍然收到错误消息 OpenProcess() failed to open process id xxxx: Access denied
。我的应用程序 not 运行ning 作为管理员。为什么它对我和大多数没有管理员权限的用户有效,但对所有用户无效?究竟是什么导致了这种不一致?我更愿意具体地理解和解决这个问题,而不是让所有用户 运行 我的软件作为管理员,因为我的软件通常不需要这些额外的权限。
我在 2017 年撰写了您引用的答案,去年得知我遗漏了一些关键内容。我可能应该编辑那个旧答案来更新它,但我忘记了它。请参阅 以获取我将编辑到您引用的上一个代码中的代码的更正版本。
AdjustTokenPrivileges()
的 API 有点破损,因为它会给出错误的成功指示:
If the function succeeds, the return value is nonzero. To determine whether the function adjusted all of the specified privileges, call GetLastError, which returns one of ... ERROR_SUCCESS
... ERROR_NOT_ALL_ASSIGNED
.
鉴于您正在尝试调整非管理员用户的权限,您实际上无法这样做,并且其他用户将无法 OpenProcess()
其他用户的进程。我认为除了 运行 您的程序具有必要的管理权限 (SE_DEBUG_PRIVILEGE
) 之外没有其他解决方法,必须由管理员在某个时候分配。
您可能仍然收到误导性的成功指示,但需要检查 GetLastError()
以查看它是否真的有效。
我正在使用 Java
JNA
来访问 Windows
上的进程内存。我的代码如下所示:
static WinNT.HANDLE openProcessHandle(int processId)
{
val processAccessRights = PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_TERMINATE
| PROCESS_NAME_NATIVE | PROCESS_SUSPEND_RESUME | PROCESS_QUERY_INFORMATION | PROCESS_QUERY_LIMITED_INFORMATION;
val processHandle = Kernel32.INSTANCE.OpenProcess(processAccessRights, false, processId);
if (processHandle == null)
{
val lastError = Native.getLastError();
val formatMessageFromLastErrorCode = Kernel32Util.formatMessageFromLastErrorCode(lastError);
val message = "OpenProcess() failed to open process id "
+ processId + ": " + formatMessageFromLastErrorCode;
throw new IllegalStateException(message);
}
return processHandle;
}
我已经没有使用 PROCESS_ALL_ACCESS
due to the problems it causes.
根据this的回答,我还需要为我的进程启用调试权限。然而,尽管在 OpenProcess()
之前成功调用此代码(例如,所有 return 值都表示成功),但一些用户仍然收到错误消息 OpenProcess() failed to open process id xxxx: Access denied
。我的应用程序 not 运行ning 作为管理员。为什么它对我和大多数没有管理员权限的用户有效,但对所有用户无效?究竟是什么导致了这种不一致?我更愿意具体地理解和解决这个问题,而不是让所有用户 运行 我的软件作为管理员,因为我的软件通常不需要这些额外的权限。
我在 2017 年撰写了您引用的答案,去年得知我遗漏了一些关键内容。我可能应该编辑那个旧答案来更新它,但我忘记了它。请参阅
AdjustTokenPrivileges()
的 API 有点破损,因为它会给出错误的成功指示:
If the function succeeds, the return value is nonzero. To determine whether the function adjusted all of the specified privileges, call GetLastError, which returns one of ...
ERROR_SUCCESS
...ERROR_NOT_ALL_ASSIGNED
.
鉴于您正在尝试调整非管理员用户的权限,您实际上无法这样做,并且其他用户将无法 OpenProcess()
其他用户的进程。我认为除了 运行 您的程序具有必要的管理权限 (SE_DEBUG_PRIVILEGE
) 之外没有其他解决方法,必须由管理员在某个时候分配。
您可能仍然收到误导性的成功指示,但需要检查 GetLastError()
以查看它是否真的有效。