获取进程属性时,Psutil会为所有非用户拥有的进程引发AccessDenied

时间:2014-02-14 10:07:21

标签: python windows

我遇到了一个主要问题:我无法访问用户不拥有的(大多数)流程信息。 例如,以下内容:

for proc in psutil.process_iter():
    try:
        print proc.pid, proc.username

    except psutil.AccessDenied:
        print "denied"

打印:

0 NT AUTHORITY\SYSTEM
4 NT AUTHORITY\SYSTEM
428 denied
444 denied
632 my_user
648 denied
676 my_user
704 denied
748 denied
772 denied
804 denied
824 denied
832 denied
880 my_user
920 denied
988 denied
1052 denied
...

对于这些"否认"像get_cpu_times()这样的处理方法可以正常工作。

UPD:抱歉,我使用不同的属性和不同的打印件运行了很多次,我粘贴的输出来自不同的代码(打印username,而不是{ {1}})。但是,我希望,重点仍然是明确的......

1 个答案:

答案 0 :(得分:2)

看起来错误是在底层C代码中生成的。 我不知道whay GetProcessImageFileName()QueryFullProcessImageName()更受欢迎(因为后者返回路径,就像我们期望的那样,使用驱动器号/ UNC路径),但可能是因为呼叫失败了任何一个。

你可能不得不用the developers来解决这个问题。

来自 _psutil_mswindows.c (第502行):

if (GetProcessImageFileName(hProcess, &exe, nSize) == 0) {
    CloseHandle(hProcess);
    if (GetLastError() == ERROR_INVALID_PARAMETER) {
        // see https://code.google.com/p/psutil/issues/detail?id=414
        AccessDenied();
    }
    else {
        PyErr_SetFromWindowsErr(0);
    }
    return NULL;
}

修改
我试图对这些症状进行更多的调查,我还要多报告一下。在具有相对较新的Python 2(2.7.6)的或多或少完全修补的Win7 SP1 x64机器上,我无法访问psutil.Process类的这些成员:exe,{{1 },get_ionice()get_memory_maps()get_nice() / get_cwd()getcwd()get_open_files()name和{{1} }。

这个信息当然可供Windows机器的任何管理员用户使用,因此我不知道为什么psutil无法获取它,除非它是在The Wrong Way™(由Microsoft定义的永久移动目标)中进行的。 / p>