下面是我的程序,pid为进程ID,函数返回的是进程用户名,
我的程序把大部分的进程用户名给列出来了,但还有三分之一没获得用户名
请高手指点
CString CProcessManageDlg::GetProcessAuth(long pid)
{
SID_NAME_USE peUse;
HANDLE hp;
HANDLE hToken;
int isok;
CString strPathValid;
char buf[0x400];
char buf1[100];
char buf2[100];
DWORD dwNumBytesRet;
DWORD dwNumBytesRet1;
hp=OpenProcess(PROCESS_ALL_ACCESS, false, pid); 
 if(NULL==hp)
 MessageBox("duan");
//hp=OpenProcess(0x400,0,pid);
isok=OpenProcessToken(hp,0x20008,&hToken);
if(isok)
{
isok=GetTokenInformation(hToken,TokenUser,&buf,0x400,&dwNumBytesRet);
if(isok)
{
dwNumBytesRet=200;
dwNumBytesRet1=200;
isok=LookupAccountSid(NULL,(DWORD*)(*(DWORD*)buf),buf1,&dwNumBytesRet,buf2,&dwNumBytesRet1,&peUse);
if(isok)
{
strPathValid.Format("%s",buf1);
           
}
CloseHandle(hToken);
}
}
CloseHandle(hp); 
return strPathValid;
}

解决方案 »

  1.   

    看看都是哪些进程没有列举出来。 有啥共同点没?
    会不会是有些openprocess的时候 权限不够啊。查查在哪里出问题了就好办了。
      

  2.   

    确实是打开进程权限的问题,
    hp=OpenProcess(PROCESS_ALL_ACCESS, false, pid);
    hp经常为NULL,但是PROCESS_ALL_ACCESS不是已经是最大权限了吗
    郁闷
      

  3.   

    你理解错了。
    你那样子写 是想打开进程,并且拥有所有权限,呵呵。
    人家有的进程不想给你那么多权限,所以你就失败了
    btw:赶紧结贴啊 。 等你加分呢 我可是新手。hoho
      

  4.   

    看看这里
    http://blog.csdn.net/chenhui530/archive/2007/12/10/1928399.aspx
      

  5.   

       那用什么方法才能获得相应的权限呢,为什么WINDOWS 自带的任务管理器都能获得呢
    应该有别的方法去提升相应的权限啊!在线等
      

  6.   

    把PROCESS_ALL_ACCESS改成PROCESS_QUERY_INFORMATION试试,6楼说的也有道理
      

  7.   

    我这有收藏某人发的win2000任务管理器的源码,要得来俺邮箱取: [email protected]
      

  8.   

    任务管理器是通过native函数 NtQuerySystemInformation 查看进程的