标签: openprocess

Windows Vista/Windows 7权限:SeDebugPrivilege和OpenProcess

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

上下文

我正在开发一个需要访问当前机器上其他进程内存的应用程序.显然,这需要管理员权限.它还要求SeDebugPrivilege(不,它不是拼写错误SetDebugPrivilege),我相信自己要正确获取,尽管我怀疑是否有更多的特权是不必要的,因此我的问题的原因.到目前为止,Code已成功应用于所有版本的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 …

c++ windows privileges uac openprocess

25
推荐指数
1
解决办法
2万
查看次数

当我以管理员身份运行时,为什么需要获得调试权限才能以最小权限使用 OpenProcess?

我的一个程序尝试调用OpenProcess我的另一个程序,这是一项服务。第一个程序以本地管理员帐户或管理员组的另一个成员身份运行,并且该服务以系统用户身份运行。

我发现至少在一种环境(但不是全部)中,调用会OpenProcess失败并显示ERROR_ACCESS_DENIED. 此外,我发现如果我用来AdjustTokenPrivileges获取SE_DEBUG_NAME特权,那么就会OpenProcess成功。我使用下面的程序重现了该行为。失败的环境运行的是Windows 8.1,但我不知道成功的系统正在运行什么。

程序请求的唯一权限是PROCESS_QUERY_LIMITED_INFORMATION(因为它最终调用QueryFullProcessImageName)。我读过的任何内容都没有表明需要调试权限,只有对于更多“侵入性”访问,例如PROCESS_VM_READor PROCESS_ALL_ACCESS,我对此不感兴趣。

我读过有关受保护进程的内容,尽管我所针对的服务未指定为受保护进程,但文档表明这PROCESS_QUERY_LIMITED_INFORMATION并不属于禁止为受保护进程授予的权限之一。

为什么原始调用会OpenProcess失败,为什么调试权限会产生影响?

#include <Windows.h>
#include <iostream>
#include <sstream>
#include <string>

int main(int argc, char* argv[])
{
    std::istringstream pid_s(argv[1]);
    DWORD pid;
    pid_s >> pid;
    bool debug = !!argv[2];

    if (debug) {
        TOKEN_PRIVILEGES NewState;
        NewState.PrivilegeCount = 1;
        if (!LookupPrivilegeValue(nullptr, SE_DEBUG_NAME, &NewState.Privileges[0].Luid)) {
            std::clog << "Could not acquire debug-privilege name: …
Run Code Online (Sandbox Code Playgroud)

c++ windows permissions openprocess

6
推荐指数
0
解决办法
1712
查看次数

OpenProcess:仅在Windows 8.1上访问被拒绝错误

我有一个调整SeDebugPrivilege的程序,然后开始迭代系统进程并为它们调用OpenProcess(并做其他事情,但现在并不重要).此外,程序当然也以管理员模式运行.在Windows XP和Windows 7上,它可以正常工作,但在Windows 8.1上,使用ERROR_ACCESS_DENIED(5)的以下系统进程的OpenProcess失败:smss.exe,csrss.exe,services.exe.正如我所知,使用SeDebugPrivilege,我应该能够打开这些进程并为它们检索句柄.有没有人有线索,只有在Windows 8.1上才会出现这种错误?

(无论如何,我对CreateToolhelp32Snapshot的相同进程有相同的错误)

windows winapi openprocess windows-8.1

5
推荐指数
1
解决办法
3347
查看次数

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

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

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

c++ openprocess visual-studio-2008 visual-c++

3
推荐指数
1
解决办法
8301
查看次数

OpenProcess 错误 87 无效参数

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

if(session->pid == 0) return;
HANDLE hp = OpenProcess(PROCESS_QUERY_INFORMATION |
            PROCESS_TERMINATE, TRUE, session->pid);
if(hp == NULL) {
    printf("OpenProcess(%i) failed, error: %i\n",
        session->pid, (int)GetLastError());
    return;
}
Run Code Online (Sandbox Code Playgroud)

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

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

我用谷歌搜索错误代码 87,它说“无效参数”。我不明白像 2032 这样的积极进程 ID 有什么可能无效。有什么想法吗?

winapi makefile openprocess getlasterror

2
推荐指数
1
解决办法
1万
查看次数