问题标签 [openprocess]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
8997 浏览

c++ - VC++ 2008,OpenProcess 总是返回错误 5(拒绝访问)

当我尝试使用 PROCESS_ALL_ACCESS 作为我想要的访问权限调用 OpenProcess 时,有谁知道为什么 MSVC++ 2008 总是在 GetLastError() 上返回错误 5?PROCESS_VM_READ 工作得很好。我是这台计算机的管理员,它在 Dev C++ 中运行良好。

我需要在某处设置一个选项吗?

0 投票
1 回答
4870 浏览

visual-c++ - 如何在可移动驱动器上查找和关闭所有打开的文件句柄(在弹出之前)

我正在尝试弹出(虚拟)可移动驱动器,但它失败了,因为打开了一些文件句柄,可能是资源管理器窗口。获取该驱动器上文件的所有打开句柄并关闭它们的最佳方法是什么?

查找从该驱动器运行的任何进程是否也可行(在用户模式下),所以我可以用进程名称警告用户?

理想情况下,我想在用户模式应用程序中执行此操作,而不是需要管理员权限。

我在 Visual Studio 2005 中的 MFC 应用程序中使用 VC++,但欢迎使用任何语言的示例!

0 投票
2 回答
1023 浏览

c++ - 如何检查进程是否仍在 Windows Server 2008 上运行?

我们有两个服务:一个是 32 位的(process1),另一个是 64 位的(process2)。我们有 process1 用来检查 process2 是否正在运行的代码: HANDLE hProcess; RESET_WIN_ERRNO;

此代码在 Windows server 2003 中运行良好,但在 Windows server 2008 中不起作用。有什么想法吗?

我阅读了有关 Session0 的有关 win2008 中引入的服务的信息,但在我们的例子中,两者都是服务(除非 Microsoft 非常讨厌 java 将其移至 Session1),因此不应该有任何访问问题。

我找到了这个线程:http ://social.msdn.microsoft.com/forums/en-US/winserver2008appcompatabilityandcertification/thread/c7d7e3fe-f8e5-49c3-a16f-8e3dec5e8cf8/ 它指出 32 位进程无法访问 64 位进程了。在这里可以做什么?

0 投票
1 回答
953 浏览

c++ - 我的服务启动的进程上的 OpenProcess / SetProcessAffinityMask

在我的 manager.exe 中,我试图更改我的 worker.exe 的 CPU 使用率,它由我的 service.exe 启动。Service.exe 在系统帐户下运行,而 manager.exe 在登录用户的帐户下运行。

当我使用 worker.exe 的 PID 在 manager.exe 中调用 OpenProcess 时,procHandle 为 NULL:

HANDLE procHandle = OpenProcess(PROCESS_SET_INFORMATION, 0, pid);

使用 GetLastError() 我看到我收到拒绝访问错误。

有什么办法解决这个问题吗?我可以以某种方式修改 worker.exe 以授予其他进程对其自身的完全控制权吗?

0 投票
1 回答
22735 浏览

c++ - Windows Vista/Windows 7 权限:SeDebugPrivilege & OpenProcess

我能够找到的关于升级到满足我需要的适当权限的所有内容都与我当前的方法一致,但问题仍然存在。我希望也许有人有一些 Windows Vista/Windows 7 内部经验,可能会在只有黑暗的地方发光。我相信这会很长,但请耐心等待。

语境

我正在开发一个需要访问当前机器上其他进程的内存的应用程序。这显然需要管理员权限。它还需要SeDebugPrivilege(不,这不是 的拼写错误SetDebugPrivilege),我相信自己正确地获得了它,尽管我质疑是否不需要更多特权,从而导致我的问题。到目前为止,代码已在所有版本的 Windows XP 以及我的测试 Vista 32 位和 Windows 7 64 位环境中成功运行。

过程

  • 程序将始终以管理员权限运行。在这篇文章中可以假设这一点。
  • 升级当前流程Access Token以包含SeDebugPrivilege权利。
  • 用于EnumProcesses创建系统上当前 PID 的列表
  • OpenProcess使用PROCESS_ALL_ACCESS访问权限打开句柄
  • 用于ReadProcessMemory读取其他进程的内存。

问题:

在开发和我的个人测试期间一切正常(包括 Windows XP 32 和 64、Windows Vista 32 和 Windows 7 x64)。但是,在同事的 Windows Vista(32 位)和 Windows 7(64 位)计算机上进行测试部署期间,似乎存在特权/权限问题,OpenProcess并因一般Access Denied错误而失败。这在以受限用户身份运行(如预期的那样)和以管理员身份显式运行时(右键单击 →以管理员身份运行以及从管理员级别命令提示符运行时)都会发生。

但是,在我的测试环境中,这个问题对于我自己来说是无法重现的。我亲眼目睹了这个问题,所以我相信问题存在。我可以辨别实际环境和我的测试环境之间的唯一区别是,在 UAC 提示符下使用域管理员帐户时会发生实际错误,而我的测试(没有错误)使用本地管理员帐户UAC 提示。

看来,尽管使用的凭据允许 UAC“以管理员身份运行”,但该进程仍未获得能够OpenProcess在另一个进程上运行的正确权限。我对 Vista/Windows 7 的内部结构不够熟悉,不知道这可能是什么,我希望有人知道可能是什么原因。

踢球者

报告这个错误的人,并且他的环境可以定期重现这个错误,有一个小应用程序,它的名字RunWithDebugEnabled是一个小引导程序,它似乎提升自己的权限,然后启动传递给它的可执行文件(因此继承升级的权限)。当使用该程序运行时,在 UAC 提示符下使用相同的域管理员凭据,该程序可以正常工作,并且能够成功调用OpenProcess并按预期运行。

所以这肯定是获取正确权限的问题,众所周知,域管理员帐户一个管理员帐户,应该能够访问正确的权限。(显然获得这个源代码会很棒,但如果可能的话,我不会在这里)。

笔记

如前所述,失败OpenProcess尝试报告的错误是Access Denied. 根据 MSDN 文档OpenProcess

如果调用者启用了 SeDebugPrivilege 权限,则无论安全描述符的内容如何,​​都会授予所请求的访问权限。

这使我相信,在这些条件下,可能存在问题(1)获取SeDebugPrivileges或(2)需要任何 MSDN 文档中未提及的其他权限,并且域管理员帐户和本地管理员之间可能有所不同帐户

示例代码:




谢谢!

如果有人对在上述条件下在 Windows Vista 和 Windows 7 上正确打开另一个进程(假设可执行文件已正确“以管理员身份运行”ed)可能缺少哪些可能的权限、特权、权利等有所了解,将不胜感激。

如果我不是完全被难住了,我就不会在这里,但我希望该小组的经验和知识再次闪耀。我感谢您花时间阅读这堵文字墙。感谢您成为使 Stack Overflow 对所有人如此有用的人!

0 投票
4 回答
6653 浏览

c++ - C++ 中的获取进程名称

我有一个带有打击细节的功能。

类型定义部分

/// 获取进程名称函数

我想在下面的函数中使用这个函数

当我调用函数GetProcessName时,这必须返回进程名称,但它???总是。我直接通过PID调用这个函数,例如GetProcessName(2018,szProcessName,MAX_PATH);。例如,2018 是一个 pid,它可以工作。我不知道为什么 HandleToULong(hProcess) 不起作用。我hProcess现在肯定是手柄类型我怎么解决这个问题?

0 投票
1 回答
541 浏览

c++ - C++ 中 OpenProcess 的 Vista/7 编译和 XP/2000 执行问题

我一直在使用具有 PROCESS_ALL_ACCESS 权限的 OpenProcess 来执行以下功能: -EnumProcessModules
-GetModuleFileNameEx
-ReadProcessMemory
-WriteProcessMemory
在 Windows Vista/7 上运行良好。但是,在 Windows XP/2000 中,它不会使用 PROCESS_ALL_ACCESS 打开进程,因为根据 MSDN 库:


在 Windows Server 2008 和 Windows Vista 上增加了 PROCESS_ALL_ACCESS 标志的大小。如果为 Windows Server 2008 和 Windows Vista 编译的应用程序在 Windows Server 2003 或 Windows XP/2000 上运行,则 PROCESS_ALL_ACCESS 标志太大并且指定此标志的函数会失败并显示 ERROR_ACCESS_DENIED。要避免此问题,请指定操作所需的最小访问权限集。如果必须使用 PROCESS_ALL_ACCESS,请将 _WIN32_WINNT 设置为应用程序所针对的最低操作系统(例如,#define _WIN32_WINNT _WIN32_WINNT_WINXP)

我不熟悉使用#define 设置最小操作系统。在为上面列出的功能尝试了几种替代访问权限的组合后,都没有运气,我问是否有人可以告诉我如何使用#define(上面的示例不起作用)和/或哪些进程权限来定义最小操作系统这些功能将需要。

非常感谢。

0 投票
1 回答
140 浏览

windows - 关于进程访问权限的问题

我得到了以下场景:

进程 A 创建进程 B,然后 B 尝试使用 OpenProcess() 获取 A 的句柄。我希望 B 拥有 A 的 PROCESS_ALL_ACCESS 权限。

我应该如何实现这一目标?

谢谢。

0 投票
3 回答
11247 浏览

winapi - OpenProcess 错误 87 参数无效

我正在尝试编写一个程序,该程序从当前目录中的 MinGW 分发执行 make.exe 并利用其 STDOUT 数据和退出代码。我有一个句柄来处理我从中获取数据的 STDOUT,使用 CreatePipe 创建。当我在该管道上收到 ERROR_HANDLE_EOF 时,我假设该进程已退出并尝试获取其退出代码:

我的代码适用于我测试的所有其他 MinGW 实用程序(如 pwd、ls 等),我得到 STDOUT 和退出代码没有问题。但是当我在 make 上尝试时,上面的代码显示以下消息:

“OpenProcess(2032)失败,错误:87”

我用谷歌搜索错误代码 87,它显示“参数无效”。我看不出像 2032 这样的正进程 ID 有什么无效的。有什么想法吗?

0 投票
1 回答
536 浏览

c++ - 从编译器运行和作为独立 exe 运行时,进程访问权限似乎有所不同

我正在为我正在编写的程序使用 WINAPI。程序拥有另一个进程的 ProcessId,需要获取它的句柄(以便以后能够终止它,并定期检查进程是否处于活动状态并使用 WaitForSingleObject 响应)。当我编译我的程序时(在 Embarcadero RAD Studio 2010 C++ Builder 中),它运行良好;该程序似乎成功地获得了句柄,并且通常按预期工作。但是,如果我从文件夹中将它作为独立的 exe 启动,它似乎无法正确获取句柄。我通过比较检查了它(Companion 是 HANDLE,Companion_PID 是 DWORD):

其中,前面几行,Companion 取自 Companion_PID 在以下代码中:

并且“GetProcessId(Companion)”结果为 0(这是 OpenProcess 未能返回正确句柄的好兆头。

当从编译器运行和作为独立 exe 运行时,这段代码的工作方式不同,我感到非常惊讶;我假设在第一种情况下,安全属性是从编译器本身继承的,但我想从在 WINAPI 和安全属性方面更有经验的人那里听到可能更好的解释。

小更新:是的,就像我想的那样,OpenProcess 导致错误 0x5 = ERROR_ACCESS_DENIED。